STM32
直播中

楼斌

8年用户 872经验值
私信 关注
[问答]

如何去编写STM32通用定时器更新事件中断的代码

STM32通用定时器是怎样去更新事件中断的?
如何去编写STM32通用定时器更新事件中断的代码?

回帖(1)

冯虎虔

2021-11-16 12:00:04
  //定时器3中断服务程序
  void TIM3_IRQHandler(void)
  {
  if(TIM3-》SR&0X0001) //产生更新事件
  {
  LED1=!LED1;
  LED0=!LED0;
  }
  TIM3-》SR&=~(1《《0);//清除中断标志位
  }
  //通用定时器中断初始化
  //这里时钟选择为APB1的2倍,而APB1为36M
  //arr:自动重装值。
  //psc:时钟预分频数
  //这里使用的是定时器3!
  void Timerx_Init(u16 arr,u16 psc)
  {
  TIM3-》SMCR&=0xfffffff8; //从模式控制寄存器设置预分频时钟由内部时钟提供
  RCC-》APB1ENR|=1《《1; //TIM3时钟使能
  TIM3-》ARR=arr; //设定计数器自动重装值
  TIM3-》PSC=psc; //预分频器7200,得到10Khz的计数时钟,//CK_CNT=Fck_psc/([15:0]+1)
  TIM3-》CR1|=1《《4; //计数器向下计数
  TIM3-》CR1|=1《《7; //每一次更新事件(UEV)时,才把预装在寄存器的内容送到影子寄存器
  TIM3-》CR1&=0xfffffffd; //设置UDIS允许更新事件(UEV)
  TIM3-》CR1&=0xfffffffb; //设置更新请求源
  TIM3-》CR1|=0x01; //使能计数器
  TIM3-》DIER|=1《《0; //允许更新中断
  MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2
  }
  int main(void)
  {
  Stm32_Clock_Init(9); //系统时钟设置72MHZ
  delay_init(72); //延时初始化
  uart_init(72,9600); //串口初始化
  LED_Init(); //初始化与LED连接的硬件接口
  Timerx_Init(5000,7199);//10Khz的计数频率,计数到5000为500ms
  while(1)
  {
  delay_ms(200);
  TIM3-》EGR|=0x0001;
  }
  }
  这样设置以后,个人做了测试,可以在计数器在计数到2000时,设置了TIM3-》EGR|=0x0001;更新事件发生,并产生了更新事件中断,同时,对计数器重新初始化。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分