STM32——固件库点灯
1. 新建固件库工程文件1.1 找到一个固件库模板1.2 打开 KEIL5 新建工程1.3 添加相关文件1.4 手动添加其他文件路径进来
2. STM32固件库点灯2.1 在 User 底下创建 led 文件夹,led 文件夹创建 led.c .h 文件2.2 将 led.c 加入 USER 组2.3 添加 led.h 路径2.4 在 led.h 头文件中声明 LED_Init()函数(直接复制void LED_Init(void) + ;号)2.5 点灯开始2.5.1 使能APB2时钟2.5.2 配置结构体
注意:步骤一(使能APB2时钟)图片中函数 RCC_AHBPeriphClockCmd()函数复制错了,正确的应该为:RCC_APB2PeriphClockCmd()2.5.3 初始化GPIOC13
2.6 main 函数调用 初始化 LED_Init () 、 拉低电平 GPIO_ResetBits ()led.h、led.c 和 main.cled.cled.hmain.c
3. LED 闪烁4. 呼吸灯main.c
1. 新建固件库工程文件
1.1 找到一个固件库模板
![在这里插入图片描述](https://img-blog.csdnimg.cn/7379263039d6496c9ed86936de59e0d2.png#pic_center)
1.2 打开 KEIL5 新建工程
![在这里插入图片描述](https://img-blog.csdnimg.cn/0c50fb0b06c447b6aa064869dc2f5516.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/52666df687754a11bfde3bbc49af2807.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/9d08358b990c46f995f2a2e4260c652f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/e6790123c2e34e6093ae12ceb8141517.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_11,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/9ec8927238c34b3caf3a450332d05882.png#pic_center)
最终效果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/1a39688a5c674ff088db43222ea1bbf9.png#pic_center)
1.3 添加相关文件
STARTUP:添加Libraries——>CMSIS——>startup中的启动文件USER:添加固件库的User文件夹中的.c文件CMSIS:添加Libraries——>CMSIS文件夹中的.c文件DOC:添加固件库中Doc文件夹的readme.txtFWLIB:添加Libraries——>STM32F10x_StdPeriph_Driver文件夹中的.c文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/2ffe654949c446e79e64aa8228a464b1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_16,color_FFFFFF,t_70,g_se,x_16#pic_center)
最终效果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/49ba9f070f0b4871a01899a1220d437c.png#pic_center)
1.4 手动添加其他文件路径进来
打开stm32f0x.h文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/1fa357b5bdd348b0af1bdb0461d60a9c.png#pic_center)
Ctrl + F 查找 stm32f10x_conf
![在这里插入图片描述](https://img-blog.csdnimg.cn/1887a0c8d5de42a28167b896c45d683d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_17,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/14865edfdceb4ec2a347bb722116e7d3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_14,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/8d40352b9cbd42858638b3c7f89fcc58.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/ce32d11b1f1446e7b663c3ed0115ed01.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2. STM32固件库点灯
2.1 在 User 底下创建 led 文件夹,led 文件夹创建 led.c .h 文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/42477365d8ea4e7b84dbebe8ecf1c2e0.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/642adaa31b2041ae8aba1f090d132fa9.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.2 将 led.c 加入 USER 组
![在这里插入图片描述](https://img-blog.csdnimg.cn/83758d2a42864245beaf4de8a3c59599.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_17,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.3 添加 led.h 路径
![在这里插入图片描述](https://img-blog.csdnimg.cn/53d08ba8a0094e39889e2bdb9e8c62f7.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.4 在 led.h 头文件中声明 LED_Init()函数(直接复制void LED_Init(void) + ;号)
![在这里插入图片描述](https://img-blog.csdnimg.cn/1e0e041d5772403191a6ba6eb1a45456.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.5 点灯开始
2.5.1 使能APB2时钟
在 FWLIB 组中寻找 rcc.c,在 rcc.c 中寻找 rcc.h,找到函数复制粘贴。
![在这里插入图片描述](https://img-blog.csdnimg.cn/05be24a134584fcd9a2e1235a8cffa15.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
Ctrl + F 查找 RCC_APB2Periph ,复制 RCC_APB2Periph_GPIOC
![在这里插入图片描述](https://img-blog.csdnimg.cn/a40f1e1d250d4e0fb168cfcf2f583080.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
右键 Go To
![在这里插入图片描述](https://img-blog.csdnimg.cn/3adff61314dd4391bb5b27795a2c7d8f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/3742aa7c1bb542c1910d82605307b007.png#pic_center)
2.5.2 配置结构体
![在这里插入图片描述](https://img-blog.csdnimg.cn/a5ffb7f5f5b54d5ea8a2583db5880f04.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/03fe76d0a22844469a014d3cce03fe1c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/e96ac5f5b05a408aa258d5f9f321e6bb.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/1790e93647f64457a5c01f2321312d03.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
注意:步骤一(使能APB2时钟)图片中函数 RCC_AHBPeriphClockCmd()函数复制错了,正确的应该为:
RCC_APB2PeriphClockCmd()
![在这里插入图片描述](https://img-blog.csdnimg.cn/8070ffd0e0b048a39340ace94ccf89c2.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.5.3 初始化GPIOC13
GPIOx:GPIOC ,x = C *GPIO_InitStruct:第二步配置的结构体,要取地址 &
![在这里插入图片描述](https://img-blog.csdnimg.cn/09b3a63316b1480eacc4c6fcc619a466.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/6e2144e408b349c1a55efa3955cda4ec.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_17,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.6 main 函数调用 初始化 LED_Init () 、 拉低电平 GPIO_ResetBits ()
![在这里插入图片描述](https://img-blog.csdnimg.cn/0adcdd7d946d47f182028632c8e2c0e4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWkNZKFlpbnl1ZXIxKQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
led.h、led.c 和 main.c
led.c
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void)
{
GPIO_InitTypeDef led_init;
//1.打开控制GPIOC的时钟(APB2)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
//2.配置结构体
led_init.GPIO_Mode = GPIO_Mode_Out_PP; //GPIOC13引脚
led_init.GPIO_Pin = GPIO_Pin_13; //推挽输出
led_init.GPIO_Speed = GPIO_Speed_10MHz; //10MHz
//3.对 GPIOC 、 结构体 进行初始化
GPIO_Init(GPIOC, &led_init);
}
led.h
#include "stm32f10x.h"
void LED_Init(void);
main.c
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
int main()
{
LED_Init();
while(1)
{
//GPIO_SetBits(GPIOC,GPIO_Pin_13); //P13引脚 输出 高电平
GPIO_ResetBits(GPIOC , GPIO_Pin_13); //P13引脚 输出 低电平
}
}
3. LED 闪烁
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
void delay(uint16_t time)
{
uint16_t i=0;
while(time--)
{
i=10000;
while(i--);
}
}
int main()
{
LED_Init();
GPIO_SetBits(GPIOC , GPIO_Pin_13);
while(1)
{
GPIO_ResetBits(GPIOC , GPIO_Pin_13);
delay(1000);
GPIO_SetBits(GPIOC , GPIO_Pin_13);
delay(1000);
}
}
4. 呼吸灯
main.c
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
void delay(uint16_t time)
{
uint16_t i=0;
while(time--)
{
i=10;
while(i--);
}
}
int main()
{
unsigned char i=0;
unsigned int t=1;
unsigned char flag=1;
LED_Init();
// GPIO_SetBits(GPIOC , GPIO_Pin_13);
while(1)
{
if(flag==1)
{
for(i=0;i |