打印

GD32F303问题

[复制链接]
1564|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
学徒小卢|  楼主 | 2023-12-2 21:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题背景是这样的:
配置了一个20Khz的定时器溢出中断,System_cnt_add()函数是对一个变量++,就是创建了一个时间基准。然后在Task_time_slice_function()函数里面实现了一个led每0.5s翻转的任务。
于是遇到了这样一个问题:
当我把这个Task_time_slice_function()函数放在中断的时候,led能够正常实现每0.5s翻转的操作,也就是输出一个1Hz的方波。但是当我把Task_time_slice_function()函数放在main函数的while循环里面时,功能就失效了,变成输出32Hz的方波。有没有人知道怎么回事,希望能指点一下,谢谢!
这是用到的几个函数
int main(void)
{
        Systemclock_config();
        nvic_config();
        gpio_config();
        spi2_config();
        timer_config();
      
        System_cnt_init();
      
        while(1)
        {
                        Task_time_slice_function();
        }
}


/* time0 20kHz*/
void TIMER0_UP_IRQHandler(void)
{                                                      
                if(SET == timer_interrupt_flag_get(TIMER0, TIMER_INT_UP))
                {
                        timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);
                       
                        System_cnt_add();
               
                }
}


void Task_time_slice_function(void)
{
        /* 1ms */
        if(_abs(systemclock_data.systemclock_cnt - systemclock_data.systemclock_lastcnt_1ms) >= systemclock_data.systemclock_cnt_1ms)
        {
                systemclock_data.systemclock_lastcnt_1ms = systemclock_data.systemclock_cnt;
                led_main();
        }
        /* 10ms */
        if(_abs(systemclock_data.systemclock_cnt - systemclock_data.systemclock_lastcnt_10ms) >= systemclock_data.systemclock_cnt_10ms)
        {
                systemclock_data.systemclock_lastcnt_10ms = systemclock_data.systemclock_cnt;
               
        }
        /* 100ms */
        if(_abs(systemclock_data.systemclock_cnt - systemclock_data.systemclock_lastcnt_100ms) >= systemclock_data.systemclock_cnt_100ms)
        {
                systemclock_data.systemclock_lastcnt_100ms = systemclock_data.systemclock_cnt;
        }
        /* 1000ms */
        if(_abs(systemclock_data.systemclock_cnt - systemclock_data.systemclock_lastcnt_1000ms) >= systemclock_data.systemclock_cnt_1000ms)
        {
                systemclock_data.systemclock_lastcnt_1000ms = systemclock_data.systemclock_cnt;
               
        }
}

使用特权

评论回复
沙发
jcky001| | 2024-1-31 10:33 | 只看该作者
您遇到的问题可能与中断处理和主循环的时间分配有关。

使用特权

评论回复
板凳
cr315| | 2024-1-31 10:34 | 只看该作者
减少主循环中的其他代码的执行时间,以便为Task_time_slice_function()函数留出更多时间。您可以考虑优化代码或减少不必要的操作。

使用特权

评论回复
地板
elephant00| | 2024-1-31 10:34 | 只看该作者
将Task_time_slice_function()函数放在一个独立的线程中运行,使其不受主循环的影响。这样,即使主循环中的其他代码执行时间较长,Task_time_slice_function()函数仍将按照预期的频率执行

使用特权

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

本版积分规则

2

主题

3

帖子

0

粉丝