问题:在调STM32的程序的时候,发现定时器(timer2)比自己设定的中断周期缩小了一倍。设定为10ms中断一次,但实测发现5ms便中断了一次。
初始化代码如下:
void InitTimer2(void)
{
RCC->APB1ENR|=0x01; //enable clock,max clock=36M
TIM2->PSC=71; // counter clock CK_CNT=72M/(71+1)=1M
TIM2->ARR=10000; // 10000*1us=10ms
TIM2->CR1 |=0x0080; //Auto-reload preload enable
TIM2->EGR |=0x0001; //Re-initialize the counter and generates an update of the registers.
TIM2->DIER|= 0x0001; //Update interrupt enabled
TIM2->CR1 |=0x01; //enable timer2
}
中断服务函数如下:
void TIM2_IRQHandler(void)
{
TIM2->SR&=0xfffe;//位置一
DS[1].js++;
if(DS[1].js>500)
{
DS[1].en=1;
DS[1].js=0;
}
//TIM2->SR&=0xfffe;
//位置二
}
原因分析:
如上图代码框架,通过多次试验发现,当中断服务函数中执行较少时,把中断清除操作放到位置二,一般也是没有问题,但当服务函数中执行较多时,会发现进行中断的周期会被缩小一半,当把中断清除操作放到位置一时,会发现定时准了。
根据以上现象的猜想如下:
内核为72MHZ,而外设时钟频率最大为36MHZ,当在中断服务函数执行且未及时清除中断标志时,内核发现还未进行中断,便再次启动了,中断函数,此时便会发生此类现象。此说法仅为臆断,只为更好记住此应用。
结论:在进入中断后首先要清除中断标志。
关键字:STM32 定时器中断 清除中断
引用地址:
STM32定时器中断关于何时清除中断的总结
推荐阅读最新更新时间:2024-03-16 15:38
如何在STM32中要实现数据通讯
在stm32中要实现数据通讯,首先要设置相关的寄存器,这里不做相关的介绍,直接说代码相关的能内容及相关函数对应的用法。 直接上代码。 1.串口通讯代码 usart.h #ifndef __USART_H #define __USART_H #include stdio.h #include sys.h #define USART_REC_LEN 200 //定义最大接收字节数 200 #define EN_USART3_RX 1 //使能(1)/禁止(0)串口1接收 extern u8 USART_RX_BUF ; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 ex
[单片机]
工程师实战干货分享:77条STM32知识汇总
以下是工程师结合自己的工作实战经验分享,总共有77条STM32知识汇总,建议收藏!SYSCLK时钟源有三个来源:HSI RC、HSE OSC、PLL等。 1、 SYSCLK时钟源有三个来源:HSI RC、HSE OSC、PLL 2、 MCO 可以提供4源不同的时钟同步信号,PA8 3、 GPIO口貌似有两个反向串联的二极管用作钳位二极管。 4、 ICode总线,DCode总线、系统总线、DMA总线、总线矩阵、AHB/APB桥 5、在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟 6、 STM32复位有三种:系统复位、上电复位、备份区域复位。其中系统复位除了RCC_CSR中
[单片机]
基于STM32智能门禁系统(阿里云)
1. 前言 随着社会进步,生活质量提高,尤其是网络技术和计算机越来越和我们的生活紧密联系,这给社会的信息化的安全带来了很多新挑战,有些简单身份识别方式,因其局限性逐渐暴露出其自身缺点,人们开始寻找更加安全性的身份识别方式,由于生物特征具有唯一性和确定性并能随身携带,简单易用等优点,用生物特征确认所有者信息一直是人们所注重的身份识别方式,尤其是近年来智能科技的飞速发展,人们慢慢得不再满足门锁、钥匙、门禁卡等手工安防设备,所以在人类社会发展过程中指纹识别技术应运产生。指纹识别技术具有很强的优势:指纹是人体的一大特点,人类指纹相同的概率几乎为零,等同于说指纹是每个人生来就有、无可替代的密码。因此我相信指纹识别技术一定前景广阔,深受用户喜
[单片机]
STM32单片机(12) 红外信号接收解码(外部中断)
本程序主要利用外部中断,实现红外遥控器信号接收解码,并利用串口通信把编码传至计算机显示 注:请用质量好点的遥控器实验,用了劣质遥控器浪费了一天时间,数据位接收总是不完整,后来用宿舍空调遥控器就解码成功了 相关资料 STM32单片机学习(2) 外部中断 http://blog.csdn.net/leytton/article/details/38063335 STM32单片机学习(3) 串口中断通信 http://blog.csdn.net/leytton/article/details/38393553 STM32单片机学习(7) 串口通信printf重定向 http://blog.csdn.net/leytton/ar
[单片机]
STM32 F1 TIM4 4通道PWM同时输出
void TIM4_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //
[单片机]
【stm32】时钟树解析
STM32时钟系统 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 用户可通过多个预分频器配置AHB总线、高速APB2总线和低速APB1总线的频率。AHB和APB2域的最大频率是7
[单片机]
stm32寄存器之spi2读写sd卡
看完sd卡读写,我也忍不住自己试一试 使用spi1的时候,程序运行成功,但是当我尝试用spi2 的时候,一次一次的fail,现在总结发现本身错在这几个地方,其中也有一些地方是大家的普遍错误: 1,自己尝试硬件的时候,一定要把硬件先连接好,这个是基础保障,不能急 2,spi1 的时钟是接在APB2上,是72MHZ,而spi2的时钟是接在APB1上的,是36MHZ 所以从SPI1转移到SPI2时一定要注意分频的问题 3,在学习板上使用spi接口的时候,一定要禁用掉使用这个接口的其余模块,我自己的学习板上就是,nrf2401与vs1003都用了SPI2接口,我的是要禁用掉vs1003就可以,禁用方法就是把vs10
[单片机]
stm32 printf输出到USART1
/************************头文件*****************************************/ #include stm32f10x_lib.h //包含所有的头文件 #include stdio.h /*******************************位绑定定义*****************************************/ //#define GPIOA_ODR_A (GPIOA_BASE+0x0C) //#define GPIOA_IDR_A (GPIOA_BASE+0x08) //#define GPIOB_ODR_A (GPIOB
[单片机]