你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32:LED灯闪烁和颜色变换

[复制链接]
STMCU小助手 发布时间:2022-2-10 21:22
如何控制LED灯闪烁呢?
我们打算用软件延时,当然,用STM32自带的Systick也可以做精准延时,在之后的篇幅中会有一章是专门来讲Systick,我们现在使用的是软件延时。
野火指南者用的8MHz的晶振,经过9倍频,最后的时钟频率达到72MHz,所以执行一段语句的时间为频率的倒数,即1/72 000 000 s,等同于1/72 us,那么,如果要延时一秒的话,就需要执行约14000000次语句。

0 p& M! b+ n' U3 b$ b7 P一、定义一个延时函数Delay
(当然函数名按自己的来随便改也是可以的)
void Delay(unsigned int i){while(i--);}& V' F1 I: O1 \. s5 L6 s' j/ Q
. s- M9 ^* Y& D+ V7 K% B7 U

8 J1 T1 w, Q  _7 q6 B
然后在main函数中加入Delay(14000000),就可以达到延时一秒。
还有,我们知道之前
引脚的那一端拉低就可以点亮LED灯,那么拉高的话,就会使LED灯熄灭,再结合我们之前所讲的延时函数就可以实现一个”LED灯闪烁”的现象了。
二、main主函数中添加一个while循环来让LED灯持续闪烁
( F! j. J1 ~" s3 D# Nwhile(1)        {                 GPIO_SetBits(GPIOB, GPIO_Pin_5);                 Delay(14000000);                 GPIO_ResetBits(GPIOB, GPIO_Pin_5);                 Delay(14000000);        }
* l- {3 y) u0 T& G) e3 @0 m8 Z7 C$ N4 t& r5 I
! u7 j* g; ^4 z; p' T& U' `
三、最后的效果
所以,我们在上一节课的代码上要修改为:

3 f2 F; _; }, h+ ]2 KGPIO_InitTypeDef GPIO_InitStructure;        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;        GPIO_Init(GPIOB,&GPIO_InitStructure);        GPIO_ResetBits(GPIOB, GPIO_Pin_5);        //将相关的引脚置位,拉高,默认为熄灭        while(1)        {                         GPIO_ResetBits(GPIOB, GPIO_Pin_5);//点亮红灯                         Delay(14000000);                         GPIO_SetBits(GPIOB, GPIO_Pin_5);//熄灭红灯                         Delay(14000000);        }
) \6 H2 j8 t( |. E3 C6 [: M三、LED灯颜色变换 3 i# R9 r1 H- i7 o

+ D% a8 U6 I5 T# J, d2 `* u& @& l
从原理图我们可以发现,这是一个RGB灯,之前我们只是点亮了他的一种颜色,如果需要改变颜色,初始化对应的GPIO即可,所以需要修改:
端口号引脚号
到代码中所要修改的就是(红色的部分):
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        GPIO_ResetBits(GPIOB, GPIO_Pin_5);
同理,因为这个开发板RGB灯都是挂载到GPIOB这个IO口,所以初始化不同灯的GPIO的时候,只需要改变引脚即可,在以上的代码中追加:
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
然后main函数中的while中修改代码,使每间隔1秒灯交换亮:
while(1)        {                         GPIO_ResetBits(GPIOB, GPIO_Pin_5);//点亮红灯                         GPIO_SetBits(GPIOB, GPIO_Pin_0);//熄灭绿灯                         GPIO_SetBits(GPIOB, GPIO_Pin_1);//熄灭蓝灯                         Delay(14000000);                         GPIO_ResetBits(GPIOB, GPIO_Pin_0);//点亮绿灯                         GPIO_SetBits(GPIOB, GPIO_Pin_5);//熄灭红灯                         GPIO_SetBits(GPIOB, GPIO_Pin_1);//熄灭蓝灯                         Delay(14000000);                         GPIO_ResetBits(GPIOB, GPIO_Pin_1);//点亮蓝灯                         GPIO_SetBits(GPIOB, GPIO_Pin_0);//熄灭绿灯                         GPIO_SetBits(GPIOB, GPIO_Pin_5);//熄灭红灯                         Delay(14000000);        }
- G2 s6 H) T3 p9 F4 s( E: |. l/ g7 `2 l9 B' f6 }  f
至此,我们将02LED灯闪烁和颜色变换\点灯项目源代码\Output\led.hex文件利用mcuisp下载到板子里就可会发现三种色灯交替闪亮!

9 I6 l8 w9 Y* V5 v' o1 `3 M
' r# N0 V$ K0 N/ [: ?4 j; D  m$ z; _# M* q& O3 b# Y# M
收藏 评论0 发布时间:2022-2-10 21:22

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版