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

发布者:anluran最新更新时间:2022-12-27 来源: zhihu关键字:STM32  定时器配置  中断设置 手机看文章 扫描二维码
随时随地手机看文章

  我们大家都知道STM32定时器比较多,但调试都是一样的,寄存器都是一一对应的。就拿tiM2举例说明。在网上搜了好多关于定时器的设置,但大多数都是一个版本,而且都是针对库函数操作的,让人看起来一头雾水,对于初学者很是不利(我也是初学者)。下面我将自己的定时器设置过程一一记录下来,以供大家参考,我们共同学习……


  首先定义定时器头文件,也就是定义寄存器以供操作:


  #define TIM2_CR1 (*((volatile unsigned long *)0x40000000))

  #define TIM2_CR2 (*((volatile unsigned long *)0x40000004))

  #define TIM2_DIER (*((volatile unsigned long *)0x4000000C))

  #define TIM2_SR (*((volatile unsigned long *)0x40000010))

  #define TIM2_EGR (*((volatile unsigned long *)0x40000014))

  #define TIM2_CNT (*((volatile unsigned long *)0x40000024))

  #define TIM2_PSC (*((volatile unsigned long *)0x40000028))

  #define TIM2_ARR (*((volatile unsigned long *)0x4000002C))

  然后配置定时器TIM2:


  void TIM2_Configuration(void)

  {

  RCC_APB1ENR|=0x00000001; //位0 IM2EN TIM2 定时器时钟使能

  TIM2_PSC |=19999; //设置预分频,实现1ms,20M ,20000/20M

  TIM2_ARR = 1000; //1s产生一次中断

  TIM2_DIER |=0X1; //允许tim2更新中断

  SETENA0|=0x10000000; //允许T2中断

  TIM2_CR1 |=0X1;//启动tim2 相当于//TIM_Cmd(TIM2, ENABLE); //是能定时器

  }

  注:RCC_APB1ENR,SETENA0前面的文章已经定义过


  中断函数处理:


  void TIM2_IRQHandler(void)

  {

  IF(TIM1_SR&0x01)

  {

  TIM1_SR&=0xFFFE; //清中断标志

  USART1_DR=0xAA;

  while((USART1_SR)&0x80==0);

  }

  解释:1S中断来一次,向串口发送一字节数据0xAA;


  接下来就在main()函数中添加配置定时器就可以了:


  int main()

  {

  SystemInit0(); //系统(时钟)初始化

  stm32_GpioSetup (); //GPIO初始化

  stm32_UsartSetup (); //串口初始化

  TIM2_Configuration(); //TIM1初始化

  while(1)

  {

  GPIO_PORTB_ODR|=(1<<5); //LED闪烁

  delay(10); //延时

  GPIO_PORTB_ODR&=~(1<<5);

  delay(10);

  }

  }


  当然以上TIM2的配置必须在系统(时钟)初始化以后,因为这些外设的工作要有时钟来源的,知道了时钟来源,和频率才能计算出定时的时间等参数,本程序是基于所有时钟都设置成20M来执行的。前面的几个初始化函数以及寄存器设置都是调用的前面文章中设置好的。


  好了,查看串口(9600),调试成功,1S发送1个0xAA,这样看起来是很简单,但调试的过程是艰难的,要一次次的实验,一个寄存器一个寄存器的进行配置,学习本来就是一个缓慢而且艰辛的过程,但是当你看到LED在闪烁,串口上收到数据时,说有的付出都是值得的,天道酬勤,一切困难都是纸老虎!


关键字:STM32  定时器配置  中断设置 引用地址:零基础入门STM32定时器配置及其中断设置

上一篇:STM32时钟分解与解析
下一篇:GPIO做为输出时操作方法--stm32备忘

推荐阅读最新更新时间:2024-11-11 16:56

STM32学习记录17 串口一键下载
1.MCUISP串口软件一键下载设置: DTR低电平复位,RTS高电平进入bootload串口下载 在ch340芯片对应DTR和RTS输出电平与电脑软件设置的电平相反。一键下载电路根据ch340芯片对应引脚的控制信号完成对应功能具体实现过程如下: 2.单片机启动设置单片机低电平复位 Boot0=0,boot1=x,从用户区flash启动Boot0=1,boot1=0,进入串口下载区Boot0=1,boot1=1,从SRAM启动改变boot0电平就可以从不同区域启动 3.一键下载电路如下: 4.当MUCISP软件点击下载后(需要选中下载后执行):DTR#,RTS#信号由MUCISP软件控制MUCISP软件设置为:
[单片机]
<font color='red'>STM32</font>学习记录17 串口一键下载
安全启动 - STM32安全启动应用
安全启动实现了信任根。 为了整体安全的需要,需要将信任传递到下一级。这个信任传递是通过加解密技术完成的。 在启动时,我们要至少保证下一级固件的完整可靠性。意味着,我们要使用认证技术,对用户固件进行验证。对用户固件进行验证可以使用哈希函数,也可以使用基于对称密钥的验证码 AES-GCM。 系统在安全启动前,需要保存已经烧录到 Flash 里的用户固件的哈希值。这个哈希值,通过前面所提到的 STM32 安全技术,保证它不会被内外攻击所改变。 系统在安全启动时,利用前面所构造的安全执行环境,对需要进一步执行的用户固件,进行一个哈希运算。哈希运算一般是采用 SHA256。 系统比较这两个值。如果计算出来的哈希值,与存储的哈希值相同,我们
[单片机]
STM32与SD卡通信各层分析
最近做了一些STM32和SD卡通信的一些思考,一直以来SD的驱动和应用困扰了我很久,寒假的时候看到SD简化版物理层协议的时候就傻掉了,看到SD的驱动快3000行的代码也动摇了。这几天几种地看了一下SD卡的相关内容,总结了一些体会,感觉也没有那么恐怖了。我决定从分层上来讨论SD的驱动和应用,因为这样可以构建一个清晰的逻辑,且不知哪位计算机大师曾说过:一切计算机问题都可以用分层的方法来解决。 我自己把SD卡从驱动到应用共分为4层,从下至上依次为:驱动层、物理层、文件系统层、应用层。下面一一来介绍各层的一些重要的操作。 1)驱动层 驱动层,对应到ST的库,就是stm32f10x_sdio.c/.h这个两文件。其实使用任何一个ST
[单片机]
stm32变量的定义
一、最近在玩stm32,用库(V3.5.0)开发,被 stm32的变量定义搞的晕头转向,决心将其弄清楚。 在 stdint.h 文件里,我们可以清楚的看到: typedef signed char int8_t; typedef signed short int int16_t; typedef signed int int32_t; typedef signed __int64 int64_t; typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned
[单片机]
<font color='red'>stm32</font>变量的定义
STM32读取MQ2烟雾浓度数据判断烟雾是否超标
【1】MQ2传感器是什么? MQ2传感器是一种可探测多种气体的传感器,常用于监测烟雾、液化气、丙酮、乙醇、甲醛、天然气等有害气体。MQ2传感器基于半导体敏感元件,通过检测气体中有害物质的浓度变化来实现气体检测。 MQ2传感器具有以下特点: 可靠性高:采用优质半导体敏感元件,响应速度快、灵敏度高。 响应时间快:在检测到有害气体时能够立即发出警报。 易于集成:小巧轻便,易于安装和集成到各种设备中。 价格低廉:相对于其他气体检测传感器,MQ2传感器的价格较为低廉。 MQ2传感器广泛应用于家庭、工业、医疗、环保等领域,帮助人们实时监测气体浓度,保障生命健康和财产安全。 【2】MQ2传感器浓度如何转换?
[单片机]
STM32 FSMC TFT LCD
STM32+SSD1963+TFT(FSMC)已调试通过的代码。 其中要注意的两点: 1.外部访问地址需加volatile,否则keil MDK 优化会将部分代码优化掉,造成错误。  volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。 2. FSMC内部地址和外部实际地址有区别。如A18连线对应内部地址是A19。 // ssd1963 #d/c -------- STM32F103VCT6 A18 #define LCD_COMM_ADD *((v
[单片机]
stm32官方编码器例程pid实现
最近在调试编码器,用的貌似是官方给出的例程,但是在做pid的时候遇到困难,不知道该如何在此基础上实现pid,有大神指教吗? #define ENCODER_TIMER TIM3 // Encoder unit connected to TIM3 #define ENCODER_TIM_PERIOD (u16)32 //line of encoder #define COUNTER_RESET (u16)0 #define ICx_FILTER (u8) 6 // 6 - 670nsec static volatile u16 hEncoder_Timer_Overflow; static u8 Du
[单片机]
STM32 FreeRTOS Keil环境搭建
由于FreeRTOS的官方已经支持STM32F1X系列的Cortex-M3的移植,所以只需要在Keil IDE中设置相关即可了; 在Keil中新建一工程,在工程中新建3个组,分别对应3个目录用来存放:user、rtos、stmlib user中添加用户自己的代码和头文件; rtos中添加rots的文件主要有:list.c、task.c、queue.c、head_2.c、port.c stmlib中添加STM32官方提供的STM32操作的lib库(注意stm32f10x_md.s中的内容和替换为FreeRTOS Demo 中的STM32F10X.s否则系统调度不能正常工作) 另外需要把FreeRTOS/source/inc
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved