STM32f103c8t6的定时器配置定时中断

31 篇文章 4 订阅
//时间计算公式

Tout = ((arr+1*(psc+1))/Tclk ;

其中:
 Tclk:定时器的输入时钟频率(单位MHZ)
 Tout:定时器溢出时间(单位为us)

  .TIM_Period = arr;           eg;4999
  .TIM_Prescaler = psc;        eg:7199

  Tout = ((4999+1)×(7199+1))/72 = 500000us = 500ms    。


/*
1,时钟使能
2,配置预分频、自动重装值和重复计数值
3,清除中断标志位(否则会先进一次中断)
4,使能TIM中断,选择中断源
5,设置中断优先级
6,使能TIMx外设

arr:自动重装值  
psc:时钟预分频数  
*/
void Timer1_Init(u16 arr,u16 psc)  

{  

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  
  NVIC_InitTypeDef NVIC_InitStructure;  
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能  
  
  TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载寄存器周期值  
  TIM_TimeBaseStructure.TIM_Prescaler =(psc-1);//设置预分频值 
  TIM_TimeBaseStructure.TIM_ClockDivision = 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(      //使能或者失能指定的TIM中断  
    TIM1,            //TIM1  
    TIM_IT_Update  | //TIM 更新中断源  
    TIM_IT_Trigger,  //TIM 触发中断源   
    ENABLE           //使能  
    );  
    
  //设置优先级  

  NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;    
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//先占优先级0级  
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       //从优先级0级  
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  NVIC_Init(&NVIC_InitStructure);   

  TIM_Cmd(TIM1, ENABLE);  //使能TIMx外设  
}  


void TIM1_UP_IRQHandler(void)   //TIM1中断
{
	if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查指定的TIM1中断发生与否:TIM1 中断源 
	{
	   TIM_ClearITPendingBit(TIM1, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM1 中断源 
	   
	   /* 这里写中断 */
	
	}
}



  • 16
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是stm32f103c8t6定时器1定时中断配置代码,供您参考: ```c #include "stm32f10x.h" void TIM1_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 使能TIM1时钟 TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 时钟预分频值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟分频因子 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; // 重复计数器 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); // TIM1溢出中断允许 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; // TIM1中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // TIM1中断允许 NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM1, ENABLE); // TIM1使能 } void TIM1_UP_IRQHandler(void) { if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) // TIM1溢出中断 { TIM_ClearITPendingBit(TIM1, TIM_IT_Update); // 清除TIM1溢出中断标志位 // TODO: 在此处添加中断处理代码 } } int main(void) { TIM1_Configuration(); while (1) { // TODO: 在此处添加主函数代码 } } ``` 在此代码中,定时器1的时钟预分频值为72-1,自动重装载值为1000-1,即当计数器计数到1000时触发中断中断处理函数为`TIM1_UP_IRQHandler()`,在其中添加需要执行的中断处理代码即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值