如题,最近做一个通信协议,要求超时后重传或放弃通信。
使用的是stm32f103,以前都是用Timer1做循环定时,没有问题,这次把循环想改为:调用一次超时,时间到后定时器自动停止并进入中断,下一次在调用定时函数,再定时一次。
[mw_shl_code=c,true]//定时器1初始化函数
void Timer1_Init(uint16_t u16Time_ms)
{
RCC->APB2ENR|=BIT11; //TIM1时钟使能
TIM1->ARR=u16Time_ms*10; //设定计数器自动重装值, 如5000×0.1msx10=5000ms中断一次,这里放大了10倍
TIM1->  SC=7199; //预分频器7200,得到10KHz[100us=0.1ms]的时钟
TIM1->CR1 |=BIT0; //使能定时器
TIM1->DIER|=BIT0; //允许更新中断,即溢出中断
}
//定时器1中断服务程序
void TIM1_UP_IRQHandler(void)
{
static uint8_t only=0;//--------------------这里定义了一个变量来解决定时器初始化后就进一次中断问题
if(TIM1->SR&BIT0)//溢出中断
{
if(only)
{
only=0;
//下面做其他处理
TIM1->CR1 &=~BIT0;//关闭定时器
}
only++;
}
TIM1->SR &=~BIT0;//清除中断标志位
}[/mw_shl_code]
每次调用 如下形式即可。
[mw_shl_code=c,true]Timer1_Init(3000);//超时设置为3秒[/mw_shl_code]
遇到到问题:
1、现在定时器每调用(初始化)一次,调用完后就进入中断一次[好像不止一次],导致定时不准确,怎么不让他初始化后就进去呢?
2、我看手册,timer有单次触发模式,这个模式能否解决我的问题或者实现我的功能呢?
3、是不是每次都得初始化一次定时器,能否只重载某个寄存器即可实现再次定时呢?
|