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

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

教你⽤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.12
stm32固件库: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 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 源⽂件)只需要包含
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.h
1.#ifndef _LED_H_
2.#define _LED_H_
3.
4.void Delay(uint32_t times);
5.void LedInit(void);
6.
7.#endif
led.c
1.#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 times
36.
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 already configured,
2. this is done through SystemInit()function which is called
from startup
3. file (startup_stm32f10x_xx.s) before to branch to
application main.
4.To reconfigure the default setting of SystemInit()function,
refer to
5. system_stm32f10x.c 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)
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 24000000
4.#else
5./* #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 72000000
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.设置宏。

参考另⼀篇⽂章:
/doc/3536f6c408a1284ac85043e1.html /space.php?uid=20788517&do=blog&id=296932 2.设置头⽂件⽬录:但凡有.h⽬录的都加进来,还有⼀点说明,在⼯程中是不
需要加载头⽂件的,编译器会根据设置⾃动到相应⽬录下查找,链接。

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

可以在project⽬录下再建⼀个⽬录Source Insight,⽐较⿇烦,但是
实在!
我的更多⽂章
如果你不逼⾃⼰⼀把,你根本不知道⾃⼰有多优秀 (2011-07-03 15:58:34)
移植linux-2.6.38.8 (2011-07-02 18:27:27)
移植u-boot-2010.06到mini2440 (2011-07-02 12:14:13)
常⽤⽂件重定向命令 (2011-05-30 19:28:02)
努⼒赚钱,是为了不让⾃⼰的爱情受到别⼈⾦钱的考验 (2011-05-28 18:10:56)。

相关文档
最新文档