想要达到延时的效果,又不想让他在那里阻塞,有时候就需要抛弃delay()函数
想要配置好精准非阻塞延时,配置timer1定时器前,需要知道系统的主频率为多少,需要查看datasheet的时钟树,这里是84MHZ
接下来直接上代码
一、timer1.h
#ifndef TIMER1_H
#define TIMER1_H
#include "gd32f3x0.h"
void timer1_config(void);
#endif
二、timer1.c
#include "timer1.h"
void timer1_config(void)
{
timer_parameter_struct timer_parameter_structure;
rcu_periph_clock_enable(RCU_TIMER1); //时钟使能
timer_deinit(RCU_TIMER1); //复位
//GD32F3x0 主频为84MHZ 如果是其他芯片,需要看datasheet来查看主频率
timer_parameter_structure.prescaler=84-1;
timer_parameter_structure.period=1000-1; //分频之后,定时器每1ms进入一次中断
timer_parameter_structure.counterdirection=TIMER_COUNTER_UP; //向上计数
timer_parameter_structure.repetitioncounter=1; //重复计数次数
timer_init(TIMER1,&timer_parameter_structure);
timer_interrupt_enable(TIMER1,TIMER_INT_UP); //中断触发方式为溢出中断,也就是说向上计数 到达999了
nvic_irq_enable(TIMER1_IRQn,0,1);
timer_enable(TIMER1);
}
三、中断处理
volatile uint32_t timer_num1=0; //用来控制LED的闪烁
void TIMER1_IRQHandler(void)
{
if(timer_interrupt_flag_get(TIMER1,TIMER_INT_FLAG_UP) != RESET)
{
timer_interrupt_flag_clear(TIMER1,TIMER_INT_FLAG_UP); //清楚中断标志位
timer_num1++; // 计数累加 方便在主函数中调用
}
}
四、main.c
#include "gd32f3x0.h"
#include "gd32f330f_start.h"
#include "systick.h"
#include "led.h"
#include "timer1.h"
extern volatile uint32_t timer_num1;
int main(void)
{
systick_config();
Led6Init();
timer1_config();
while(1)
{
if(timer_num1==500)
{
gpio_bit_toggle(GPIOB,GPIO_PIN_9); //实现LED灯的闪烁
timer_num1=0;
}
}
}