想用STM32开发板做个流水灯,从左到右共8个灯,要求是在第二个灯未亮前第一个灯不能灭,依次类推

想用STM32开发板做个流水灯,从左到右共8个灯,要求是在第二个灯未亮前第一个灯不能灭,依次类推,第1张

题目不清楚,假设8个灯,整体循环一次的时间是80s,后一个灯亮了3s后前一个灯才允许熄灭。那么可以用定时器,定时器中采用一个变量aaa进行计数累加,比如设定一个1s的定时器,每次进入定时器变量aaa加1,aaa加到80就清零重新累加。

定时器中点亮程序:if(aaa<10){把1号灯点亮};else if(aaa<20){把2号灯点亮}else if(aaa<30){把3号灯点亮}else if(aaa<40){把4号灯点亮}else if(aaa<50){把5号灯点亮}else if(aaa<60){把6号灯点亮}else if(aaa<70){把7号灯点亮}else if(aaa<80){把8号灯点亮}

定时器中熄灭程序:if(aaa>73){把7号灯熄灭};else if(aaa>63){把6号灯熄灭}else if(aaa>53){把5号灯熄灭}else if(aaa>43){把4号灯熄灭}else if(aaa>33){把3号灯熄灭}else if(aaa>23){把2号灯熄灭}else if(aaa>13){把1号灯熄灭}else if(aaa>3){把8号灯熄灭}

这样就可以实现。方法有很多,这只是举个简单例子。

开发板上4个LED是接到STM32的4个IO口上的,要点亮LED,只要在这4个IO上输出对应的高电平

那如何让STM32在PF6~PF9这4个IO上输出高点平呢

首先要看下《STM32F10xxx参考手册CD00171190.pdf》里关于IO端口的介绍,第8章 通用和复用功能I/O(GPIO和AFIO)

百为STM3210E-EVAL开发板上的CPU是STM32F103ZET6,有GPIOA~GPIOG七组IO,每组IO有16个引脚GPIO_Pin_0~GPIO_Pin_15,如板上的PF0~PF15

其中每个IO端口有2个32位的寄存器(GPIOx_CRL和GPIOx_CRH)配置,每个引脚由其中4位进行配置,

4位字段是由一个两位的配置字段和一个两位的模式字段组成

要设置这4位,要看下GPIOx_CRL,GPIOx_CRH的寄存器定义

由上图可以看出GPIOF_CRL的31~28位是设置PF7的,GPIOF_CRL的27~24位是设置PF6的

GPIOF_CRH的3~0位是设置PF8的,GPIOF_CRH的7~4位是设置PF6的

这里我们把每个引脚设置为

CNF[1:0]= 00:通用推挽输出模式

MODE[1:0] = 11 : 输出模式,最大速度50MH

GPIOF_CRL,GPIOF_CRH的寄存器地址分别是0x40011C00,0x40011C04

这个寄存器是怎么得来的,STM32数据手册里并没有直接给出,在《一个内幕者对STM32的介绍》4.1.1 寄存器地址查阅 这里有介绍怎么通过上面的偏移地址算出。

配置好,我们就可以直接在端口输出数据寄存器GPIOF_ODR输出高电平控制LED了,GPIOF_ODR有16位,每个位对应GPF的一个引脚,PF0~PF15

下面就可以编写LED流水灯程序了,激动啊,等了好久终于等到今天

/* main.c */

#define GPIOF_CRL (*(volatile unsigned int *)0x40011C00)//端口配置低寄存器

#define GPIOF_CRH (*(volatile unsigned int *)0x40011C04)//端口配置高寄存器

#define GPIOF_ODR (*(volatile unsigned int *)0x40011C0C)//端口输出数据寄存器

#define RCC_APB2ENR (*(volatile unsigned int *)0x40021018)//

void delay(void)

{

unsigned int i

for(i=0i<500000i++)

}

int main()

{

int i

RCC_APB2ENR |= 1<<7//打开GPIOF的时钟

GPIOF_CRL = ( GPIOF_CRL &0x00ffffff ) | 0x33000000//配置PF6,PF7为通用推挽输出模式,最大速度50MH

GPIOF_CRH = ( GPIOF_CRH &0xffffff00 ) | 0x00000033//配置PF8,PF9为通用推挽输出模式,最大速度50MH

while(1)

{

for(i=6i<=9i++)

{

GPIOF_ODR = ( GPIOF_ODR &0xfffffc3f ) | ( 1<<i ) //在PF6~PF9引脚轮流输出高电平

delay()

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11022721.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存