STM32F1系列HAL库配置外部中断——测量pwm频率

发布者:春水碧于天最新更新时间:2022-10-19 来源: csdn关键字:STM32F1系列  外部中断  pwm频率 手机看文章 扫描二维码
随时随地手机看文章

一.中断的简单介绍

对于之前的串口配置,之所以把串口中断搁置是因为它牵扯到中断这一概念,而我觉得中断对于像我这样的初学者来说是较为难理解的概念,所以,我专门把中断这个应用拿出来。但是也是很浅显的一点点,毕竟中断牵扯的确实有点多,外部中断(EXIT),串口中断,ADC中断及各种外设中断,我并不想在这里解释太多,因为我自己还有很多地方要学习,所以把外部中断拿来分享一下。


中断

中断是指计算机正在运行程序时,出现某些意外需要主机干预,主机可以暂停正在进行的事情,转而去干预处理意外事件,等到处理完意外事件时,可以继续返回原先被暂停的事情中继续执行。


外部中断

外部中断是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时,单片机的中断系统将迫使 CPU 暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去。

(之后我们所说的中断无特殊说明均为外部中断。)

其中,我们还要理解优先级的概念,虽然我们摆脱了标准库函数中对于NVIC的各种配置(包括优先级的配置),但是还是要理解一下这个概念,如果,你设置了多个中断就需要考虑这些。


eg.打个比方,你正在吃西瓜,但是西瓜不幸让你肚子难受起来。这个时候你要去窜了 上厕所,那么,这个上厕所就是意外事件,打断了你吃西瓜的事情,并且,上厕所这个事的优先级比吃西瓜要高,所以,你必须中断吃西瓜,而应该选择更重要的事窜 ,可是,这时你妈妈敲门表示要进屋,这个优先级就更高了,你要先给妈妈开门,再去上厕所。等你上完了,这个中断事件完全结束,你又可以返回吃西瓜的状态了可能你还要窜。

“道理我都懂,单片机上怎么触发呢?”

我们这时需要一个中断源,他可能是按键,或者ADC等等,通过外部连接我们的IO口,实际上连接到我们单片机的控制模块上。我使用的STM32F103ZETx,144个IO口,对应16根中断线,其中是怎么运行的呢?

在STM32中文参考手册V10上表明了他的工作方式,我们可以看到PX对应的数字就是EXIT的中断线数字标号,这也同时说明了,如果我们使用PA0为中断对应IO,EXIT0就被用掉了,PB0再用中断IO就不可以了,而这些都是在EXIT的寄存器里修改的,(我只能说寄存器yyds),


在这里插入图片描述

而在这张图的注释一中有关AFIO的注释,这与我们的GPIO可是不同,如果你看过库函数,对这个问题感兴趣,可以钻研一下,GPIO是不复用的通用输入输出引脚,而在原理图上一个引脚可能会有不同功能,这时要关注它挂在APB1还是APB2总线上,在这里给大家一个传送门供大家参考,以后有机会再赘述。STM32F103:什么时候需要复用IO(AFIO)?

下面我会演示用外部中断接收来自信号发生器的PWM信号。


二.CUBEMX相关配置

1.初始化引脚

最好在此之前打开之前配置好的uart工程,如果你想使用 PA1 作为外部中断的接收引脚,那么你只需要点击 PA1,在点击它对应的 GPIO_EXTIx。

在这里插入图片描述

这里我用used label注明PWM,以便我之后在中断函数中调用。


使能中断

在GPIO里点击PA1,在下面configuration按图操作

这个地方与此前不同的地方在于 GPIO mode。

External Interrupt Mode with Rising edge trigger detection//上升沿触发

External Interrupt Mode with Falling edge trigger detection//下降沿触发

External Interrupt Mode with Rising/Falling edge trigger detection//上升沿或下降沿触发

注意标黄的地方,是外部中断,与后面的EVENT事件中断不一样,我们每接收一次PWM波中上升沿就进一次中断,之后pull down(拉低),以便再次接收到上升沿信号。

在这里插入图片描述

点击NVIC,勾选EXIT line1 interrupt使能(ENBALE),

在这里插入图片描述

Project Manager配置在之前我的文章里配置GPIO

之后检查无误后点击

在这里插入图片描述

生成代码文件。


3.添加相关代码

在你的/* USER CODE BEGIN 4 */与/* USER CODE END 4 */之间添加


void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 

{


}


这是我们的外部中断回调函数,直接放在这里,其中加入我们的判断与中断相关操作,比如我们在这里判断检测的引脚是否接收到了GPIO_Pin_0的中断触发信号,这时我们将设置一个每检测一次就自增的值


if(GPIO_Pin == PWM_Pin) 

{ // 判断触发引脚是否是定义的引脚

pwm_value++;

}


/* USER CODE BEGIN PV */

int pwm_value=0;

/* USER CODE END PV */


main函数中添加


while (1){

pwm_value = 0; // pwm_value置0,这个是必须要做的,数据要刷新

HAL_Delay(1000); // 延时1s

printf("[tmain]info:pwm_value=%drn",pwm_value); // 读取pwm_value

}


编译并运行,将信号发生器输出端连接在PA1上,再与单片机共地。

改变频率值,效果如图:

在这里插入图片描述
在这里插入图片描述

关键字:STM32F1系列  外部中断  pwm频率 引用地址:STM32F1系列HAL库配置外部中断——测量pwm频率

上一篇:STM32F1系列启动过程简单讲解
下一篇:STM32F1系列HAL库配置串口通信(2)——串口重定向以及log信息格式输出

推荐阅读最新更新时间:2024-11-06 11:15

51单片机学习之外部中断
前天,学到中断,也中断了。昨天也没学。今天,开始试中断查询方式,竟然不对,从网上找资料,还是不对,和定时器中断一样,感觉不应该有啥问题,就是不对。 不知突然看到,我的while(1)后写个分号,编译竟然能通过。我后头可是大括号,还有东西呢啊!果然,分号一去,OK了。坑姐啊! void Main() { EA=1; //全局中断开 EX0=1; //外部中断0开 IT0=1; //1是边沿触发,0为低电平触发 while(1) { if(IE0) { Speak1=~Speak1; IE0=0; } } } 中断
[单片机]
LPC21xx系列外部中断寄存器
LPC2114有4个外部中断,分别为EINT0、EINT1、EINT2、EINT3,具有4个相关得寄存器。外部中断输入可以用于将处理器从掉电模式唤醒。 EXTINT是外部中断标志寄存器 。当一个管脚选择使用外部中断功能时,对应在EXTMODE和EXTPOLAR寄存器中得位选择得电平或边沿将置位EXTINT寄存器的中断标志。这样来向VIC提出中断请求,如果管脚中断使能,则产生中断。低4位与外部中断引脚EINT3、EINT2、EINT1、EINT0对应,为1时表示外部中断有效。可以通过软件对其相应位写入1清零标志位。电平激活方式下,该方式只有在管脚处于无效状态时才有效。一旦EINT0 ~EINT3中的一位被置位并开始执行相应代码时
[单片机]
MSP432笔记——按键中断
GPIO按键外部中断 所用板卡 MSP432P401R LaunchPad 按键电路图 按键连接GPIO P1.1 P1.4 按键按下时,对应IO变化为低电平,按键必须使用上拉电阻 程序编写 使用库函数 driverLib main中需要的步骤 { 设置IO输入/输出方向,带上拉电阻的输入模式 清除中断标识位,在配置时就需要清除标志位 设置中断触发边沿,上升沿/下降沿 使能GPIO中断 使能总中断(3个中断函数) } main源码 int main(void) { /* Stop Watchdog */ MAP_WDT_A_holdTimer(); //GPIO Interrupt test
[单片机]
MSP432笔记——按键中断
基于STM32F103入门3——外部中断
外部中断 基本概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生),那么CPU就会暂停当前的工作(A事件),去执行B事件(中断响应和中断服务),然后B事件做完之后,再回到原来的事件(A事件)中继续工作。(中断的返回)。 简单的说就是 比如你在家看电视,突然电话响了(中断),然后又突然有人敲门(又另一个中断),这时,你是不是应该先不看电视,先去接电话,然后去开门,然后再回来看电视呢? 当然 电话响和有人敲门 你先去干哪个 取决于你觉得哪个更重要,更应该先去做。这个属于中断嵌套。 框图 功能说明 外部中断的配置 代码编写步骤 1:打开相应的时钟 1.1:GPIO的时钟 2.2:功能复用IO的
[单片机]
基于STM32F103入门3——<font color='red'>外部中断</font>
STM32CubeMX生成基于HAL库的Can收发配置
HAL库 的应该用比较新潮,经常找不到资料。今天说说,在CAN开发中的应用。 一,发送。 static HAL_StatusTypeDef Can_MsgSend(uint32_t ID,uint8_t * pData,uint8_t len) { HAL_StatusTypeDef retSTD; canTxMsg.StdId=ID;//0x500|(GetLocalID()&0xFF); canTxMsg.IDE=CAN_ID_STD; canTxMsg.RTR=CAN_RTR_DATA; canTxMsg.DLC=len; memcpy(canTxMsg.Data,pData,len); SendErrorCount
[单片机]
STM32中PWM频率捕获的相关配置
先大体说一下频率捕获 根据我个人的理解 频率捕获用到计数器 当发生定时器中断时(应该就是下图的Autoreload register记满时) 在2个相邻的定时器中断记录2个值 算捕获到的信号的差值 最后的频率就是你的定时器时钟 除以你的捕获的值 当然如果直接调用官方3.5库中的PWM_Input例程中的函数直接捕获 会发现在低于大约980Hz 测量的值会非常不准(STM32F103RBT6下) 这时候就需要使用TIM_TimeBaseInit()进行预分频 参数的配置在于PSC和ARR 下面贴图 两张Prescaler改变后的图 ARR决定的是Autoreload register的装值 上面2张图显示改变PSC后
[单片机]
51单片机中断系统(中断系统原理,外部中断,定时器中断,串口通信)
自己整理的详细知识点,以后配置定时器中断,串口通信不用再东找西找了。直接一文全打尽!!!因为从Word直接复制过来图片上传不了,所以直接截图上传。
[单片机]
51单片机中断系统(中断系统原理,<font color='red'>外部中断</font>,定时器中断,串口通信)
STM32F2系列EXTI使用
1.外部中断事件线的映射 140个GPIO连接到了16个外部中断/事件线,如下图所示: GPIO与外部中断/事件线关联图 另外7个外部中断/事件线分别连接: EXTI Line 16:PVD输出; EXTI Line 17:RTC报警事件; EXTI Line 18:USB OTG FS唤醒事件; EXTI Line 19:以太网唤醒事件; EXTI Line 20:USB OTG HS唤醒事件; EXTI Line 21:RTC Tamper and TimeStamp事件 EXTI Line 22:RTC唤醒事件。 2.EXTI与SYSCFG(System configuration
[单片机]
STM32F2<font color='red'>系列</font>的<font color='red'>EXTI</font>使用
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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