stm32的高级定时器1应用重复计数器实现长时间(一分钟一次)中断

记录下学习到的定时器中断  原来计时一分钟是让定时器一秒钟中断一次 然后搞个变量记录一下到60次就是一分钟  刚看到高级定时器有个重复计数器寄存器RCR可以设置将设置好的count重复多次  这样就可以设置成一秒种向上计数结束后不产生中断而是再重复n次后产生一次中断  n为60时即为一分钟中断一次  下面分别是f1和f4的代码

stm32f103

void TIM1_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 NVIC_InitTypeDef NVIC_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能
 
 //定时器TIM3初始化
 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 
 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim  
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
 TIM_TimeBaseStructure.TIM_RepetitionCounter = 10; 
 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
  TIM_ClearFlag(TIM1,TIM_FLAG_Update);
 TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_Trigger,ENABLE ); //使能指定的TIM1中断,允许更新中断
  
 //中断优先级NVIC设置
 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;  //TIM3中断
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
 NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


 TIM_Cmd(TIM1, ENABLE);  //使能TIMx      
}
//定时器1中断服务程序
void TIM1_UP_IRQHandler(void)   //TIM3中断
{
 if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)  //检查TIM1更新中断发生与否
  {
   
  TIM_ClearITPendingBit(TIM1, TIM_IT_Update  );  //清除TIMx更新中断标志 
  LED1=!LED1;
  }
}

TIM_TimeBaseStructure.TIM_RepetitionCounter = 10;这里就是设置重复计数器寄存器的语句 这里我设置成10次  main中的arr和psc自己设置成1秒就行了

stm32f407

void TIM1_Int_Init(u16 arr,u16 psc)
{
 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);  ///使能TIM1时钟
 
  TIM_TimeBaseInitStructure.TIM_Period = arr;  //自动重装载值
 TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //定时器分频
 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
 //TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV4; 
 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 5; 
 TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);//初始化TIM3
 TIM_ClearFlag(TIM1,TIM_FLAG_Update);
 TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_Trigger,ENABLE); //允许定时器3更新中断
 TIM_Cmd(TIM1,ENABLE); //使能定时器1
 
 NVIC_InitStructure.NVIC_IRQChannel=TIM1_UP_TIM10_IRQn; //定时器1中断
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
 NVIC_Init(&NVIC_InitStructure);
 
}

//定时器1中断服务函数
void TIM1_UP_TIM10_IRQHandler(void)
{
 if(TIM_GetITStatus(TIM1,TIM_IT_Update)==SET) //溢出中断
 {
  LED1=!LED1;//DS1翻转
 }
 TIM_ClearITPendingBit(TIM1,TIM_IT_Update);  //清除中断标志位
}

TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 5; 这里设置了5次

TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV4;这句改了一下 但是没什么用没有细究 这句注释掉好像也没影响。

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是使用STM32 HAL库驱动定时器实现10ms一次中断的示例代码: ``` #define TIM_PERIOD 999 // 定时器计数范围为0-999,即10ms #define TIM_PRESCALER ((SystemCoreClock / 10000) - 1) // 预分频器使计时器时钟为10kHz TIM_HandleTypeDef htim; void TIM_Config(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; htim.Instance = TIM3; htim.Init.Prescaler = TIM_PRESCALER; htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = TIM_PERIOD; htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_Base_Init(&htim) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_OC_Init(&htim) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_TIMING; sConfigOC.Pulse = TIM_PERIOD; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_OC_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig) != HAL_OK) { Error_Handler(); } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM3) { // 10ms中断处理代码 } } int main(void) { HAL_Init(); SystemClock_Config(); TIM_Config(); HAL_TIM_Base_Start_IT(&htim); while (1) { } } ``` 在上述代码,首先定义了`TIM_PERIOD`和`TIM_PRESCALER`宏,分别表示定时器计数范围和预分频器值。然后定义了`htim`变量作为定时器句柄。在`TIM_Config`函数,使用HAL库进行定时器的初始化和配置,使得定时器的计时周期为10ms,并且设置了定时器中断的触发方式为计数器溢出。在`HAL_TIM_PeriodElapsedCallback`回调函数,编写实际的10ms中断处理代码即可。最后在`main`函数启动定时器并进入无限循环等待中断触发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值