嵌入式02

1.利用循环完成流水灯

//循环完成流水灯
在while(1)循环内
for(uint32_t i=8;i<=15;i++){
HAL_GPIO_WritePin(GPIOC,1<<i,GPIO_PIN_RESET);//位运算
HAL_Delay(500);
}
for(uint32_t i=8;i<=15;i++){
HAL_GPIO_WritePin(GPIOC,1<<i,GPIO_PIN_SET);
HAL_Delay-(500);
}
新的定义形式:uint32_t i=0;//无符号的整形数据
位运算:通过查看GPIO_PIN_8的底层代码逻辑,通过位运算依次生成pin5到pin8的控制码,精准定位每个引脚
如1<<8时,对应引脚GPIO_PIN_8;
函数:HAL_Delay(500)延时500毫秒;
2.完成让两个灯互不影响的闪烁,一个间隔100毫秒,一个间隔500毫秒

uint32_t i;
在while(1)死循环内
i++;
HAL_Delay(100);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);
if(i%5==0){
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_9);
}//pin8闪烁5次,pin9闪烁1次
函数:HAL_GPIO_TogglePin 引脚电平翻转函数,高电平就变低,低电平就变高;
3.完成让两个灯互不影响的闪烁,一个间隔100毫秒,一个间隔333毫秒

注意:这个不能像上一个找到5这个最小因数,用2中算法不能实现
uint32_t last_time=0;
uint32_t last_led2_time=0;
在while(1)死循环内
if((HAL_GetTick()-last_time)>100){
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);
last_time=HAL_GetTick();
}
if((HAL_GetTick()-last_led2_time)>333){
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_9);
last_led2_time=HAL_GetTick();
}
函数:HAL_GetTick() 计时系统以毫秒为单位,每一毫秒计数加一;
3进阶.led1 每100ms闪烁一次。同时led2 每500ms 闪烁一次,闪烁3次后停止闪烁

uint32_t last_time=0;
uint32_t last_led2_time=0;
uint32_t count=0;
在while(1)死循环内
if((HAL_GetTick()-last_time)>100){
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);
last_time=HAL_GetTick();
}
if((HAL_GetTick()-last_led2_time)>500){
count++;
if(count<=6){
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_9);
last_led2_time=HAL_GetTick();
}
}
加了一个计数的count来回翻转3次,也就是count为6时就不管pin9了

posted @ 2026-01-08 21:34  waaaaaazz  阅读(3)  评论(0)    收藏  举报