初级会员

- 积分
- 134
- 金钱
- 134
- 注册时间
- 2015-5-7
- 在线时间
- 28 小时
|
1金钱
昨天看了下原子的429的HAL库教程,今天将HAL库移植到407上,框架的搭建还是和429工程一样。结果发现,用delay_ms函数不工作。利用HAL库提供的HAL_Delay函数正常工作。然后调试了下发现原因出现在delay_us上。对比了下原子以前的407的delay_us函数和现在429上的delay_us函数。发现两个不一样。原子429上的延时函数倒是跟407上如果定义了UCOS情况下用的延时函数一样。
因为也没时间去深究,直接将那段运行有问题的代码换成原来的。运行,结果正常。发个帖子问问为什么会出现这种情况。同时有想学习用407的HAL库开发的可以下载我移植好的模板试试。
这是两个延时函数的对比。
[mw_shl_code=applescript,true]//延时nus
//nus为要延时的us数.
//nus:0~190887435(最大值即2^32/fac_us@fac_us=22.5)
/*void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD的值
ticks=nus*fac_us; //需要的节拍数
told=SysTick->VAL; //刚进入时的计数器值
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
}
};
}*/
//以上429使用的延时函数,发现不能正常工作。用下面原子哥以前在407上的延时函数可以用
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; //清空计数器
}[/mw_shl_code]
主函数如下:
[mw_shl_code=applescript,true]int main(void)
{
GPIO_InitTypeDef GPIO_Initure;
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(336,8,2,7); //设置时钟,168Mhz
delay_init(168);
__HAL_RCC_GPIOE_CLK_ENABLE(); //开启GPIOE时钟
GPIO_Initure.Pin=GPIO_PIN_3|GPIO_PIN_4; //PE3 PE4
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOE,&GPIO_Initure);
while(1)
{
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_SET); //PE3置1
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_SET); //PE4置1
//Delay(0x7FFFFF);
//HAL_Delay(500);
delay_ms(500);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_RESET); //PE3置0
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET); //PE4置0
//Delay(0x7FFFFF);
//HAL_Delay(500);
delay_ms(500);
}
}
[/mw_shl_code]
|
|