库函数 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));
}
但愿你能看的懂这个代码,并知道怎么用。
这个代码只是个权宜之计。
你没用好的话,还是会受库函数里调用的delay函数影响而失效 阻塞延迟实现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 是 系统时钟,自己宏定义 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);
}
} https://bbs.21ic.com/icview-3272088-1-1.html可以看看这个帖子
页:
[1]