首先调整时钟,一般为了和stm32一样配置成72M

在system_xxx.c文件中,标准库中是写好的,直接想用哪个就解除注释就好

在50多行

/* use HXTAL (XD series CK_HXTAL = 8M, CL series CK_HXTAL = 25M) */
//#define __SYSTEM_CLOCK_HXTAL                    (uint32_t)(__HXTAL)
//#define __SYSTEM_CLOCK_24M_PLL_HXTAL            (uint32_t)(24000000)
//#define __SYSTEM_CLOCK_36M_PLL_HXTAL            (uint32_t)(36000000)
//#define __SYSTEM_CLOCK_48M_PLL_HXTAL            (uint32_t)(48000000)
//#define __SYSTEM_CLOCK_56M_PLL_HXTAL            (uint32_t)(56000000)
#define __SYSTEM_CLOCK_72M_PLL_HXTAL            (uint32_t)(72000000)
//#define __SYSTEM_CLOCK_96M_PLL_HXTAL            (uint32_t)(96000000)
//#define __SYSTEM_CLOCK_108M_PLL_HXTAL           (uint32_t)(108000000)

初始化tim与中断

f10x的基本定时器是tim5和tim6,这和st不一样,st的是tim6和tim7.
这里以tim5为例

初始化外设第一步是使能时钟

rcu_periph_clock_enable(RCU_TIMER5);

然后初始化调用init函数

image-1686203275055
image-1686203255630
首先定义一个初始化变量结构体

timer_parameter_struct htim5;

然后配置结构体变量并初始化
7200*2500,也就是250ms进一次中断
7200个系统时钟后,TIM的时钟跳一次,跳2500次进一次中断

	htim5.prescaler         = 7199;
  	htim5.alignedmode       = TIMER_COUNTER_EDGE;//对齐模式
  	htim5.counterdirection  = TIMER_COUNTER_UP;//向上计数,基本定时器只能向上计数,不用想设置其他的
  	htim5.period            = 2499;
  	htim5.clockdivision     = TIMER_CKDIV_DIV1;
  	htim5.repetitioncounter = 0;
  	timer_init(TIMER5,&htim5);

设置中断
这里设置了中断优先级和中断类型

	nvic_irq_enable(TIMER5_IRQn,0,0);
	timer_interrupt_enable(TIMER5,TIMER_INT_UP);

最后,虽然设置完了,但没有打开定时器,在需要打开定时器时再打开,不许要了就关上

timer_enable(TIMER5);//打开定时器
timer_disable(TIMER5);//关闭定时器

整体:

timer_parameter_struct htim5;

void MX_TIM5_Init(void)
{
	//定时250ms进入中断
	//16位定时器,最大数值为65535
	
	rcu_periph_clock_enable(RCU_TIMER5);
	
	htim5.prescaler         = 7199;
  htim5.alignedmode       = TIMER_COUNTER_EDGE;
  htim5.counterdirection  = TIMER_COUNTER_UP;
  htim5.period            = 2499;
  htim5.clockdivision     = TIMER_CKDIV_DIV1;
  htim5.repetitioncounter = 0;
  timer_init(TIMER5,&htim5);
	
	//timer_master_output_trigger_source_select(TIMER5,TIMER_TRI_OUT_SRC_RESET);
	
	nvic_irq_enable(TIMER5_IRQn,0,0);
	timer_interrupt_enable(TIMER5,TIMER_INT_UP);
}

设置中断服务函数

去start_gd32f10x_hd.s里面找出来中断服务函数的名字,然后去其他地方重写一下
TIMER5_IRQHandler
这里我们再写一个中断回调函数放到中断服务函数里面去,后面调代码方便

void TIMER5_IRQHandler(void)
{
	HAL_TIM_PeriodElapsedCallback(&htim5);
	timer_interrupt_flag_clear(TIMER5,TIMER_INT_UP);
}

这个中断服务函数中实现了调用回调函数和清除中断标志位

这个回调函数是自己写的,名字直接照搬了HAL库的,内容不一样

void HAL_TIM_PeriodElapsedCallback(timer_parameter_struct *htim)
{
	if(htim->period == htim5.period)没找到怎么判断中断来源,通过和其他计数器不同的设定值来判断是从哪个中断进入的
	{
    }
}

在里面写东西就行了