(一)GD32L233C-START例子程序用的是SysTick延时:
改造main函数:
while(1) {
gpio_bit_set(GPIOA, GPIO_PIN_7);
gpio_bit_set(GPIOA, GPIO_PIN_1);
delay_1ms(1);
gpio_bit_reset(GPIOA, GPIO_PIN_7);
gpio_bit_reset(GPIOA, GPIO_PIN_1);
delay_1ms(1);
}
测量PA1示波波形:
可以看出正脉冲宽度可以看出SysTick延时1.0Ms,非常精确,脉冲上升沿时间20.us,表示电平变化时间,这与示波器带宽和采样精度有关,不是GPIO电平变化 指令周期需要的时间。
(二)采用定时器延时:注意GD32L233C主频64M
计算方式: prescaler(预分频器值):64M/(63+1)=1000KHz
period(周期值) (999+1)/1000000=1ms
测定不同配置下定时器延时精度:
void TIMER5_Config(void)
{
timer_parameter_struct timer_initpara; //计时器初始化参数结构定义
rcu_periph_clock_enable(RCU_TIMER5);
timer_deinit(TIMER5);
/*prescaler(预分频器值):64M/(63+1)=1000KHz
period(周期值) (999+1)/1000000=1ms
*/
timer_initpara.prescaler = 63;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection = TIMER_COUNTER_UP;
timer_initpara.period = 999;
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_init(TIMER5,&timer_initpara);
timer_interrupt_enable(TIMER5, TIMER_INT_UP);//使能TIMER5中断
nvic_irq_enable(TIMER5_IRQn, 0);//启用TIMER5的NVIC请求,优先级为0(0~3)
timer_auto_reload_shadow_enable(TIMER5);
timer_enable(TIMER5);
}
void TIMER5_IRQHandler(void)
{
static uint8_t timer_cont=0;
if(RESET != timer_interrupt_flag_get(TIMER5, TIMER_INT_FLAG_UP))
{
gpio_bit_toggle(GPIOA, GPIO_PIN_6 | GPIO_PIN_8);
}
timer_interrupt_flag_clear(TIMER5, TIMER_INT_FLAG_UP);
}
测量PA6波形
timer_initpara.period 999,改为99,定时器产生100uS延时。
timer_initpara.period 999,改为9,定时器产生10uS延时。
可见定时器延时非常精准
本帖最后由 mameng 于 2022-1-22 20:45 编辑