一。库函数点灯
为了使工程更加有条理,我们把 LED 灯控制相关的代码独立分开存储,方便以后移植。
在“工程模板”之上新建“led.c”及“led.h”文件,记得在keil软件中包含文件夹路径
编程要点
\1. 使能 GPIO 端口时钟;
\2. 初始化 GPIO 目标引脚为推挽输出模式;
\3. 编写简单测试程序,控制 GPIO 引脚输出高、低电平。
代码分析:
LED 灯引脚宏定义
控制 LED 灯亮灭状态的宏定义
LED GPIO 初始化函数
LED GPIO 初始化函数的整个函数与“构建库函数雏形”章节中的类似,主要区别是硬件相关的部分使用宏来
代替,初始化 GPIO 端口时钟时也采用了 STM32 库函数,函数执行流程如下:
(1) 使用 GPIO_InitTypeDef 定义 GPIO 初始化结构体变量,以便下面用于存储 GPIO 配置。
(2) 调用库函数 RCC_APB2PeriphClockCmd 来使能 LED 灯的 GPIO 端口时钟该函数有两个输入
(3) 向 GPIO 初始化结构体赋值,把引脚初始化成推挽输出模式,其中的 GPIO_Pin 使用宏
“LEDx_GPIO_PIN”来赋值,使函数的实现方便移植。
(4) 使用以上初始化结构体的配置,调用 GPIO_Init 函数向寄存器写入参数,完成 GPIO 的
初始化,这里的 GPIO 端口使用“LEDx_GPIO_PORT”宏来赋值,也是为了程序移植方便。
(5) 使用同样的初始化结构体,只修改控制的引脚和端口,初始化其它 LED 灯使用的GPIO 引脚。
(6) 使用宏控制 灯默认关闭。
SystemInit 函数去哪了?
在前面章节中我们自己建工程的时候需要定义一个 SystemInit 空函数,但是在这个用
STM32 标准库的工程却没有这样做,SystemInit 函数去哪了呢?
这个函数在 STM32 标准库的“system_stm32f10x.c”文件中定义了,而我们的工程已
经包含该文件。标准库中的 SystemInit 函数把 STM32 芯片的系统时钟设置成了 72MHz,
即此时 AHB 时钟频率为 72MHz,APB2 为 72MHz,APB1 为 36MHz。当 STM32 芯片上电
后,执行启动文件中的指令后,会调用该函数,设置系统时钟为以上状态。
#ifndef __LED_H//C文件需要add,头文件在软件设置好路径就不要自己add #define __LED_H #include "stm32f10x.h" #define LED0_GPIO_PIN5 GPIO_Pin_0 #define LED0_GPIO_PORT GPIOB #define LED0_GPIO_CLK RCC_APB2Periph_GPIOB #define ON 1 #define OFF 0 // 续航符号后面不能加任何东西,包括空格 #define LED0(a) if(a)\ GPIO_ResetBits(LED0_GPIO_PORT, LED0_GPIO_PIN5);\ else GPIO_SetBits(LED0_GPIO_PORT, LED0_GPIO_PIN5); void LED0_GPIO_Config(void); #endif
#include "led.h"//每新建一个头文件都需要指定路径 //外设的功能框图告诉你需要配置这个外设的哪些寄存器与实现原理 //功能框图非常重要 void LED0_GPIO_Config(void){ GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = LED0_GPIO_PIN5; GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; RCC_APB2PeriphClockCmd(LED0_GPIO_CLK, ENABLE ); GPIO_Init(LED0_GPIO_PORT,&GPIO_InitStruct); }
#include "stm32f10x.h" #include "led.h" //实现LED0闪烁 void delay(uint32_t count){ for(;count!=0;count--); } int main(void) { // 来到这里的时候,系统的时钟已经被配置成72M。 LED0_GPIO_Config(); while (1){ //GPIO_SetBits(LED0_GPIO_PORT, LED0_GPIO_PIN5); LED0(ON); delay(0xfffff); //GPIO_ResetBits(LED0_GPIO_PORT, LED0_GPIO_PIN5); LED0(OFF); } }