查看: 4515  |  回复: 1
《STM32,我来了》系列教程【持续更新】第二章:LED灯闪烁和颜色变换
晏几台char
13
主题
6
回复
发表于2018-12-22 22:20:13 | 只看该作者
1# 电梯直达

第二章:LED灯闪烁和颜色变换

上一节课已经简简单单地成功点亮了一个LED灯,那么如何控制LED灯闪烁呢?

我们打算用软件延时,当然,用STM32自带的Systick也可以做精准延时,在之后的篇幅中会有一章是专门来讲Systick,我们现在使用的是软件延时。

野火指南者用的8MHz的晶振,经过9倍频,最后的时钟频率达到72MHz,所以执行一段语句的时间为频率的倒数,即1/72 000 000 s,等同于1/72 us,那么,如果要延时一秒的话,就需要执行14000000次语句。

 

一、定义一个延时函数Delay

(当然函数名按自己的来随便改也是可以的)

void Delay(unsigned int i)

{

while(i--);

}


然后在main函数中加入Delay14000000),就可以达到延时一秒。

还有,我们知道之前

 

引脚的那一端拉低就可以点亮LED灯,那么拉高的话,就会使LED灯熄灭,再结合我们之前所讲的延时函数就可以实现一个”LED灯闪烁的现象了。

二、main主函数中添加一个while循环来让LED灯持续闪烁

       

while(1)
        {
                 GPIO_SetBits(GPIOB, GPIO_Pin_5);
                 Delay(14000000);
                 GPIO_ResetBits(GPIOB, GPIO_Pin_5);
                 Delay(14000000);
        }

 

三、最后的效果

所以,我们在上一节课的代码上要修改为:


 

 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);

        //将相关的引脚置位,拉高,默认为熄灭

        while(1)

        {

                         GPIO_ResetBits(GPIOB, GPIO_Pin_5);//点亮红灯

                         Delay(14000000);

                         GPIO_SetBits(GPIOB, GPIO_Pin_5);//熄灭红灯

                         Delay(14000000);

        }

三、LED灯颜色变换

 

从原理图我们可以发现,这是一个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);

        }


 

 

至此,我们将02LED灯闪烁和颜色变换\点灯项目源代码\Output\led.hex文件利用mcuisp下载到板子里就可会发现三种色灯交替闪亮!

链接: https://pan.baidu.com/s/1kO-wmLc1Bq248Zvrs0WFvA 提取码: vuks


我是一个粉刷匠,粉刷本领强。
111aou
0
主题
6
回复
发表于2018-12-24 16:16:44   |  只看该作者
2#

主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部