流水灯案例

张开发
2026/4/10 11:56:57 15 分钟阅读

分享文章

流水灯案例
采用硬件设备野火开发板开发板采用RGB灯 低电平点亮1开启三个灯的时钟// 1. 开启 GPIOB 时钟 RCC-APB2ENR | RCC_APB2ENR_IOPBEN;2.配置输出模式// 2. 配置 PB5 PB0 PB1为推挽输出 50MHz GPIOB-CRL ~GPIO_CRL_CNF0; GPIOB-CRL | GPIO_CRL_MODE0; GPIOB-CRL ~GPIO_CRL_CNF1; GPIOB-CRL | GPIO_CRL_MODE1; GPIOB-CRL ~GPIO_CRL_CNF5; GPIOB-CRL | GPIO_CRL_MODE5;3.三个灯默认高电平全部灭掉// 3. 三个灯默认高电平 全部灭掉 GPIOB-ODR|GPIO_ODR_ODR0; GPIOB-ODR|GPIO_ODR_ODR1; GPIOB-ODR|GPIO_ODR_ODR5;4.循环点亮//4 循环点亮灯 while(1) { //绿灯 GPIOB-ODR~GPIO_ODR_ODR0; Delay_ms(500); GPIOB-ODR|GPIO_ODR_ODR0; //蓝灯 GPIOB-ODR~GPIO_ODR_ODR1; Delay_ms(500); GPIOB-ODR|GPIO_ODR_ODR1; //红灯 GPIOB-ODR~GPIO_ODR_ODR5; Delay_ms(500); GPIOB-ODR|GPIO_ODR_ODR5; }//相关延时函数//延时函数 微秒 利用系统滴答定时器 72MHZ 1/72us void Delay_us(unsigned int us) { //1装载一个计数值 SysTick-LOAD 72*us; //2配置 使用系统时钟1 计数不产生中断0 使能定时器1 SysTick-CTRL | 0x05; //3等待计数值变为0 判断CTRL标志位COUNTFLAG是否为1 while((SysTick-CTRL SysTick_CTRL_COUNTFLAG ) 0) { } //4关闭定时器 SysTick-CTRL ~SysTick_CTRL_ENABLE; } //延时函数 毫秒 void Delay_ms(unsigned int ms) { while(ms--) { Delay_us(1000);//一毫秒 } }函数该进main.c#include stm32f10x.h #include stdint.h #include led.h #include delay.h /* PB5 控制LED PB0 备用 PB1 备用 */ int main(void) { //LED数组 uint16_t leds[] {led1,led2,led3}; led_Init();//初始化 while(1) { for(int i0;i3;i) { led_on(leds[i]); Delay_ms(500); led_off(leds[i]); } } }led.c#include led.h void led_Init(void)//灯初始化函数 { // 1. 开启 GPIOB 时钟 RCC-APB2ENR | RCC_APB2ENR_IOPBEN; // 2. 配置 PB5 为推挽输出 50MHz GPIOB-CRL ~GPIO_CRL_CNF0; GPIOB-CRL | GPIO_CRL_MODE0; GPIOB-CRL ~GPIO_CRL_CNF1; GPIOB-CRL | GPIO_CRL_MODE1; GPIOB-CRL ~GPIO_CRL_CNF5; GPIOB-CRL | GPIO_CRL_MODE5; // 3. 三个灯默认高电平 全部灭掉 GPIOB-ODR|GPIO_ODR_ODR0; GPIOB-ODR|GPIO_ODR_ODR1; GPIOB-ODR|GPIO_ODR_ODR5; } void led_on(uint16_t led)//对应灯打开 { GPIOB-ODR ~led; } void led_off(uint16_t led)//对应灯关闭 { GPIOB-ODR | led; } void led_toogle(uint16_t led)//对应灯翻转 { if((GPIOB-IDR led) 0) { led_off(led); } else { led_on(led); } } void led_onall(uint16_t leds[],unsigned char size)//对一组led灯全开 { for(int i0;isize;i) { led_on(leds[i]); } } void led_offall(uint16_t leds[],unsigned char size)//对一组led灯全关 { for(int i0;isize;i) { led_off(leds[i]); } }led.h#ifndef __LED_H #define __LED_H #include stm32f10x.h //宏定义 #define led1 GPIO_ODR_ODR0 #define led2 GPIO_ODR_ODR1 #define led3 GPIO_ODR_ODR5 //相关函数 void led_Init(void);//灯初始化函数 void led_on(uint16_t led);//对应灯打开 void led_off(uint16_t led);//对应灯关闭 void led_toogle(uint16_t led);//对应灯翻转 void led_onall(uint16_t leds[],unsigned char size);//对一组led灯全开 void led_offall(uint16_t leds[],unsigned char size);//对一组led灯全关 #endifdelay.c#include delay.h //延时函数 微秒 利用系统滴答定时器 72MHZ 1/72us void Delay_us(unsigned int us) { //1装载一个计数值 SysTick-LOAD 72*us; //2配置 使用系统时钟1 计数不产生中断0 使能定时器1 SysTick-CTRL | 0x05; //3等待计数值变为0 判断CTRL标志位COUNTFLAG是否为1 while((SysTick-CTRL SysTick_CTRL_COUNTFLAG ) 0) { } //4关闭定时器 SysTick-CTRL ~SysTick_CTRL_ENABLE; } //延时函数 毫秒 void Delay_ms(unsigned int ms) { while(ms--) { Delay_us(1000);//一毫秒 } } //延时函数 秒 void Delay_s(unsigned int s) { while(s--) { Delay_ms(1000);//一秒 } }delay.h#ifndef __DELAY_H #define __DELAY_H #include stm32f10x.h //函数声明 void Delay_us(unsigned int us); void Delay_ms(unsigned int ms); void Delay_s(unsigned int s); #endif

更多文章