电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
如何用延时实现一个呼吸灯
分 享
扫描二维码分享
如何用延时实现一个呼吸灯
单片机
STM32
标准库
Sixer
关注
发布时间: 2022-01-05
丨
阅读: 1463
## stm32f4标准库开发——如何用延时实现一个呼吸灯 ### 主要概念: GPIO:通用输入输出引脚。 呼吸灯:灯光在控制之下完成由亮到暗的逐渐变化 ### 实验目的: 本实现通过定时us延时,实现一个LED呼吸灯的效果。主要模仿pwm的形式来实现。 ### 硬件电路: PF9 --> LED0 PF10 --> LED1 ![](https://cf03.ickimg.com/bbsimages/202201/7a6ad5f59c07cdf692f25b1c7c79fab5.png) ![](https://cf03.ickimg.com/bbsimages/202201/ff3932faecba2a88bb2d9809cedb5fbe.png) ### 主要库函数调用: ``` GPIO_Init(GPIOF, &GPIO_InitStructure); //GPIO初始化 PFout(9) //位带操作 ``` ### 代码: ```c //led.c #include "led.h" #include "stm32f4xx.h" void led_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOF, &GPIO_InitStructure); GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10); } ``` ```c //led.h #ifndef __LED_H #define __LED_H #include "base.h" #define led0 PFout(9) #define led1 PFout(10) #define red_led_on() led0 = 0 #define red_led_off() led0 = 1 #define green_led_on() led1 = 0 #define green_led_off() led1 = 1 void led_init(void); #endif ``` ```c //main.c #include "stm32f4xx.h" #include "delay.h" #include "led.h" #define breath_led_on() red_led_on() #define breath_led_off() red_led_off() int main(void) { uint16_t pwm_count; uint16_t pwm_set = 0; uint8_t pwm_dir = 1; uint8_t pwm_set_count = 0; led_init(); delay_init(168); while(1) { pwm_count++; if(pwm_count < pwm_set) breath_led_on(); else breath_led_off(); if(pwm_count == 20) //20*50us=1ms,pwm波频率为 1KHz { pwm_count = 0; pwm_set_count++; } if(pwm_set_count == 50) //50ms调整一次占空比,占空比调整频率为20Hz { pwm_set_count = 0; if(pwm_dir == 1) pwm_set++; else pwm_set--; if(pwm_set == 20) //20*500*2ms=2s为一个呼吸周期 pwm_dir = 0; if(pwm_set == 0) pwm_dir = 1; } delay_us(50); //50us为计时单位 } } ``` ### 编译运行:result 如下,编译无报错,无警告。 ![](https://cf03.ickimg.com/bbsimages/202201/c0ab151242c6eacb7c842c4873806fcd.png) ### 实验现象: 红色led闪烁呼吸正常,频率为2s。 ### 总结: 本实验主要重点是理解pwm原理,同时用软件模拟得到形式做出pwm的效果 另外就是复习了GPIO初始化原理 关于led的几个宏定义,最终是使用了位带操作,查看工程里的 base.h。 ### 工程下载:
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
Sixer
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交