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

用STM32一步一步点亮led灯

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

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

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

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

说明:CMSIS:最底层接口。

StartUp:系统启动文件。

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

Project:工程文件。

User:用户文件。

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

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

在线不甚了解。

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

就像51里面的reg51.h一样。

例如定义了 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 源文件)只需要包含stm32f10x.h即可,而不是以前固件库的需要包含 stm32f10x_conf.h这个头文件。

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

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

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

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

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

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

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

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

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

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

led.h1.#ifndef _LED_H_2.#define _LED_H_3.4.void Delay(uint32_t times);5.void LedInit(void);6.7.#endifled.c1.#include "stm32f10x.h"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_InitStructure.GPIO_Pin=GPIO_Pin_6;23. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;24. GPIO_InitStructure.GPIO_Speed=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--)45.{46. uint32_t i;47.for(i=0; i<0xffff; i++)48.;49.}50.}在main.c中加入led初始化与点亮关闭即可。

1./*!< At this stage the microcontroller clock setting is alreadyconfigured,2. this is done through SystemInit()function which is calledfrom startup3. file (startup_stm32f10x_xx.s) before to branch toapplication main.4.To reconfigure the default setting of SystemInit()function,refer to5. system_stm32f10x.c 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)18.{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 V3.4库》。

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

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

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

在 system_stm32f10x.c 的开头便定义了系统的时钟频率,从下面的这段代码可以看出系统的频率被定义为 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_24MHz 240000004.#else5./* #define SYSCLK_FREQ_HSE HSE_VALUE */6./* #define SYSCLK_FREQ_24MHz 24000000 */7./* #define SYSCLK_FREQ_36MHz 36000000 */8./* #define SYSCLK_FREQ_48MHz 48000000 */9./* #define SYSCLK_FREQ_56MHz 56000000 */10.#define SYSCLK_FREQ_72MHz 7200000011.#endif紧接着根据这个宏定义程序试图把系统时钟初始化为 72MHz,代码有点冗长,这里就不一一列出。

相关主题