野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4249|回复: 2

移植时BSP调用SysTick延时函数的复写问题

[复制链接]
发表于 2017-3-3 11:25:30 | 显示全部楼层 |阅读模式
本帖最后由 doujyu 于 2017-3-3 18:02 编辑

ucosiii 中移植的bsp用到SysTick中void Delay_us( __IO u32 nTime )。原本SysTick_Handler(移植后是OS_CPU_SysTick_Handler)会调用void TimingDelay_Decrement(void),实现nTime--,现在不知道怎么实现。
void  OS_CPU_SysTickHandler (void)
{
    CPU_SR_ALLOC();


    CPU_CRITICAL_ENTER();
    OSIntNestingCtr++;                                      /* Tell uC/OS-III that we are starting an ISR             */
    TimingDelay_Decrement();
   CPU_CRITICAL_EXIT();

    OSTimeTick();                                           /* Call uC/OS-III's OSTimeTick()                          */
    OSIntExit();                                            /* Tell uC/OS-III that we are leaving the ISR             */
}

回复

使用道具 举报

 楼主| 发表于 2017-3-3 11:45:02 | 显示全部楼层
论坛找到的
void delay_us(u32 nus)
{               
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;                                        //LOAD的值                     
        ticks=nus*fac_us;                                                         //需要的节拍数                           
        tcnt=0;
        delay_osschedlock();                                                //阻止OS调度,防止打断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;                                //时间超过/等于要延迟的时间,则退出.
                }  
        };
        delay_osschedunlock();                                                //恢复OS调度                                                                            
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-3 18:02:31 | 显示全部楼层
可以了,从开机例程改来的

void Delay_us( __IO u32 nus )
{
        uint32_t ticks;
        uint32_t told,tnow,tcnt=0;
                             
        ticks = nus * (SystemCoreClock / 1000000);         /* 需要的节拍数 */                  
        ticks = ticks/72*100;  /* 改了后时长就对了*/        
        tcnt = 0;
        told = (uint32_t)CPU_TS_TmrRd();         /* 刚进入时的计数器值 */

        while(1)
        {
                tnow = (uint32_t)CPU_TS_TmrRd();       
                if(tnow != told)
                {       
                    /* 32位计数器是递增计数器 */   
                        if(tnow > told)
                        {
                                tcnt += tnow - told;       
                        }
                        /* 重新装载 */
                        else
                        {
                                tcnt += UINT32_MAX - told + tnow;       
                        }       
                       
                        told = tnow;

                        /*时间超过/等于要延迟的时间,则退出 */
                        if(tcnt >= ticks)break;
                }  
        }
}
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 21:32 , Processed in 0.028974 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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