我们平时使用定时器的时候多数都是处于开启状态,平时的定时中断书写格式一般是:
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//要处理的事件内容。。。。
}
}
但是,项目的实验过程中,我使用的定时器处理事件稍微有点特殊,即,定时器不是一直处于开启状态, 而且关闭时候也是在中断里关闭。大概形式这样:
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//要处理的事件内容。。。。
TIM_Cmd(TIM3, DISABLE); //失能(函数外使能)
}
}
看似没错,而且也看似正常。但是,处理的事件内容出现了很多未知错误(由于我的这个处理事件有很强的时序性,开始和结束都比较严格),无法正常执行。通过后来的调试中发现(把处理时间改为点灯或者打印输出方式),发现是:TIM_Cmd(TIM3, DISABLE); 扰乱了时序关系。当失能后,其实中断并没有真正失能,还会再进入一次中断,因此事件又被执行了一次,对于时序比较严格的事件,就产生了问题!
找到了原因,因此,我猜测虽然定时器失能并且关闭了定时器,但是可能中断标志位并没真正清除,虽然中断开始已经清除过一次,但估计因为失能使得标志位又被置位了,因此,我在失能前面加了句清除中断更新标志位,如下:
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//要处理的事件内容。。。。
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//再清除标志位
TIM_Cmd(TIM3, DISABLE); //失能(函数外使能)
}
}
果然,程序可以正常的时序运行。
比较纳闷关定时器前又得清下标志位,因此引起了另一个好奇心,是不是在其他地方关闭定时器(如主函数),也得这样做才可以。所以对这个好奇心进行了下测试。发现:如果把关闭定时器放到了主函数后,不用再清中断标志位。能正常把定时器关闭,并不会进入中断。
通过这次的问题,浪费了很多时间解决,不过也吸取到了点经验,但对于内在真正原因:在中断里失能和中断外失能效果为什么不一样,暂时还没搞清楚。。。但这个可以作为以后的前车之鉴,以及大家的前车之鉴,少走弯路。
关键字:STM32 定时器 注意事项
引用地址:
关于STM32定时器使用的一个注意事项
推荐阅读最新更新时间:2024-03-16 15:38
限量7折!米尔STM32MP135开发板
说到 MCU 就会想到 S MT32, 而 STM32MP1 作为新一代 MPU 的典范,有着极富开创意义的异构系统架构,兼容 MPU 和 MCU 的 双重优势,入门级、性价比高、能跑 L inux 系统、应用场景丰富 等 特点,深 受业界的喜爱! 米尔电子作为 ST 官方合作伙伴,先后开发了 S TM32MP151 、 S TM32MP157 、 STM32MP13 5 系列核心板和开发板,受到广大客户的认可。 米尔为了感谢广大客户的支持,推出 STM32MP1 35 开发板打折特惠活动! 米尔基于 STM32MP1 35 开发板 限 量 7 折! 7 折!
[嵌入式]
制作一个STM32下载器的过程
本文介绍制作一个STM32下载器的过程。 原理图 STLINK-V2下载器电路原理图如下。 上图中,H5接口是固件下载口。H4接口是STLINK-V2下载口(实现下载功能的接口 T_JTCK就是SWCLK, T_JTMS就是 SWDIO)。其他都是测试接口。 制作过程 首先我们焊接完的板子是不能用的,需要往里面下载固件。前提是你手头有一块好的ST-LinkV2下载器,不然就白搞了。 使用好的STLINK-V2下载器给我们自己制作的STLINK-V2板子下载固件,将STLINK-V2下载器连接角与板子上的H5固件下载接口对应连接,再将STLINK-V2连接到电脑, 安装ST的ST-LINK Utility软件,使用STM
[单片机]
UPS设计十大注意事项
1 电源环境:单相和三相 在评估和销售流程中,掌握客户现有电源基础构架至关重要。在多数销售顾问通常注重大型三相电源系统时,大多数IT经理往往涉及的是机架级单相设备。许多现有计算机房和中小型数据中心配备了机架级的单相负载。为提高效率、减少成本,并为新实施的三相解决方案创造更多销售机遇,各种推倒重来的全新设计将焦点从三相电源转移到了利用率之上。 2. 安装环境 务必了解USP未来的部署需求。因为大多数环境可以支持多种不同的解决方案,所以需要帮助客户对此进行评估。要准备针对多种解决方案提出价值主张、功能比较和报价。 经研究表明,客户一般会选择具有更高价值的方案。如果无法提供多种方案,可提供另一种更为经济高效的方案,引入其它产品
[电源管理]
活塞式压力计的原理及注意事项
活塞式压力计是根据流体静力学平衡原理和帕斯卡定律,利用压力作用在活塞上的力与砍码的重力相平衡的原理设计而成的。由于在平衡被测压力的负荷时,采用标准珐码产生的重力,因此又被称为静重活塞式压力计。其结构如图3-8所示,主要由压力发生部分和测量部分组成。 (1)压力发生部分。压力发生部分主要指手摇泵。通过加压手轮旋转丝杆,推动工作活塞(手摇泵活塞)挤压工作液,将待测压力经工作液传给测量活塞。工作液一般采用洁净的变压器油或蓖麻油等。 (2)测量部分。测址活塞上端的菇码托盘上放有荷重菇码,活塞插人活塞筒内,下端承受手摇泵挤压工作液所产生的压力PO当作用在活塞下端的油压与活塞、托盘及珐码的质量所产生的压力相平衡时,活塞就被托起并稳定
[测试测量]
stm32读取DS2411
DS2411的读写时序和DS18B20一致,毕竟同一个公司出的。 下面是代码 源文件 ds2411.c #include ds2411.h #include delay.h #include usart.h // // //复位DS2411 void DS2411_Rst(void) { DS2411_IO_OUT(); //SET PA11 OUTPUT DS2411_DQ_OUT=0; //拉低DQ delay_us(750); //拉低750us DS2411_DQ_OUT=1; //DQ=1 delay_us(15); //15US } //等待D
[单片机]
STM32系列第14篇--TFTLCD驱动原理
ALINETEK2.8寸 TFTLCD模块特点 240*320分辨率 16位真彩显示(65536色) 自带电阻触摸屏 自带背光电路 注意:模块是3.3V供电的,不支持5V电压的MCU,如果是5VMCU,必须在信号线串接120R电阻使用。 ALINETEK2.8寸 TFTLCD接口说明(16位80并口) LCD_CS:LCD片选信号 LCD_WR:LCD写信号 LCD_RD:LCD读信号 DB :16位双向数据线。 LCD_RST:硬复位LCD信号 LCD_RS:命令/数据标志(0:命令,1:数据) BL_CTR:背光控制信号 T_MISO/T_MOSI/T_PEN/T_CS/T_CLK,触摸屏接口信号
[单片机]
让菜鸟秒变stm32高手的STM32CubeMX
菜鸟到高手,显得有些霸气哈,不过的确如此,官方带给我们一个比较实用的stm32的工具。这个工具就是STM32CubeMX,昨天玩freeRTOS的时候就提到过。说到freeRTOS,这里就多说两句。全局变量,在任务间相互访问的时候也是需要临界保护的,不然可能会出现奇怪的问题。不过我们可以关掉时间片调度,任务间可以访问全局变量而不用加保护(不等于菜鸟可以随意代码)。关闭了时间片调度,只有发生vTaskDelay的时候才会上下文切换。只要代码合理访问全局变量可以不加保护的。因此代码也不是可以任意书写的,关于freeRTOS的问题,多看看源码,一切都会有答案。源码较少,这里就不过多介绍。关闭时间片不是网上说的configUSE_TIME
[单片机]
基于STM32的全彩LED显示屏系统的设计
LED显示屏是利用LED点阵模块或像素单元组成的一种现代平面显示屏幕,具有发光效率高、使用寿命长、视角范围大、色彩丰富以及对室内外环境适应能力强等优点。20世纪80年代后期,它在全世界迅速发展起来,并很快成为大屏幕平板显示的代表性主流产品;近年来,随着蓝色LED产品价格的快速下降,全彩色LED显示屏的价格逐步降低,市场需求急剧增长,应用日益普遍。目前的LED显示屏控制系统多采用ARM处理器来完成整个系统的功能,这种控制系统在数据处理速度上存在很大的局限,影响显示效果的连续性。基于此,在分析了STM32微处理器总线结构特点的基础上,提出了STM32+FPGA的控制系统方案,该方案充分了利用STM32微处理器的灵活的储器控制技术和
[电源管理]