siliconnect 发表于 2023-2-21 15:40

库函数 delay1ms 和 systick 冲突问题

本帖最后由 siliconnect 于 2023-2-21 15:41 编辑

发现要SysTick_IRQHandler1秒中断实现就不能
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   u32Cnt
* \retvalvoid
*/
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);
                }
}

6552918 发表于 2023-2-22 17:28

https://bbs.21ic.com/icview-3272088-1-1.html可以看看这个帖子
页: [1]
查看完整版本: 库函数 delay1ms 和 systick 冲突问题