探索者F4板子,用延时函数delay_us做呼吸灯为何效果不行?程序如下:

2019-07-20 13:13发布

void delay10us(u32 i)
{
unsigned int j;
for(j = 0;j < 10;j++)
{
delay_us(1);
}
}

void LED_Breath(void)
{
u32 i;

for(i = 0;i < 450;i++)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_9); 
GPIO_ResetBits(GPIOF,GPIO_Pin_10); 
delay10us(i);     //???±
GPIO_SetBits(GPIOF,GPIO_Pin_9);  
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay10us(450 - i);  
}
for(i = 0;i < 250;i++)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_9);  
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
delay10us(i);    
}
for(i = 0;i < 450;i++)
{
GPIO_SetBits(GPIOF,GPIO_Pin_9);  
GPIO_SetBits(GPIOF,GPIO_Pin_10); 
delay10us(i);    
GPIO_ResetBits(GPIOF,GPIO_Pin_9);  
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
delay10us(450 - i);  
}
for(i = 0;i < 250;i++)
{
GPIO_SetBits(GPIOF,GPIO_Pin_9);  
GPIO_SetBits(GPIOF,GPIO_Pin_10); 
delay10us(i);    
}
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
lycreturn
1楼-- · 2019-07-20 16:04
最大延时才四五毫秒,你的眼睛根本就跟不上led节奏
把延时10us改为10ms还差不多
lycreturn
2楼-- · 2019-07-20 19:02
 精彩回答 2  元偷偷看……
一眼万年
3楼-- · 2019-07-21 00:36
回复【2楼】lycreturn:
---------------------------------
如果这段程序在51上面,也是10us,却是正常的呼吸,这是为什么?
一眼万年
4楼-- · 2019-07-21 05:44
至于51和32的区别,还是很清楚的,用的us延时函数,是开发板自带的,源码如下:
void delay_us(u32 nus)
{
u32 temp;       
SysTick->LOAD=nus*fac_us;     
SysTick->VAL=0x00;        
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          
do
{
temp=SysTick->CTRL;
}
while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       
SysTick->VAL =0X00;       
}
正点原子
5楼-- · 2019-07-21 10:05
 精彩回答 2  元偷偷看……
jj123paopao
6楼-- · 2019-07-21 15:12
用定时器的PWN输出去做,调节占空比实现,具体参照原子例程。

一周热门 更多>