OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3491|回复: 1

阿波罗F429中的delay_us函数移植到407上不能工作

[复制链接]

8

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2015-5-7
在线时间
28 小时
发表于 2016-8-3 16:33:50 | 显示全部楼层 |阅读模式
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]

1.gpio_hal.zip

1004.11 KB, 下载次数: 78

最佳答案

查看完整内容[请看2#楼]

应该是你的HAL库代码,和429的有差异。检查HAL库部分。SYSTICK的代码。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-8-3 16:33:51 | 显示全部楼层
应该是你的HAL库代码,和429的有差异。检查HAL库部分。SYSTICK的代码。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 00:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表