porttimer.c 1).xMBPortTimersInit 是用来初始化定时器的,modbus-rtu需要有一个定时器来计算每个字节之间的间隔时间,若间隔时间超过3.5T,则是认为此帧已经接收完毕。
此处的
timerBaseInit.TIM_Period = usTim1Timerout50us - 1;
timerBaseInit.TIM_Prescaler = 1799;// 50us
周期是重复次数,是在定时器中断为50us的前提下的重复次数,一般在波特率≤19200的情况下,公式为:
usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate );
在大于19200的情况下,固定为35.
TIM_Period 和TIM_Prescaler 传入的时候 都要减一才准确。此处我的时钟是TIM2,所以挂载APB1上,APB1我设置为最大的3600MHz。因此当分频为1800的时候,刚刚好是50us中断一次,所以分频设置为1799. BOOL xMBPortTimersInit( USHORT usTim1Timerout50us )
{
TIM_TimeBaseInitTypeDef timerBaseInit;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_DeInit(TIM2); //重新将Timer设置为缺省值
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);// 使能Timer2外设时钟
//TIM_InternalClockConfig(TIM2); //采用内部时钟给TIM2提供时钟源
// TIM2
timerBaseInit.TIM_Period = usTim1Timerout50us - 1;
timerBaseInit.TIM_Prescaler = 1799;// 50us
timerBaseInit.TIM_CounterMode = TIM_CounterMode_Up;
timerBaseInit.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2, &timerBaseInit);
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清标志
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //中断使能
TIM_Cmd(TIM2, DISABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;//响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//允许中断
NVIC_Init(&NVIC_InitStructure);
return TRUE;
}
|