当前位置:
搜档网 › 用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.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.设置宏。参考另一篇文章:
https://www.sodocs.net/doc/2a13728541.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)
点亮LED灯
实验一点亮你的LED灯 一、实验目的 1.学会使用51单片机开发的两大软件:编程软件Keil μVision4(简称Keil C51)和 下载软件STC-ISP。 2.理解单片机最小系统、单片机外围电路、Flash、RAM和SFR概念。 3.了解普通发光二级管的参数,掌握限流电阻的计算方法。 二、实验内容 通过对单片机编程来实现LED小灯的亮和灭。 三、实验参考原理 3.1 单片机内部资源 1)Flash 程序存储空间 2)RAM 数据存储空间 3)SFR 特殊功能寄存器 3.2 单片机最小系统 单片机最小系统的三要素是电源、晶振、和复位电路。 1)电源 目前主流单片机分为5V和3.3V这两个标准,本实验中的STC89C52为5V供电系统,开发板是使用USB口输出的5v直流直接供电的。从上图可以看到,供电 电路在40引脚和20引脚,40引脚接的是+5V,通常也成为VCC或VDD,代表的 是电源正极,20引脚接的GND,代表的是电源负极。 2)晶振 晶振,又叫晶体振荡器,它起到的作用是为单片机提供基准时钟信号,单片机
内部所有的工作都是以这个时钟信号为步调基准来进行工作的。SRC89C52单片机的18号引脚和19号引脚是晶振引脚,接了一个11.0592MHZ的晶振(每秒振荡11059200次),外加两个20pf的电容,电容的作用是帮助晶振起振,并维持震荡信号的稳定。 3)复位电路 复位电路接到了单片机的9号引脚RST复位引脚上。单片机复位一般分为3种情况:上电复位、手动复位和程序自动复位。 总之,一个单片机具备这三个条件就可以运行下载的程序,开发板上其它的比如LED小灯、数码管、液晶等设备都是属于单片机的外设设备,最终用户想要的功能,就是通过对单片机编程来控制各种各样的外设实现的。 3.3 LED小灯 LED,即发光二极管,俗称LED小灯。种类很多,KST使用的是普通的贴片发光二极管。这种发光二极管的正向导通电压是1.8~2.2V之间,工作电流一般在1~20mA之间。 上图是开发板上的USB接口电路,通过USB线,计算机给开发板供电和下载程序以及实现计算机和开发板之间的通信。从图可以看出USB 有6个接口,其中2,3引脚是数据通信引脚,1,4是电源引脚,1是VCC正电源,4是GND即地线。5,6是外壳,直接接到了GND上。 现在主要来讲1,4引脚,1引脚通过F1(自恢复保险丝,作用是当后级电路发生短路时,八年四自动切断电路,保护开发板及计算机的USB口,当电路正常后,保险丝会恢复畅通,正常工作)接到右侧,在正常情况下保险丝可看为导线,因此左右两边都是USB电源+5V。 右侧有两条支路,第一条是在+5V和GND接了一个100μF的电容,电容是隔离直流的,所以这条支路是没有电流的;第二条支路,发光二极管,和普通二级管一样,这个二极管也有阴极和阳极,也称负极和正极,正向导通,方向接对了才会有电流通过,让LED发光,LED1自身的压降大概是2V,那么下方的R34这个电阻上承受的电压就是3V,如果要求电流范围为1~20mA,根据欧姆定律,就可以算出R34的取值范围是150~3kΩ。这个电阻大小的变化,直接限制这条电路上电流的大小,因为这个电阻通常称为“限流电阻”。图中的R34为1KΩ,这条电路的电流大小就可以轻松算出来,3V/1000Ω=3 mA,这个发光二级管的作用只是电源指示灯,使用USB线将开发板和计算机连起来,这个灯就亮了。
嵌入式点亮一个LED灯的程序
飞凌OK6410开发板(裸板)第一个点亮LED灯程序,主要的C程序,完整程序请下载附件。 #define rGPMCON (*(volatile unsigned *)(0x7F008820)) #define rGPMDAT (*(volatile unsigned *)(0x7F008824)) #define rGPMPUD (*(volatile unsigned *)(0x7F008828)) void msDelay(int time) { volatile unsigned int i,j; for(i = 0; i < 2000000; i++) for(j=0; j