|
以下是systick定时器的中断函数,配置为1ms中断,并编写了两个延时函数,路过的朋友帮忙看看这样配置错误在哪? (我配置后,整个系统时钟不对了,表现为uart发送数据,出现了乱码)
/*
-->cpu滴答定时器配置( 1ms 中断模式)
-->软件延时函数ms和us采用计数方式,不对tick定时器进行设置,因此
改配置既能使用中断,又能使用软件延时()软件延时都是存在误差的
*/
void Init_SysTick(void)
{
SysTick_Config(__SYSTEM_CLOCK/1000);//定时1ms 中断
}
void SysTick_Handler(void)// 1ms中断
{
}
void TicksDelayMs(uint32_t n,uint8_t* m)
{
while(n--)
{
TicksDelayUs(1000);
}
}
void TicksDelayUs(uint32_t n)
{
uint32_t ticks;
uint32_t told;
uint32_t tnow;
uint32_t tcnt = 0;
uint32_t reload;
reload = SysTick->LOAD;
ticks = n * (__SYSTEM_CLOCK/1000000); /* 需要的节拍数 */
tcnt = 0;
told = SysTick->VAL; /* 刚进入时的计数器值 */
while (1)
{
tnow = SysTick->VAL;
if (tnow != told)
{
/* SYSTICK是一个递减的计数器 */
if (tnow < told)
{
tcnt += told - tnow;
}
/* 重新装载递减 */
else
{
tcnt += reload - tnow + told;
}
told = tnow;
/* 时间超过/等于要延迟的时间,则退出 */
if (tcnt >= ticks)
{
break;
}
}
}
}
|
|