STM32-Project12:(IO输出)使用固件库点亮 LED;

这篇博客介绍了如何在STM32项目中创建并使用LED控制的库函数,包括使能GPIO时钟、配置引脚为推挽输出模式。通过LED0_GPIO_Config函数初始化GPIO,并提供了LED0的宏定义以方便控制灯的开关。同时,解释了SystemInit函数在STM32标准库中的作用,即设置系统时钟。在示例代码中展示了如何实现LED0的闪烁功能。
摘要由CSDN通过智能技术生成

一。库函数点灯

为了使工程更加有条理,我们把 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);
    }
}
​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dpq666dpq666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值