1:新建固件库工程文件
1.1找到一个固件库模板
1.2:打开KEIL5新建工程
最终效果:
1.3:添加相关文件
然后我们针对不同文件夹 我们添加不同的文件进来。
双击STARTUP 添加我们固件库的启动文件
STARTUP:添加Libraries——>CMSIS——>startup中的启动文件
USER:添加固件库的User文件夹中的.c文件
CMSIS 添加Libraries——>CMSIS文件夹中的.c文件
DOC:添加固件库中Doc文件夹的readme.txt
FWLIB:添加Libraries——>STM32F10x_StdPeriph_Driver文件夹中的.c文件
添加完效果
1.4:手动添加其他文件路径进来
打开stm32f0x.h文件
按 Ctrl + F 查找 stm32f10x_conf
会调到一下的代码 我们得宏定义加载一下
添加其他文件夹.h路径
这样就是新建固件库工程文件完成了。。。。。
下面就开始点灯 点灯 点灯
下面就开始点灯 点灯 点灯
下面就开始点灯 点灯 点灯
2:STM32固件库点灯
首先你得有个固件库手册来参考 我这里直接上代码。
我这个用的STM32C8T6板子 PC13是LED灯 根据原理图 给个低电平则点亮
LED配置代码
led.c
- #include "stm32f10x.h"
- #include "led.h"
- void LED_Init(void)
- {
- //1.打开控制GPIOC的时钟(APB2)
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
-
- //2.配置结构体
- GPIO_InitTypeDef led_init;
- led_init.GPIO_Pin = GPIO_Pin_13; //GPIOC13引脚
- led_init.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- led_init.GPIO_Speed = GPIO_Speed_10MHz; //10MHz
-
- //3.对成员进行初始化
- GPIO_Init(GPIOC, &led_init);
- }
复制代码
led.h
- #ifndef _LED_H_
- #define _LED_H_
- #include "stm32f10x.h"
- void LED_Init(void); //LED初始化函数声明
- #endif
复制代码
2.1: 方式1点灯
main.c
- #include "stm32f10x.h"
- #include "led.h"
- int main()
- {
- LED_Init(); //LED初始化
-
- while(1)
- {
- //方式1
- //GPIO_SetBits(GPIOC,GPIO_Pin_13); //P13引脚输出高电平
- GPIO_ResetBits(GPIOC, GPIO_Pin_13); //P13引脚输出低电平
- }
- }
复制代码
2.2 :方式2点灯
main.c
- #include "stm32f10x.h"
- #include "led.h"
- int main()
- {
- LED_Init(); //LED初始化
-
- while(1)
- {
- //方式2
- //GPIO_WriteBit(GPIOC,GPIO_Pin_13, Bit_SET); //P13引脚输出高电平
- GPIO_WriteBit(GPIOC,GPIO_Pin_13, Bit_RESET); //P13引脚输出低电平
- }
- }
复制代码
2.3 :方式3点灯
main.c
- #include "stm32f10x.h"
- #include "led.h"
- int main()
- {
- LED_Init(); //LED初始化
-
- while(1)
- {
- //方式3
- //GPIO_Write(GPIOC, 0X2000); //P13引脚输出高电平
- GPIO_Write(GPIOC, 0X0000); //整组端口输出低电平
- }
- }
复制代码
点灯效果
3:STM32闪烁灯
加一个延时函数 我们就可以做一个 LED闪烁效果了
这里的延时我们没有用到定时器 ,只是简单的通过循环来延时。
delay.c
- #include "stm32f10x.h"
- #include "delay.h"
- void delay_ms(uint16_t time)
- {
- uint16_t i = 0;
- while(time--)
- {
- i = 10000;
- while(i--);
- }
- }
复制代码
main.c
- #include "stm32f10x.h"
- #include "led.h"
- #include "delay.h"
- int main()
- {
- LED_Init(); //LED初始化
-
- while(1)
- {
- GPIO_ResetBits(GPIOC, GPIO_Pin_13); //LED点亮
- delay_ms(1000); //亮灯大约1秒
- GPIO_SetBits(GPIOC,GPIO_Pin_13); //LED熄灭
- delay_ms(1000); //熄灭灯大约1秒
- }
- }
复制代码 闪烁灯效果
4:STM32呼吸灯
呼吸灯就像我们人呼吸那样,我们可以让灯慢慢的亮 慢慢的暗,这个就是通过占空比来调节。(可以理解为LED高电平时间和LED低电平时间)
比如 LED 亮延时100us 然后 暗 100us 这时候他们占空比是百分之50.
那如果我们 LED 亮10us 然后暗 还是100us 这个时候 你会发现 LED灯变暗了很多。 这个其实是我们的视觉暂停 原因导致的。
所以我们可以通过调节 LED点亮的时间 和 LED 熄灭的时间的比例来调节,让LED 慢慢的亮 然后 慢慢的 暗。
慢慢的亮 意思就是 LED的低电平时间慢慢的增加。
比如从1us 慢慢 到500us 然后LED高电平时间则是 从500us 慢慢到1us。
如果是想着LED灯 亮慢慢 暗 则相反。
main.c
- #include "stm32f10x.h"
- #include "led.h"
- #include "delay.h"
- int main()
- {
- LED_Init(); //LED初始化
- unsigned char i = 0;
- unsigned int t = 1;
- unsigned char flag = 1;
- while(1)
- {
- if(flag == 1) //LED由暗到亮
- {
- for(i=0;i<10;i++)
- {
- GPIO_ResetBits(GPIOC, GPIO_Pin_13); //LED点亮
- delay_us(t);
- GPIO_SetBits(GPIOC,GPIO_Pin_13); //LED熄灭
- delay_us(501-t);
- }
- t++;
- if(t == 500)
- {
- flag = 0;
- }
- }
- if(flag == 0) //LED由亮到暗
- {
- for(i=0;i<10;i++)
- {
- GPIO_ResetBits(GPIOC, GPIO_Pin_13); //LED点亮
- delay_us(t);
- GPIO_SetBits(GPIOC,GPIO_Pin_13); //LED熄灭
- delay_us(501-t);
- }
- t--;
- if(t == 1)
- {
- flag = 1;
- }
- }
- }
- }
复制代码
5:STM32按键点灯
我们玩了呼吸灯 也可以玩玩按键点灯,按键其实也是挺简单的,我用的按键是只有两个引脚的,我们任意的一脚接单片机的GND ,另一个接单片机的GPIO 当按下按键 这个GPIO则会是低电平。 那我们就检测这个GPIO是否是低电平 如果是 我们则点亮LED灯。
key.c
- #include "stm32f10x.h"
- #include "key.h"
- /*按键初始化函数*/
- void KEY_Init(void)
- {
- //1.打开控制GPIOA的时钟(APB2)
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- //2.配置结构体
- GPIO_InitTypeDef key_init;
- key_init.GPIO_Pin = GPIO_Pin_5; //GPIOC13引脚
- key_init.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
- //led_init.GPIO_Speed = GPIO_Speed_10MHz; //10MHz
-
- //3.对成员进行初始化
- GPIO_Init(GPIOA, &key_init);
- }
复制代码
main.c
- #include "stm32f10x.h"
- #include "led.h"
- #include "key.h"
- #include "delay.h"
- int main()
- {
- LED_Init(); //LED初始化
- KEY_Init(); //按键初始化
- GPIO_SetBits(GPIOC,GPIO_Pin_13); //LED设置高电平
- GPIO_SetBits(GPIOA,GPIO_Pin_5); //按键设置高电平
-
- while(1)
- {
- //如果按键被按下
- if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == 0)
- {
- delay_ms(20); //消抖再次判断是否按下
- if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == 0)
- {
- GPIO_ResetBits(GPIOC, GPIO_Pin_13); //LED点亮
- delay_ms(1000); //延时大约1秒
- }
- }
- else
- {
- GPIO_SetBits(GPIOC,GPIO_Pin_13); //LED熄灭
- }
- }
- }
复制代码
按键点灯效果
6:STM32震动感应灯
需要材料:
6.1:震动传感器
2.继电器
(我用的这个是高电平导通)
灯
这种是震动传感器,我们可以也通过震动来点灯,我用的这个模块是当发生震动时,会变成低电平。那其实就是相当于我们的按键,我们去检测一下这个模块到底是不是低电平如果是低电平,那么我们让LED灯点亮1秒啥的都有可以。
直接上代码:
配置震动传感器模块代码
代码
- shake.c
- #include "stm32f10x.h"
- #include "shake.h"
- /*震动传感器初始化函数*/
- void SHAKE_Init(void)
- {
- //打开GPIOC时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- //配置结构体
- GPIO_InitTypeDef shake_init;
- shake_init.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
- shake_init.GPIO_Pin = GPIO_Pin_3; //A3引脚
- //shake_init.GPIO_Speed = GPIO_Speed_50MHz;
-
- //成员初始化
- GPIO_Init(GPIOA, &shake_init);
- }
复制代码
继电器模块配置代码:
relay.c
- #include "relay.h"
- /*继电器模块初始化函数*/
- void RELAY_Init(void)
- {
- //打开时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- //配置结构体
- GPIO_InitTypeDef relay_init;
- relay_init.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- relay_init.GPIO_Pin = GPIO_Pin_4; //3引脚
- relay_init.GPIO_Speed = GPIO_Speed_50MHz;
-
- //成员初始化
- GPIO_Init(GPIOA, &relay_init);
- }
复制代码 main.c
- #include "stm32f10x.h"
- #include "led.h"
- #include "relay.h"
- #include "delay.h"
- #include "shake.h"
- /*主程序入口*/
- int main()
- {
- LED_Init(); //LED模块初始化
- RELAY_Init();//继电器模块初始化
- SHAKE_Init();//震动传感器初始化
-
- GPIO_SetBits(GPIOC, GPIO_Pin_13); //LED高电平
- GPIO_SetBits(GPIOA, GPIO_Pin_3); //震动传感器高电平
- GPIO_ResetBits(GPIOA, GPIO_Pin_4); //继电器低电平(关闭)
- while(1)
- {
- if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3) == 0)
- {
- GPIO_ResetBits(GPIOC, GPIO_Pin_13); //LED点亮
- GPIO_SetBits(GPIOA, GPIO_Pin_4); //继电器导通 (高电平)
- delay_ms(1000);
- }
- else
- {
- GPIO_SetBits(GPIOC, GPIO_Pin_13); //LED不亮
- GPIO_ResetBits(GPIOA, GPIO_Pin_4); //继电器不导通 (低电平)
- }
-
- }
- }
复制代码
如何接线
项目效果
————————————————
转载:皮卡丘吉尔 |