历史上的今天
返回首页

历史上的今天

今天是:2024年12月11日(星期三)

正在发生

2018年12月11日 | STM32_入门程序LED

2018-12-11 来源:eefocus

***********************************************************************************************************************************************************


开发板   :奋斗STM32


cpu         :STM32F103


开发环境:keil uVsion4


*************************************************************************************************************************************************************


前言:搞了两天,终于把开发环境搭建好了,以及编写了32的第一个入门程序,我们知道玩一个单片机开发板,做的第一件事就是点亮LED灯,因为之前玩过arm开发板,所以学习STM32也是按照这个思路进行的!因为网上有大量的参考资料感觉学习过程还是蛮顺利的!学习32有库开发和寄存器开发,因为库开发比较高效,所以


接下来的STM32学习之路都是按照库开发模式进行学习!


前期准备:


    1.  MDK安装(mkd453)


    2.J-LINK下载安装(Setup_JLinkARM_V410i.exe)


    3.J-LINK线 或 串口线(下载程序到开发板)


一.新建工程


(1)点击project->NEW uVision Project新建工程文件,文件名字任意取,将文件保存在我们自己设定的路径下。


(2)接下来的窗口是选择公司和芯片型号,我用的是ST公司的STM32F103VE,所以选择STM32F103VE,再点击OK。


 ( 3 ) 接下来问是否启动代码到工程文件,这里我是用的ST的库,则点击“否” (一般情况都是点击“否”)。


(4)此时工程创建成功,但是我们的工程没有任何文件接下来手动添加所需文件。


(5)将官方STM32官方库拷到我们设定的路径下的文件夹新建5个文件夹,USER,FWlib,CMSIS,Output,Listing


     *FWlib放\Libraries\STM32F10x_StdPeriph_Driver文件夹下的inc和src文件夹


     *USER放main.c stm32f10x_conf.h,stm32f10x_it.h和stm32f10x_it.c


     *CMSIS放\Libraries\CMSIS\CM3下的全部文件夹,


(6)回到工程中。在Target下选择ADD Group新建STARTCODE, USER, FElib, CMSIS,里面要放的的代码如图所示:


   


(7)设置参数output,Listing,c/c++,Debug,Utilities


 ( 8 )  Jlink下载设置


二,编写main.c


#include "stm32f10x.h"

 

GPIO_InitTypeDef GPIO_InitStructure;

#define LED2_ON GPIO_SetBits(GPIOD,GPIO_Pin_3) 

#define LED2_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_3)

 

void RCC_Configuration(void);

void LED_Config(void);

void Delay(__IO uint32_t nCount);

 

void LED_Config(void)

{

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOD,ENABLE);

    GPIO_InitStructure.GPIO_Pin= GPIO_Pin_3;

    GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP; 

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOD,&GPIO_InitStructure);  

}

 

int main(void)

{

    RCC_Configuration();

  LED_Config();

  while(1)

{   

                     LED2_ON;

            Delay(0xAFFFF);

             LED2_OFF;

            Delay(0xAFFFF);

  

                }

}

 

void Delay(__IO uint32_t ncount)

{

     for(;ncount != 0;ncount--);

}

 

void RCC_Configuration(void)

{

     SystemInit();

}


三.主程序编译连接调试


四.使用J-link下载到开发板上运行


点击“LOAD”


  

发现开发板上的LED灯成功闪烁。。。


五.main.c编程分析


首先我们我们想编程实现点亮LED,分为这么几步:


1.初始化结构体—GPIO_InitTypeDef类型


typedef struct

{

  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.

                                      This parameter can be any value of @ref GPIO_pins_define */

 

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.

                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

 

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.

                                      This parameter can be a value of @ref GPIOMode_TypeDef */

}GPIO_InitTypeDef;

2.初始化库函数—GPIO_Init()


void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

{

  uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;

  uint32_t tmpreg = 0x00, pinmask = 0x00;

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));

  assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));  

  

/*---------------------------- GPIO Mode Configuration -----------------------*/

  currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);

  if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)

  { 

    /* Check the parameters */

    assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));

    /* Output mode */

    currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;

  }

     ......

}


3.开启外设时钟

  

GPIO所使用的时钟PCLK2采用默认值,为72MHz,为了使能GPIOD引脚,通常我们是调用RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE)函数,如果想同时使能其他gpio引脚,就改函数的参数为相应的引脚。


void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));

  assert_param(IS_FUNCTIONAL_STATE(NewState));

  if (NewState != DISABLE)

  {

    RCC->APB2ENR |= RCC_APB2Periph;

  }

  else

  {

    RCC->APB2ENR &= ~RCC_APB2Periph;

  }

}

**************************************************************************************************************************************************


说明:开启外设时钟之前首先要配置好系统时钟SYSCLK,为配置好SYSCLK,要设置一系列的时钟来源,倍频,分频等控制参数,这些工作由SystemInit()库函数完成。当芯片被复位(包括上电复位)时,将开始运行startup_stm32f10x_hd.s汇编代码,这个汇编代码先是调用SystemInit(),在进入C语言中的“__main”函数执行,这是一个C标准库的初始化函数,执行这个函数之后最终跳转到用户文件中的“main”函数接口,开始运行主程序。


***************************************************************************************************************************************************


4.控制I/O输出高,低电平


(1)调用GPIO_SetBits()函数控制输出高电平。


void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_PIN(GPIO_Pin));

  

  GPIOx->BSRR = GPIO_Pin;

}

(2)调用GPIO_ResetBits()函数控制输出低电平。


void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_PIN(GPIO_Pin));

  

  GPIOx->BRR = GPIO_Pin;

}

5.填充GPIO_InitTypeDef结构体


GPIO_InitStructure.GPIO_Pin= GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


当然这要参考stm32开发板原理图:


根据这个原理图我们就可以改LED_Config(void),GPIO_SetBits(),GPIO_ResetBits()三个函数的配置!然后就可以点亮三个led灯了


推荐阅读

史海拾趣

艾迪沃德公司的发展小趣事
避免长时间超负荷使用仪器,以免对电源电路造成损坏。
Elma Electronic Inc公司的发展小趣事

Elma在美国和美洲拥有广泛的客户群,覆盖电信、工业控制、医疗电子、国防和航空航天等多个行业。其产品线包括外壳、背板、系统平台、机柜、高品质开关和编码器等多种零件,能够满足不同行业客户的多样化需求。这种跨行业的布局使得Elma能够在多个领域保持竞争力。

aconno公司的发展小趣事

aconno深知人才是企业发展的核心动力。因此,公司一直致力于打造一支高素质、专业化的团队。通过招聘优秀人才、提供专业培训、建立激励机制等一系列措施,aconno成功吸引和留住了一批业内精英。这些人才为公司的技术创新和市场拓展提供了有力支持,成为aconno发展壮大的重要保障。

Digitron公司的发展小趣事

为了进一步扩大市场份额,Digitron公司积极寻求与行业内外的企业建立战略合作关系。XXXX年,Digitron公司与一家全球知名的物流公司达成合作协议,为其提供定制化的温度监控解决方案。这一合作不仅为Digitron公司带来了可观的收入,还提高了其在物流行业的知名度。此外,Digitron公司还积极参加国际展会和论坛,与全球客户建立联系,拓展国际市场。

Digital Core Design公司的发展小趣事

面对版权问题的挑战和市场的变化,Core Design开始寻求变革。公司的创始人Jeremy Heath-Smith和Adrian Smith在《古墓丽影:黑暗天使》发行后不久就辞去了在Eidos和Core的职务,并创立了新的工作室Circle Studio。然而,这个新工作室最终也未能逃脱被市场淘汰的命运。在2006年6月,Circle Studio被Eidos彻底抛弃,并卖给了另一家公司Rebellion。虽然Core Design的名字被保留下来,但其实际的开发团队和运营已经发生了巨大的变化。在这个过程中,Core Design不得不面对现实,寻找新的发展机遇和方向。

以上这些故事展示了Core Design在电子行业中的发展历程,包括其初创时期的艰辛、成功时期的辉煌、挑战时期的困境以及变革时期的新生。这些故事都基于事实,旨在客观地呈现Core Design的历史和发展。

百蓉(ECE)公司的发展小趣事

在电子行业的激烈竞争中,百蓉(ECE)公司应运而生。创立初期,公司仅有几个热爱电子技术的年轻人,他们在一个小小的办公室里,凭借对电子技术的深厚兴趣和专业知识,开始研发新产品。那个时代,智能手机刚刚开始兴起,他们敏锐地捕捉到了触摸屏技术的巨大市场潜力。于是,他们投入大量时间和精力,研发出了一款高性能、低成本的触摸屏控制器,这一创新产品迅速在市场上获得了成功,为百蓉公司的发展奠定了坚实的基础。

问答坊 | AI 解惑

宽带无线:承诺与现实

信息技术是历史上最与众不同的技术,还有哪一个行业的技术能像它这样如此迅速和广泛地改变了整个世界?根本找不到,尤其当你想到无线电话和互联网连接的时候。在跨越新千年的这十年中,使用这些服务的人数正以令人目瞪口呆的速度迅猛增长。 …

查看全部问答>

vhdl中用if语句实现数据转换器

    下面的if语句显然不能实现数据类型转换器的功能.我想采用if语句实现数据类型转换器的功能,将输入的四位2进制数s4,s3, s2,s1转换为整数sel,应该怎么实现呢???       ENTITY mux41 IS      &n ...…

查看全部问答>

调用API如何刷新另一窗口的RECT

正在写一个SIP的程序。 遇到了这样一个困难。 首先在生成SIP软面板的时候,创建了一个窗口,得到句柄hwndsip。 我可以在这个面板上直接TextOut就输出了文本,直接InvalidateRect就可以将文本清除掉,在同一窗口下做这样的一系列操作都没什么问题 ...…

查看全部问答>

程序怎样变成电路地?

由于刚学,可能提的问题不是太有价值,但突然想到,困惑很长时间。我们现在做单片机实验,流程是这样:先在IDE里用汇编写出了源程序,然后编译成*.HEX,然后调试状态全速运行,如果对的话就能看结果了。我有点晕,这源文件变成1 0后怎样变成高低电 ...…

查看全部问答>

如何开发WINCE5.0 环境下的NDIS网络驱动

主要是如何初始化那个微端口驱动程序,具体操作是什么?我的PC安装了EVC 4SP4和PB 5.0,还需要怎么做才能开发NDIS网络驱动? 这个驱动程序最后是要写入S3C2440开发板上运行的…

查看全部问答>

MR16、PAR38、E27分别表示代表的含义

MR16:在 照明行业里指最大外径为2英寸的带多面反射罩的灯具,MR 是英文 Multifaceted (Mirror)Reflector 的缩写,意思是一种由多个反射面组合成的反射器,数字表示灯泡最大外形的尺寸,为1/8英寸的倍数。所以“16”就表示灯具的最大外径尺寸 ...…

查看全部问答>

SEED-DIM3517 功能够强大,不知道做台SMT资源够吗?

公司前几天上了台二手的SMT看了面的主板很老了,看这款板子配置很强,这只是个想法,我是做不到的。…

查看全部问答>

【设计工具】赛灵思FPGA PLL 动态重配置技巧

          本应用指南首先介绍了通过动态重配置端口 (DRP) 对Spartan-6 FPGA 锁相环(PLL) 的时钟输出频率、相移及占空比进行动态修改的方法。在阐述了内部DRP 控制寄存器的功能后,提供了一个通过状 ...…

查看全部问答>

寻uC-TCP/IP移植高手。

最近在做uC-TCP/IP在基于uCOS-II的TMS320F28335  DSP上的移植,有些疑问,不知道论坛里是否有人做过类似的移植,一起交流交流。…

查看全部问答>

SPWM处理问题

请教大家一个问题,我前两天在做单相全桥逆变,然后SPWM波是软件处理后,用149输出的一系列占空比不同的PWM, 为了检测软件处理的数据是正确的,别人建议我给输出的PWM波加一阶RC滤波,电容选104的,然后电阻随便取个几K(我用的是4.7K) 测电容 ...…

查看全部问答>