查看: 6750|回复: 4

FM33G0XX系列的systick定时器中断如何配置?

[复制链接]

2

主题

4

帖子

38

积分

初级工程师

Rank: 1

积分
38
发表于 2019-5-6 16:06:42 | 显示全部楼层 |阅读模式
以下是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;
            }
        }  
    }
}



回复

使用道具 举报

34

主题

111

帖子

1544

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1544
发表于 2019-5-13 09:03:18 | 显示全部楼层
这个配置应该对系统时钟没有影响。
UART不对有观测波形,能确定波特率不对吗?
回复

使用道具 举报

1

主题

6

帖子

17

积分

初级工程师

Rank: 1

积分
17
发表于 2020-4-26 17:17:19 | 显示全部楼层
请问能用这个来延时3s这样的么?我也用的这种方式,但中断是关闭的,只能延时1s就不能了,不知道问题出在哪
回复

使用道具 举报

1

主题

6

帖子

17

积分

初级工程师

Rank: 1

积分
17
发表于 2020-4-26 17:18:59 | 显示全部楼层
请问能用这个来延时3s这样的么?我也用的这种方式,但中断是关闭的,只能延时1s就不能了,不知道问题出在哪
回复

使用道具 举报

221

主题

397

帖子

3543

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3543
QQ
发表于 2020-4-26 19:12:49 | 显示全部楼层
Orchid 发表于 2020-4-26 17:18
请问能用这个来延时3s这样的么?我也用的这种方式,但中断是关闭的,只能延时1s就不能了,不知道问题出在哪 ...

因为程序中开了IWDT看门狗,要看一下看门狗的配置周期默认下是2s,当你这边延时3s时会看门狗复位
回复

使用道具 举报

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

本版积分规则

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