学习目标:
- 掌握 STM32 基础知识
STM32单片机学习总结之------点灯
学习内容:
点灯需要开GPIO外设时钟
1、配置系统时钟:在开启外设时钟之前,我们首先要配置好系统时钟SYSCLK, 为配置SYSCLK,要设置一系列的时钟来源、倍频、分频等控制参数。这些工作由SystemInit()库函数完成。这个函数的定义在system_stm32f10x.c文件之中。它的作用是设置系统时钟SYSCLK。函数的执行流程是先将与配置时钟相关的寄存器都复位为默认值,复位寄存器后,调用了另外一个函数SetSysClock(),定义如下:
从SetSysClock()代码可以知道,它是根据设置的条件编译宏来进行不同的时钟配置的。
在system_stm32f10x.c文件的开头,已经默认有如下的条件编译定义:
在第10行定义了SYSCLK_FREQ_72MHz条件编译的标识符,所以在SetSysClock()函数中将调用SetSysClockTo72()函数把芯片的系统时钟SYSCLK设置为72MHz,前提是输入的外部时钟源HSE的振荡频率要为8MHz。
2、外设时钟一般会在初始化外设的时候设置为开启(根据设计的产品功耗要求,也可以在使用的时候才打开) 。开启和关闭外设时钟也有封装好的库函数 RCC_APB2PeriphClockCmd()。
调用的时候需要向它输入两个参数,一个参数为将要控制的,挂载在
APB2总线上的外设时钟,第二个参数为选择要开启还是关闭该时钟。比如开GPIOC时钟,其设备挂载在APB2总线上。
如此便开启了外设时钟。开完时钟之后就要点灯了
注意:如果我们用到了I/O的引脚复用功能,还要开启其复用功能时钟。
如GPIOC的Pin4还可以作为ADC1的输入引脚,现在我们把它作为ADC1来使用**,除了开启GPIOC时钟外,还要开启ADC1的时钟**:
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1, ENABLE);
这里注意要开两个外设时钟。
3、选好引脚,配置了其功能及开启了相应的时钟,我们可以终于可以正式控制I/O口的电平高低了,从而实现控制LED灯的亮与灭。
还是调用库函数,用GPIO_SetBits()控制输出高电平,用GPIO_ResetBits()控制输出低电平。
输入参数有两个,第一个为将要控制的GPIO端口:GPIOA„„GPIOG,第二个为要控制的引脚号:Pin0~Pin15。
4、看如下LED.h文件定义
其中的反斜杠符号**“ \”叫做续行符**,用来连接上下行代码,表示下面一行代码属于“\”所在的代码行,这在ST库经常出现。“\”的语法要求极其严格,在它的后面不能有空格、注释等一切“杂物”。
5、写好了led.c、led.h两个文件,这是控制LED灯的驱动程序。
接下来,利用写好的驱动文件,在main文件中编写应用程序代码了。
延时函数
后面还是声明了一个简单的延时函数,其定义在main文件的末尾。它是利用for循环实现的,用作短暂的,对精度要求不高的延时,延时的时间与输入的参数并无准确的计算公式,请不要深究。需要精准的延时的时候,我们会采用定时器来精确控制。
学习总结:
-----在芯片上电(复位)后,经过启动文件中SystemInit()函数配置好了时钟,就进入main函数了。接下来,从main函数开始分析代码的执行。
首先,调用了在led.c文件编写好的LED_GPIO_Config()函数,完成了对GPIOC的Pin口的初始化。紧接着就在while死循环里不断执行在led.h文件中编写的带参宏代码,并加上延时函数,使各盏LED轮流亮灭。当然,在LED控制的部分。
如果不习惯带参宏的方式,也可以直接使用GPIO_SetBits()和GPIO_ResetBits()函数实现对LED的控制。