之前对GD32105R的串口进行了测试体验,感觉很满意,为了达到移植FreeModbus的目的还需要定时器的配合(判断一帧数据是否传输结束),那么今天就对GD32的定时器1进行简单的测试体验一把。
定时器,顾名思义就是起定时提醒的作用,他在我们的生活中起到举足轻重的作用,不知道诸君是否需要定闹钟,楼主这种屌丝每天早上是要定两三个闹钟的,否则无疑会起床失败进而导致上班迟到,楼主是多么羡慕那些上班不用打卡的人们啊!惭愧。。。
还是按照STM32习惯,对GD32的定时器1进行初始化配置,首先是定时周期的设定,为了便于观察LED的变化状态,楼主设定GD32的定时周期为500ms,即每500ms进一次定时中断,在中断中翻转一次LED的指示状态,具体配置如下:
/************************************************************************************* ** 函数名称 :void Timer1Init(void) ** 函数功能 :定时器1初始化函数, 500ms定时 **串口:起始位1 数据位8 无校验位 停止位1 **波特率:9600 3.5个字符时间为3.65ms **波特率:115200 3.5个字符时间为0.304ms 测试定时器,暂时修改定时周期为500ms。 ***************************************************************************************/ void Timer1Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); //打开定时器时钟 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定时器1 设置 72分频 1MHz 向上计数 定时0.1ms TIM_TimeBaseStructure.TIM_Period =9999 ; //16位的值,最大65536 TIM_TimeBaseStructure.TIM_Prescaler =3599; //3600分频 即为20KHz,16位的值,最大65536 TIM_TimeBaseStructure.TIM_ClockDivision =0x00; //TIM_CKD_DIV1;//0; //时钟分频系数,不分频 TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_RepetitionCounter= 0; //周期计数器的值 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //初始化定时器 TIM_ClearFlag(TIM1,TIM_FLAG_Update); TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE); //开定时器中断 TIM_Cmd(TIM1, ENABLE); //使能定时器1 } /* 使能TIM1中断 */ NVIC_InitStructure.NVIC_IRQChannel=TIM1_UP_TIM16_IRQn; //TIM1_UP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure);/********************************************************************************************************* ** 函数名称 :void Timer1_Exception(void) ** 函数功能 :定时器1中断服务函数,用来检测串行通讯中接收完1帧数据是否结束 **测试用例,中断中闪烁LED *********************************************************************************************************/ void Timer1_Exception(void) { TIM_ClearITPendingBit(TIM1,TIM_FLAG_Update);//请中断 static unsigned char i=0; if(i==1) { GPIO_SetBits(GPIOC,GPIO_Pin_6); /* 点亮LED */ i=0; } else { GPIO_ResetBits(GPIOC,GPIO_Pin_6); /* 熄灭LED */ i=1; } }调试截图:
实物连接图:
经过简单的测试,一切运行正常,为移植FreeModbus彻底扫清了障碍,下一步就要进行移植测试了。。。