教你用STM32一步一步点亮led灯.docx
- 文档编号:25892549
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:12
- 大小:270.71KB
教你用STM32一步一步点亮led灯.docx
《教你用STM32一步一步点亮led灯.docx》由会员分享,可在线阅读,更多相关《教你用STM32一步一步点亮led灯.docx(12页珍藏版)》请在冰豆网上搜索。
教你用STM32一步一步点亮led灯
STM32之一步一步点亮led(2011-05-0919:
40)
标签:
stm32 led MDK 入门 分类:
stm32
入手stm32以来,一直想快速上手,所以在各大论坛闲逛,各个达人的blog上学习,正所谓欲速则不达,心急是吃不了热豆腐的!
有木有
最终决定使用st官网的库开发,据大侠们写道使用库可以快速上手,貌似的确如此,一个个教程写的那么好,直接拿过来用就是了。
可是那么多个库,聪明的你请告诉到底选择哪一个啊MyGod!
实话实说,我被这些库折腾了个够!
好吧,我最后还是承认最后用的是的库,是很方便!
切入正题,点亮LED。
硬件:
红牛开发板,STM32F103ZET6(144封装).
软件:
RealViewMDK
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.typedefstruct
2.{
3. __IOuint32_tCR;
4. __IOuint32_tCFGR;
5. __IOuint32_tCIR;
6. __IOuint32_tAPB2RSTR;
7. __IOuint32_tAPB1RSTR;
8. __IOuint32_tAHBENR;
9. __IOuint32_tAPB2ENR;
10. __IOuint32_tAPB1ENR;
11. __IOuint32_tBDCR;
12. __IOuint32_tCSR;
13.
14.#ifdefSTM32F10X_CL
15. __IOuint32_tAHBRSTR;
16. __IOuint32_tCFGR2;
17.#endif/*STM32F10X_CL*/
18.
19.#ifdefined(STM32F10X_LD_VL)||defined(STM32F10X_MD_VL)||defined(STM32F10X_HD_VL)
20. uint32_tRESERVED0;
21. __IOuint32_tCFGR2;
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.
新建与,添加到UserCode下面。
1.#ifndef_LED_H_
2.#define_LED_H_
3.
4.voidDelay(uint32_ttimes);
5.voidLedInit(void);
6.
7.#endif
1.#include""
2.
3./************************************************************************
4.
5.*函数名:
LedInit(void)
6.
7.*描述:
8.
9.*输入:
无
10.
11.*输出:
无
12.
13.*返回:
无
14.
15.************************************************************************/
16.
17.voidLedInit(void)
18.{
19. GPIO_InitTypeDefGPIO_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_ttimes)
32.
33.*描述:
延时函数
34.
35.*输入:
uint32_ttimes
36.
37.*输出:
无
38.
39.*返回:
无
40.
41.************************************************************************/
42.voidDelay(uint32_ttimes)
43.{
44. while(times--)
45. {
46. uint32_ti;
47. for(i=0;i<0xffff;i++)
48. ;
49. }
50.}
在中加入led初始化与点亮关闭即可。
1./*!
2. thisisdonethroughSystemInit()functionwhichiscalledfromstartup 3. filebeforetobranchtoapplicationmain. 4. ToreconfigurethedefaultsettingofSystemInit()function,referto 5. file 6. */ 7. 8. /*Addyourapplicationcodehere 9. */ 10. 11. /*初始化GPIOF时钟*/ 12. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE); 13. 14. LedInit(); 15. 16. /*Infiniteloop*/ 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 库》。 我想请大家注意的是前面的一段英文注释,这段英文注释什么意思呢。 “在运行main函数之前,系统时钟已经完成初始化工作,在main函数之前,通过调用启动代码运行了SystemInit函数,而这个函数位于”。 根据文中的提示我们回到看看SystemInit如何初始化系统的。 在的开头便定义了系统的时钟频率,从下面的这段代码可以看出系统的频率被定 义为72MHZ,这也是绝大多数STM32运行时的频率。 1.#ifdefined(STM32F10X_LD_VL)||(definedSTM32F10X_MD_VL)||(definedSTM32F10X_HD_VL) 2./*#defineSYSCLK_FREQ_HSEHSE_VALUE*/ 3. #defineSYSCLK_FREQ_24MHz 4.#else 5./*#defineSYSCLK_FREQ_HSEHSE_VALUE*/ 6./*#defineSYSCLK_FREQ_24MHz*/ 7./*#defineSYSCLK_FREQ_36MHz*/ 8./*#defineSYSCLK_FREQ_48MHz*/ 9./*#defineSYSCLK_FREQ_56MHz*/ 10.#defineSYSCLK_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目录的都加进来,还有一点说明,在工程中是不需要加载头文件的,编译器会根据设置自动到相应目录下查找,链接。 有图有真相: 源码: 另: 由于使用了官网的库,所以很多时候需要在工程中查找文件或者是关键字,这个时候,可以用SourceInsight工具来辅助阅读代码,它的Lookupreference很好使。 可以在project目录下再建一个目录SourceInsight,比较麻烦,但是实在! 我的更多文章 如果你不逼自己一把,你根本不知道自己有多优秀(2011-07-0315: 58: 34) 移植(2011-07-0218: 27: 27) 移植到mini2440(2011-07-0212: 14: 13) 常用文件重定向命令(2011-05-3019: 28: 02) 努力赚钱,是为了不让自己的爱情受到别人金钱的考验(2011-05-2818: 10: 56)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32 一步一步 点亮 led