OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4683|回复: 0

零基础入门STM32定时器配置及其中断设置

[复制链接]

80

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
406
金钱
406
注册时间
2018-11-20
在线时间
25 小时
发表于 2019-8-12 14:39:55 | 显示全部楼层 |阅读模式
  好久没有写东西了,工作太忙都快没时间学习了。今天调试了STM32的定时器功能,STM32定时器比较多,但调试都是一样的,寄存器都是一一对应的。就拿tiM2举例说明。在网上搜了好多关于定时器的设置,但大多数都是一个版本,而且都是针对库函数操作的,让人看起来一头雾水,对于初学者很是不利(我也是初学者)。下面我将自己的定时器设置过程一一记录下来,以供大家参考,我们共同学习……
  1. <p>  首先定义定时器头文件,也就是定义寄存器以供操作:</p>
  2. <p>  #define TIM2_CR1 (*((volatile unsigned long *)0x40000000))</p>
  3. <p>  #define TIM2_CR2 (*((volatile unsigned long *)0x40000004))</p>
  4. <p>  #define TIM2_DIER (*((volatile unsigned long *)0x4000000C))</p>
  5. <p>  #define TIM2_SR (*((volatile unsigned long *)0x40000010))</p>
  6. <p>  #define TIM2_EGR (*((volatile unsigned long *)0x40000014))</p>
  7. <p>  #define TIM2_CNT (*((volatile unsigned long *)0x40000024))</p>
  8. <p>  #define TIM2_PSC (*((volatile unsigned long *)0x40000028))</p>
  9. <p>  #define TIM2_ARR (*((volatile unsigned long *)0x4000002C))</p>
复制代码

  然后配置定时器TIM2:
  1. <p>  void TIM2_Configuration(void)</p>
  2. <p>  {</p>
  3. <p>  RCC_APB1ENR|=0x00000001; //位0 IM2EN TIM2 定时器时钟使能</p>
  4. <p>  TIM2_PSC |=19999; //设置预分频,实现1ms,20M ,20000/20M</p>
  5. <p>  TIM2_ARR = 1000; //1s产生一次中断</p>
  6. <p>  TIM2_DIER |=0X1; //允许tim2更新中断</p>
  7. <p>  SETENA0|=0x10000000; //允许T2中断</p>
  8. <p>  TIM2_CR1 |=0X1;//启动tim2 相当于//TIM_Cmd(TIM2, ENABLE); //是能定时器</p>
  9. <p>  }</p>
复制代码

  注:RCC_APB1ENR,SETENA0前面的文章已经定义过
  中断函数处理:
  1. <p>  void TIM2_IRQHandler(void)</p>
  2. <p>  {</p>
  3. <p>  IF(TIM1_SR&0x01)</p>
  4. <p>  {</p>
  5. <p>  TIM1_SR&=0xFFFE; //清中断标志</p>
  6. <p>  USART1_DR=0xAA;</p>
  7. <p>  while((USART1_SR)&0x80==0);</p>
  8. <p>  }</p>
复制代码

  解释:1S中断来一次,向串口发送一字节数据0xAA;
  接下来就在main()函数中添加配置定时器就可以了:
  1. <p>  int main()</p>
  2. <p>  {</p>
  3. <p>  SystemInit0(); //系统(时钟)初始化</p>
  4. <p>  stm32_GpioSetup (); //GPIO初始化</p>
  5. <p>  stm32_UsartSetup (); //串口初始化</p>
  6. <p>  TIM2_Configuration(); //TIM1初始化</p>
  7. <p>  while(1)</p>
  8. <p>  {</p>
  9. <p>  GPIO_PORTB_ODR|=(1<<5); //LED闪烁</p>
  10. <p>  delay(10); //延时</p>
  11. <p>  GPIO_PORTB_ODR&=~(1<<5);</p>
  12. <p>  delay(10);</p>
  13. <p>  }</p>
  14. <p>  }</p>
复制代码

  当然以上TIM2的配置必须在系统(时钟)初始化以后,因为这些外设的工作要有时钟来源的,知道了时钟来源,和频率才能计算出定时的时间等参数,本程序是基于所有时钟都设置成20M来执行的。前面的几个初始化函数以及寄存器设置都是调用的前面文章中设置好的。
  好了,查看串口(9600),调试成功,1S发送1个0xAA,这样看起来是很简单,但调试的过程是艰难的,要一次次的实验,一个寄存器一个寄存器的进行配置,学习本来就是一个缓慢而且艰辛的过程,当你看到成功的结果之后发现一切的付出都是值得的。


依然给大家搞一些相应的资料供学习参考


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表