a) 目的:跟串口输入类似,不使用中断进行的IO输入效率也很低,而且可以通过EXTI插入按钮事件,本节联系EXTI中断。
b) 初始化函数定义:
void EXTI_Configuration(void); //定义IO中断初始化函数
c) 初始化函数调用:
EXTI_Configuration();//IO中断初始化函数调用简单应用:
d) 初始化函数:
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure; //EXTI初始化结构定义
EXTI_ClearITPendingBit(EXTI_LINE_KEY_BUTTON);//清除中断标志
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);//管脚选择
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//事件选择
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//触发模式
EXTI_InitStructure.EXTI_Line = EXTI_Line3 | EXTI_Line4; //线路选择
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//启动中断
EXTI_Init(&EXTI_InitStructure);//初始化
}
e) RCC初始化函数中开启I/O时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
GPIO初始化函数中定义输入I/O管脚。
//IO输入,GPIOA的4脚输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化
f) 在NVIC的初始化函数里面增加以下代码打开相关中断:
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; //通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//占先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //启动
NVIC_Init(&NVIC_InitStructure); //初始化
g) 在stm32f10x_it.c文件中找到void USART1_IRQHandler函数,在其中添入执行代码。一般最少三个步骤:先使用if语句判断是发生那个中断,然后清除中断标志位,最后给字符串赋值,或做其他事情。
if(EXTI_GetITStatus(EXTI_Line3) != RESET) //判断中断发生来源
{ EXTI_ClearITPendingBit(EXTI_Line3); //清除中断标志
USART_SendData(USART1, 0x41); //发送字符“a”
GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_2)));//LED发生明暗交替
}
h) 中断注意事项:
中断发生后必须清除中断位,否则会出现死循环不断发生这个中断。然后需要对中断类型进行判断再执行代码。
使用EXTI的I/O中断,在完成RCC与GPIO硬件设置之后需要做三件事:初始化EXTI、NVIC开中断、编写中断执行代码。
关键字:STM32 EXIT
引用地址:
STM32笔记之九:打断它来为我办事,EXIT (外部I/O中断)应用
推荐阅读最新更新时间:2024-03-16 14:31
stm32HAL库学习——UART学习笔记
这里只是简单的记录自己使用过程中的经验,并非详细阐述原理。 一、串口输出打印重定向printf,代码如下: int fputc(int ch,FILE *f) { uint8_t temp ={ch}; HAL_UART_Transmit(&huart1,temp,1,1000); return (ch); } int fgetc(FILE *f) { uint8_t ch; HAL_UART_Receive(&huart1,(uint8_t *)&ch, 1, 1000); return ch; } 用作程序调试输出时,可以使用一组宏定义,方便开发完成后关闭printf; /* 调试日志串口
[单片机]
学习STM32(1)-IO-GPIO
GPIO: STM32的(64引脚的)IO口一共有3个,分别是PA、PB、PC. STM32的IO端口可以由软件配置成8种模式: 1,输入浮空 2,输入上拉 3,输入下拉 4,模拟输入 5,开漏输出 6,推挽输出 7,推挽复用功能 8,开漏复用功能 STM32的每个IO端口都有7个寄存器来控制。他们分别是:配置模式的2个32位的端口配置寄存器CRL和CRH;2个32位的数据寄存器IDR和ODR;1个32位的置位/复位寄存器BSRR;一个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR;我们常用的IO端口寄存器只有4个:CRL、CRH、IDR、ODR。 注意(在配置STM32外设的时候,任何时候都要先使能该外设的时钟!APB
[单片机]
基于STM32和CPLD的等精度测频设计
在电子工程、资源勘探、仪器仪表等相关应用中,频率测量是电子测量技术中最基本最常见的测量之一,频率计也是工程技术人员必不可少的测量工具。但是,传统的频率测量方法在实际应用中有较大的局限性,基于传统测频原理的频率计的测量精度将随被测信号频率的变化而变化,传统的直接测频法其测量精度将随被测信号频率的降低而降低,测周法的测量精度将随被测信号频率的升高而降低。本文中提出一种基于ARM与CPLD宽频带的数字频率计的设计,以微控器STM32作为核心控制芯片,利用CPLD可编程逻辑器件,实现闸门测量技术的等精度测频。 本设计的技术指标: 测频范围:1Hz~200MHz,分辨率为0.1Hz,测频相对误差百万分之一。 周期测量:信号测量范围
[工业控制]
STM32测量外部电池电压值时参考电压解决方法
STM32 的ADC模块是一个12位的逐次逼近型 模拟数字转换器 。他有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式储存在16位数据寄存器中。 其中,ADC的供电要求是2.4V到3.6V,ADC输入范围:VREF- VIN VREF+。但是,对于小于64引脚封装的STM32芯片中,没有VREF-和VREF+引脚,采用的ADC参考电压是内部电源引脚上的输入电压,所以,这也可能造成,对于不同的锂电池、 LDO 造成不同的参考电压值,虽然STM32是可以正常工作,但是参考电压的不同,也就造成我们使用ADC采集外部模拟信号值时,无法还原真实数据。所以
[单片机]
STM32中PWM频率捕获的相关配置
先大体说一下频率捕获 根据我个人的理解 频率捕获用到计数器 当发生定时器中断时(应该就是下图的Autoreload register记满时) 在2个相邻的定时器中断记录2个值 算捕获到的信号的差值 最后的频率就是你的定时器时钟 除以你的捕获的值 当然如果直接调用官方3.5库中的PWM_Input例程中的函数直接捕获 会发现在低于大约980Hz 测量的值会非常不准(STM32F103RBT6下) 这时候就需要使用TIM_TimeBaseInit()进行预分频 参数的配置在于PSC和ARR 下面贴图 两张Prescaler改变后的图 ARR决定的是Autoreload register的装值 上面2张图显示改变PSC后
[单片机]
物联网之STM32开发三(USART串口)
内容概要: 串行通信的基本概念 串口寄存器介绍 STM32实现串口数据的收发 HAL串口库函数的使用及printf的实现 串行通信的基本概念: 内容概要: 通信的基本概念 USART介绍 串口的电路连接 串口的通信协议 同步通信和异步通信: 通信,最少要有两个对象,一个收,一个发。 同步通信:一般情况下同步通信指的是通信双方根据同步信号进行通信的方式。比如通信双方有一个共同的时钟信号,大家根据时钟信号的变化进行通信。 异步通信:是指数据传输速度匹配依赖于通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同布。 串行通信和并行通
[单片机]
STM32 关于ADC采交直流问题探讨
前沿 关于STM32采样问题,相信很多人曾遇到过这样的问题,无论是关于ADC底层相关的配置还是ADC采样方案的抉择,或者是ADC软硬件滤波算法,这里博主就自己曾做过的训练题为引申,探讨ADC采样过程中的问题。 1.ADC的认识 1.1 ADC初始化参数 /* Exported types ------------------------------------------------------------*/ /** * @brief ADC Init structure definition */ typedef struct { uint32_t ADC_Resolution;
[单片机]
【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 知识概括: 通过本篇博客您将学到: DMA工作原理 STM32CubeMX创建DMA例程 HAL库定时器DMA函数库 注意:关于cubemx的DMA配置,在DMA原理介绍中全部都有所讲解,如果有哪里不懂,请仔细阅读原理详解部分。 DMA的基本介绍 什么是DMA (DM
[单片机]