打印
[技术问答]

库函数 delay1ms 和 systick 冲突问题

[复制链接]
902|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 siliconnect 于 2023-2-21 15:41 编辑

发现要SysTick_IRQHandler  1秒中断实现就不能
delay函数,否则config变调了。
用了delay可以了,实际改变了SysTick_Config的配置

如何才能  既可以中断  SysTick_IRQHandler  
又可以   库函数那些delay10us, delay100us, delay1ms 都能同时用呢?

SysTick_Config(SystemCoreClock); //SystemCoreClock=4000000
void SysTick_IRQHandler(void)
{
;  //1s中断
}


/**
* \brief   delay100us
*          delay approximately 100us.
* \param   [in]  u32Cnt
* \retval  void
*/
void delay100us(uint32_t u32Cnt)
{
    uint32_t u32end;
   
    SysTick->LOAD = 0xFFFFFF;
    SysTick->VAL  = 0;
    SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
   
    while(u32Cnt-- > 0)
    {
        SysTick->VAL = 0;

        u32end = 0x1000000 - SystemCoreClock/10000;
        while(SysTick->VAL > u32end)
        {
            ;
        }
    }
   
    SysTick->CTRL = (SysTick->CTRL & (~SysTick_CTRL_ENABLE_Msk));
}

使用特权

评论回复
沙发
wubangmi| | 2023-2-21 18:01 | 只看该作者

但愿你能看的懂这个代码,并知道怎么用。
这个代码只是个权宜之计。
你没用好的话,还是会受库函数里调用的delay函数影响而失效

使用特权

评论回复
板凳
jinyiheng| | 2023-2-21 19:29 | 只看该作者
阻塞延迟实现delay1ms
void delay1ms(uint32_t u32Count)
{
    __IO uint32_t i;
    const uint32_t u32Cyc = (HCLK_VALUE + 10000UL - 1UL) / 10000UL;

    while (u32Count-- > 0UL)
                {
                        i = u32Cyc;
                        while (i-- > 0UL)
                        {
                                i--;
                                if( i == 0 )
                                        break;
                        }
    }
}
HCLK_VALUE 是 系统时钟,自己宏定义

使用特权

评论回复
地板
ddxx| | 2023-2-21 22:02 | 只看该作者
void delay1ms(uint32_t u32Cnt)
{
                uint32_t u32Cur, u32End, u32Mod;
       
                SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
       
                if ((SysTick->CTRL & SysTick_CTRL_ENABLE_Msk) != SysTick_CTRL_ENABLE_Msk)
                {
                                SysTick->LOAD = 0xFFFFFF;
                                SysTick->VAL  = 0;
                                SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
                }
                u32Mod = SysTick->LOAD + 1;
                while(u32Cnt-- > 0)
                {
                                uint32_t u32Turn = 0;
                                u32Cur = SysTick->VAL;
                                u32End = (u32Cur - SystemCoreClock / 1000) % u32Mod;
                                if (u32Cur < SystemCoreClock / 1000)
                                                u32Turn = (SystemCoreClock / 1000 - u32Cur) / u32Mod;
                                do
                                {
                                                while(SysTick->VAL > u32End) {;}
                                } while (u32Turn -- > 0);
                }
}

使用特权

评论回复
5
6552918| | 2023-2-22 17:28 | 只看该作者
https://bbs.21ic.com/icview-3272088-1-1.html  可以看看这个帖子

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

90

帖子

0

粉丝