当前位置:文档之家› 教你用STM32一步一步点亮led灯

教你用STM32一步一步点亮led灯

STM32之一步一步点亮led (2011-05-09 19:40)标签: stm32led MDK 入门分类:stm32入手stm32以来,一直想快速上手,所以在各大论坛闲逛,各个达人的blog 上学习,正所谓欲速则不达,心急是吃不了热豆腐的!有木有最终决定使用st官网的库开发,据大侠们写道使用库可以快速上手,貌似的确如此,一个个教程写的那么好,直接拿过来用就是了。

可是那么多个库,聪明的你请告诉到底选择哪一个啊My God!实话实说,我被这些库折腾了个够!好吧,我最后还是承认最后用的是的库,是很方便!切入正题,点亮LED。

硬件:红牛开发板,STM32F103ZET6(144封装).软件:RealView MDKstm32固件库:附上自己整理后的库:根据官网库自己整理了下,新建了工程模板如下图:(主要参考文章《在Keil MDK+环境下使用STM32 库.pdf》)在KeilMDK+环境下使用库.pdf入图所示:新建一个目录01_ProLed,建议放在英文路径下,避免不必要的麻烦。

将上面的库解压到此目录,再新建一个project目录,存放工程。

说明:CMSIS:最底层接口。

StartUp:系统启动文件。

StdPeriph_Lib:stm32外围设备驱动文件。

Project:工程文件。

User:用户文件。

新建工程步骤:此处略去300字。

简单说明:该文件是内核访问层的源文件和头文件,查看其中的代码多半是使用汇编语言编写的。

在线不甚了解。

--摘自《在Keil MDK+环境下使用STM32 库》该文件是外设访问层的头文件,该文件是最重要的头文件之一。

就像51里面的一样。

例如定义了 CPU是哪种容量的 CPU,中断向量等等。

除了这些该头文件还定义了和外设寄存器相关的结构体,例如:1.typedef struct2.{3.__IO uint32_t CR;4.__IO uint32_t CFGR;5.__IO uint32_t CIR;6.__IO uint32_t APB2RSTR;7.__IO uint32_t APB1RSTR;8.__IO uint32_t AHBENR;9.__IO uint32_t APB2ENR;10.__IO uint32_t APB1ENR;11.__IO uint32_t BDCR;12.__IO uint32_t CSR;13.14.#ifdef STM32F10X_CL15.__IO uint32_t AHBRSTR;16.__IO uint32_t CFGR2;17.#endif /* STM32F10X_CL */18.19.#if defined (STM32F10X_LD_VL)|| defined (STM32F10X_MD_VL)||defined (STM32F10X_HD_VL)20.uint32_t RESERVED0;21.__IO uint32_t CFGR2;22.#endif /*STM32F10X_LD_VL ||STM32F10X_MD_VL ||STM32F10X_HD_VL */23.} RCC_TypeDef;包含了那么多寄存器的定义,那么在应用文件中(例如自己编写的 main 源文件)只需要包含即可,而不是以前固件库的需要包含这个头文件。

--摘自《在Keil MDK+环境下使用STM32 库》该头文件也可以称为外设访问层的头文件和源文件。

在该文件中可以定义系统的时钟频率,定义低速时钟总线和高速时钟总线的频率,其中最关键的函数就是 SystemInit()了,这个后面会详细介绍。

总之这两个文件是新固件库的重点,有了它粮也大大简化了使用 stm32的初始化工作。

--摘自《在Keil MDK+环境下使用STM32 库》这个文件和 V2 版本的库的内容是一样的,需要使用哪些外设就取消哪些外设的注释。

例如需要使用 GPIO功能,但不使用 SPI功能,就可以这样操作。

--摘自《在Keil MDK+环境下使用STM32 库》1.#include""2./*#include""*/这个文件就不用多说了,自己编写。

--摘自《在Keil MDK+环境下使用STM32 库》这两个文件包含了 stm32中断函数,在源文件和头文件中并没有把所有的中断入口函数都写出来,而只写了 ARM内核的几个异常中断,其他的中断函数需要用户自己编写。

--摘自《在Keil MDK+环境下使用STM32 库》OK,开始写代码了。

由于的库在启动的时候已经设置好时钟了(将在后面有讲述),所以我们只需设置好对应的GPIO即可。

查看硬件连接:来点亮PF6.新建与,添加到User Code下面。

1.#ifndef _LED_H_2.#define _LED_H_3.4.void Delay(uint32_t times);5.void LedInit(void);6.7.#endif1.#include ""2.3./************************************************************************4.5.*函数名:LedInit(void)6.7.*描述:8.9.*输入:无10.11.*输出:无12.13.*返回:无14.15.************************************************************************/16.17.void LedInit(void)18.{19.GPIO_InitTypeDef GPIO_InitStructure;20.21./*初始化 GPIOF的 Pin_6为推挽输出*/22.=GPIO_Pin_6;23.=GPIO_Mode_Out_PP;24.=GPIO_Speed_50MHz;25.GPIO_Init(GPIOF,&GPIO_InitStructure);26.27.}28.29./************************************************************************30.31.*函数名:Delay(uint32_t times)32.33.*描述:延时函数34.35.*输入:uint32_t times36.37.*输出:无38.39.*返回:无40.41.************************************************************************/42.void Delay(uint32_t times)43.{44.while(times--)46. uint32_t i;47.for(i=0; i<0xffff; i++)48.;49.}50.}在中加入led初始化与点亮关闭即可。

1./*!< At this stage the microcontroller clock setting is alreadyconfigured,2.this is done through SystemInit()function which iscalled from startup3.file before to branch to application main.4.To reconfigure the default setting of SystemInit()function, refer to5. file6.*/7.8./* Add your application code here9.*/10.11./*初始化 GPIOF时钟*/12.RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);13.14.LedInit();15.16./* Infinite loop*/17.while(1)19./*关闭 LED1*/20.GPIO_SetBits(GPIOF,GPIO_Pin_6);21./*延时*/22.Delay(50);23./*点亮 LED1*/24.GPIO_ResetBits(GPIOF,GPIO_Pin_6);25./*延时*/26.Delay(50);27.}认真学习下这段代码,其实也非常简单,参考自《在Keil MDK+环境下使用STM32 库》。

我想请大家注意的是前面的一段英文注释,这段英文注释什么意思呢。

“在运行 main 函数之前,系统时钟已经完成初始化工作,在main函数之前,通过调用启动代码运行了 SystemInit函数,而这个函数位于”。

根据文中的提示我们回到看看 SystemInit如何初始化系统的。

在的开头便定义了系统的时钟频率,从下面的这段代码可以看出系统的频率被定义为 72MHZ,这也是绝大多数 STM32运行时的频率。

1.#if defined (STM32F10X_LD_VL)||(defined STM32F10X_MD_VL)||(defined STM32F10X_HD_VL)2./* #define SYSCLK_FREQ_HSE HSE_VALUE */3.#define SYSCLK_FREQ_24MHz4.#else5./* #define SYSCLK_FREQ_HSE HSE_VALUE */6./* #define SYSCLK_FREQ_24MHz */7./* #define SYSCLK_FREQ_36MHz */8./* #define SYSCLK_FREQ_48MHz */9./* #define SYSCLK_FREQ_56MHz */10.#define SYSCLK_FREQ_72MHz11.#endif紧接着根据这个宏定义程序试图把系统时钟初始化为 72MHz,代码有点冗长,这里就不一一列出。

在SystemInit 函数中,调用了 SetSysClock 函数,如果设定时钟的频率为 72MHZ 则 SetSysCloc 调用SetSysClockTo72函数,该函数和 V2 版本固件库中的各范例中的RCC_Configuration很相似,主要完成把外部时钟 9 倍频后分配给系统时钟,APB1 时钟和 APB2又由系统时钟分频获得。

关键代码如下:1./* HCLK = SYSCLK */2.RCC->CFGR |=(uint32_t)RCC_CFGR_HPRE_DIV1;3.4./* PCLK2 = HCLK */5.RCC->CFGR |=(uint32_t)RCC_CFGR_PPRE2_DIV1;6.7./* PCLK1 = HCLK */8.RCC->CFGR |=(uint32_t)RCC_CFGR_PPRE1_DIV2;从上面的分析可以看出,SystemInit 并不需要用户调用,启动代码会自动执行,这样相当于少了一个 RCC_Configuration 函数的绝大多数内容。

相关主题