首先调整时钟,一般为了和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函数
首先定义一个初始化变量结构体
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)没找到怎么判断中断来源,通过和其他计数器不同的设定值来判断是从哪个中断进入的
{
}
}
在里面写东西就行了