将STM32的TIM作为普通定时器的方法

发布者:心连心意最新更新时间:2017-11-04 来源: eefocus关键字:STM32  TIM  普通定时器 手机看文章 扫描二维码
随时随地手机看文章

以stm32的TIM2作为例,将其配置成为普通的定时器,计时时间到即触发中断。

1:对定时器的基本配置

 先声明一个定时器配置用的结构体变量TIM_TimeBaseStructure,具体可以参考STM32提供的TIM库

TIM_TimeBaseStructure.TIM_Period = 65535;   //设置自动装载寄存器        

TIM_TimeBaseStructure.TIM_Prescaler = 100;   //分频计数     

 TIM_TimeBaseStructure.TIM_ClockDivision = 0;    

 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //选择向上递增计数  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 

 TIM_Cmd(TIM2, ENABLE);   //使能定时器计时

2:始能定时器的中断
//TIM IT enable 
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); 
注意: 
以上函数中的TIM_IT_Updata根据要使能的中断具体配置

3:打开定时器的时钟

在RCC时钟配置里一定要打开TIM2的时钟,否则定时器是不会跑的。函数表达式如下: 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

4:中断向量函数的编写 
void NVIC_Configuration(void) 

  NVIC_InitTypeDef NVIC_InitStructure; 
 #ifdef   VECT_TAB_RAM   //如果程序在ram中调试那么定义中断向量表在Ram中否则在Flash中 

   // Set the Vector Table base location at 0x20000000 
 NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
 #else   // VECT_TAB_FLASH   

   // Set the Vector Table base location at 0x08000000 
 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif 
 // Enable the TIM2 global Interrupt 
 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; 
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
 NVIC_Init(&NVIC_InitStructure); 
}

5:中断函数的编写
当有TIM2的无论哪个中断触发中断发生那么就会进入这个函数
TIM2_IRQHandler(void)
所以这个更新事件的中断判断要依靠以下语句:
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) )
余下的就与普通定时器处理方式一样了
按照以上步骤配置可以顺利进行定时器的基本定时应用


关键字:STM32  TIM  普通定时器 引用地址:将STM32的TIM作为普通定时器的方法

上一篇:STM32时钟库函数RCC_DeInit介绍
下一篇:STM32 启动代码选择以及每块字节数

推荐阅读最新更新时间:2024-03-16 15:43

stm32学习笔记(一) GPIO
战舰开发板的程序 main函数 int main(void) { delay_init(); //延时函数初始化 LED_Init(); //初始化与led连接的硬件配置 while(1) { LED0=1; LED1=1; delay_ms(300); LED0=0; LED1=0; delay_ms(300); } } delay_init();函数 void delay_init() { #ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了. u32 reload; #e
[单片机]
STM32串口如何代码实现更高效的接收消息
摘要 本文介绍设计一个环形队列数据结构以实现串口更稳定的接收消息,并有效防止丢包 。 这段时间一直在研究多旋翼飞行器,以及其它的事情,博客好外没更新,再不坚持怕真荒废了哦。 在上篇简单实现MAVLink协议的解析,并演示按照设计好的命令执行对应的事件处理,以及又加入 CRC校验,实现更稳定的通信,但在上文结束时也提到当对一个包进行解析及对应事件处理时,是不能接收新的数据,直到事件处理完成,Msg_Rev.Get 状态设置为 RECEIVING 后方能再接收新的数据。这时,当事件处理需要一定时间,而又有新的数据不断发送过来时,很容易造成数据丢失现象。 如何提高串口通信效率,并避免丢包现象了? 为提高效率,首先想到采用DMA方式,然而
[单片机]
STM32】FSMC 应用
【时间计算】 由公式:DATAST HCLK = tWRLW , DATAST= 15/13.8 ns = 1.08 ,取 1 。 再由公式((ADDSET + 1) + (DATAST + 1)) HCLK = max(tCYC, tCYC(READ)) ,即((ADDSET + 1) + (DATAST + 1)) HCLK = 66 ,算出 ADDSET = 66/13.8 - 3 = 1.7,这取 2 。 最后 得出 Address setup time: 0x1 Address hold time: 0x0 Data setup time: 0x2 。不知道这个设置是否有问题。
[单片机]
stm32 spi 疑惑解疑 1
发送时 可以通过检测SPI_SR中的TXE位,当数据寄存器里有数据时,TXE位是0,当数据全部从数据寄存器的发送缓冲区传输到移位寄存器时TXE位被置1,这时候可以再往数据寄存器里写入数据。可以通过 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) 来检测。 SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE 是库函数可以检测SPI的一些状态位。 接收时 可以通过检测SPI_SR中的RXNE位,当数据寄存器里有数据时,RXNE位是0,当数据全部从数据寄存器的接收缓冲区传输到移位寄存器时RXNE位被置1,这时候可以从数
[单片机]
正点原子STM32 LCD-TFT FSMC原理简介(13)
MIN版沒有FSMC FSMC只有F249以上版本 才支持SROM 初始化序列是 由lcd 厂家提供的 左边为画点 右边为读点 0xF800代表纯红色 这些指令都可以在ili9341的数据手册里找到 第一次读出来的数据是无效的 ------------------------------------LCD-FSMC原理----------------------------------------- HADDR 是由我们配置的 这个地址决定的 直接对应FSMC的地址总线A25-0 因为HADDR是每个地址对应一个字节,而如果你外部设备是16位宽,那么
[单片机]
正点原子<font color='red'>STM32</font> LCD-TFT FSMC原理简介(13)
解析STM32的库函数
意法半导体在推出STM32微控制器之初,也同时提供了一套完整细致的固件开发包,里面包含了在STM32开发过程中所涉及到的所有底层操作。通过在程序开发中引入这样的固件开发包,可以使开发人员从复杂冗余的底层寄存器操作中解放出来,将精力专注应用程序的开发上,这便是ST推出这样一个开发包的初衷。 但这对于许多从51/AVR这类单片机的开发转到STM32平台的开发人员来说,势必有一个不适应的过程。因为程序开发不再是从寄存器层次起始,而要首先去熟悉STM32所提供的固件库。那是否一定要使用固件库呢?当然不是。但STM32微控制器的寄存器规模可不是常见的8位单片机可以比拟,若自己细细琢磨各个寄存器的意义,必然会消耗相当的时间,并且对于程序后
[单片机]
基于STM32的串口循环队列
先说串口,这个应该都知道吧(不知道的童鞋,先把基本功学好),大部分单片机或者处理器都会带一个或者多个串口,方便进行数据的通信。 那么,串口的循环队列是什么?这里以STM32的串口为例,进行解释说明。 假设串口一次只发一个数据,这倒是简单了,每次只对这一个数据进行判断,然后处理相关指令。但现实不会一直都这么美好,很多时候你收到的可能是一大串数据,你要先小心翼翼的把它们存好,然后再依次判断这里面有哪些指令要处理。 假设你定义了一个30个元素的数组a ,每次串口收到数据都往里面存,存的时候地址加一。这个操作很简单吧,应该是都会的。 但是取的时候怎么取?你收到的指令可能是2个数据,也可能是3个数据,几种长度不一样的指令混在
[单片机]
stm32系统滴答定时器使用
1.systick介绍 Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给 操作系统 提供一个硬件上的中断(号称滴答中断)。滴答中断?这里来简单地解释一下。操作系统进行运转的时候,也会有“心跳”。它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 只要不
[单片机]
<font color='red'>stm32</font>系统滴答<font color='red'>定时器</font>使用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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