GD32毫秒和微秒延时函数

#include "gd32f4xx.h"

/**
 * @Author: ChenSong
 * @description: 毫秒级延时函数,使用系统的滴答定时器实现
 * @param {volatile uint32_t} cnt 延时时间(单位:毫秒)
 * @return {*}
 */
void bsp_delay_ms(volatile 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/1000;
        while(SysTick->VAL > u32end)
        {
        }
    }
    SysTick->CTRL = (SysTick->CTRL & (~SysTick_CTRL_ENABLE_Msk));
}


/**
 * @Author: ChenSong
 * @description: 微秒级延时函数,使用系统的滴答定时器实现
 * @param {volatile uint32_t} cnt 延时时间(单位:微秒)
 * @return {*}
 */
void bsp_delay_us(volatile 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/1000000;
        while(SysTick->VAL > u32end)
        {
        }
    }
    SysTick->CTRL = (SysTick->CTRL & (~SysTick_CTRL_ENABLE_Msk));
}
### 关于GD32单片机延时函数导致程序卡死的解决方案 当遇到GD32单片机上的延时函数造成程序卡死的情况,通常是因为阻塞式的延时函数影响了系统的实时响应能力。为了防止这种情况发生,可以考虑采用非阻塞方式来实现延时。 #### 使用定时器中断替代阻塞式延时 通过配置定时器并利用其产生的周期性中断事件来进行计数,可以在不占用CPU资源的情况下完成延时操作。具体做法是在每次进入定时器中断服务程序ISR时增加一个全局变量`tick`,该变量用于记录已经过去的毫秒数。应用程序可以根据此变量判断是否达到了所需的延时时长[^2]。 ```c volatile uint32_t tick = 0; void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); tick++; } } // 初始化定时器以每1ms触发一次更新中断 void timer_init() { // 配置代码省略... } ``` #### 实现非阻塞性质的微秒毫秒延时接口 对于需要精确到微妙级别的短时间间隔,则仍然可以直接调用硬件循环等待指令;而对于更长时间跨度下的延迟需求则建议改写成轮询形式: ```c uint32_t get_tick() { return tick; } /// @brief 微妙级别延时 void delay_us(uint32_t us) { __IO uint32_t temp; for(temp=us*8;temp!=0;temp--) asm volatile ("nop"); } /// @brief 毫秒级别延时(非阻塞版本) void delay_ms_nonblocking(uint32_t ms) { static uint32_t start_time = 0; start_time = get_tick(); while ((get_tick()-start_time)<ms); } ``` 上述方法不仅解决了传统阻塞型延时带来的弊端,还提高了整个嵌入式应用系统的效率与稳定性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值