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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

硬件:红牛开发板,STM32F103ZET6(144封装).
软件:RealView MDK
stm32固件库:附上自己整理后的库:
根据官网库自己整理了下,新建了工程模板如下图:(主要参考文章《在
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 struct
2.{
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_CL
15.__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.#endif
1.#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 times
36.
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 already
configured,
2.this is done through SystemInit()function which is
called from startup
3.file before to branch to application main.
4.To reconfigure the default setting of SystemInit()
function, refer to
5. file
6.*/
7.
8./* Add your application code here
9.*/
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_24MHz
4.#else
5./* #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_72MHz
11.#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 函数的绝大多数内容。

请大家注意是绝大多数内容而不是全部,但是请大家格外
注意使用到的外设还是要第一时间使得该外设的时钟,像这样的一句千万不要忘了
/*初始化 GPIOF时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
---------------------------------------------------------------------------------------------
如果没有设置好可能编译会出错:
1.设置宏。

参考另一篇文章:&do=blog&id=296932
2.设置头文件目录:但凡有.h目录的都加进来,还有一点说明,在工程中是不需要加载头文件的,编译器会根据设置自动到相应目录下查找,链接。

有图有真相:
源码:
另:由于使用了官网的库,所以很多时候需要在工程中查找文件或者是关键字,这个时候,可以用Source Insight工具来辅助阅读代码,它的Lookup reference 很好使。

可以在project目录下再建一个目录Source Insight,比较麻烦,但是
实在!
我的更多文章
如果你不逼自己一把,你根本不知道自己有多优秀 (2011-07-03 15:58:34)
移植 (2011-07-02 18:27:27)
移植到mini2440 (2011-07-02 12:14:13)
常用文件重定向命令 (2011-05-30 19:28:02)
努力赚钱,是为了不让自己的爱情受到别人金钱的考验 (2011-05-28 18:10:56)。

相关文档
最新文档