完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
EXTI外部中断
STM32外部中断介绍 外部中断线与112个IO口的对应关系 112个IO口每个都可以与各自所属的外部中断线相连接,由于只有16个外部中断线,因此每7个IO口使用一个外部中断线,例如:PA4,PB4,PC4……PG4共有EXTI4中断控制总线。由于是共有,因此在任何时候只有PA4,PB4,PC4……PG4其中一个IO口占用外部中断线。 中断服务函数简介 外部中断与中断事件请求的原理 中断执行的流程
这里要特别分清楚两个库函数:
我们可以从上面的流程可以得知:
中断&事件
外部I/O触发AD转换,来测量外部物品的重量;如果使用传统的中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;要是使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果;相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务了。 为什么要在中断服务函数中清除中断标志位? 如果进入中断不清除标志位,那么这一中断服务程序结束后由于标志位还是置位的并且中断是允许的,那么还会再次进入该中断,就会发生一直在执行中断程序的情况。 为什么配置中断功能时要在APB2中使能AFIO相关功能? 与AFIO 相关的寄存器
重映射与端口复用的区别
代码示例 Main.c #include "led.h" #include "exti.h" #include "key.h" #include "stm32f10x.h" int main() { LED_InitConfig(); KEY_InitConfig(); EXTI_InitConfig(); while(1); } void EXTI4_IRQHandler() { if(EXTI_GetITStatus(EXTI_Line4) == SET) // 如果中断标志位为1,说明中断触发 { LED0 = !LED0; } EXTI_ClearITPendingBit(EXTI_Line4); // 清除中断标志位 } LED.c #include "led.h" #include "stm32f10x.h" void LED_InitConfig() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB的外部时钟 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 配置LED0的属性 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_5); // 初始化LED0的电平 } LED.h #ifndef _LED_H #define _LED_H #include "sys.h" void LED_InitConfig(); #define LED0 PBout(5) #endif KEY.c #include "key.h" #include "stm32f10x.h" void KEY_InitConfig() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); // 使能GPIOE的时钟 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 配置KEY0的属性 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStructure); } KEY.h #ifndef _KEY_H #define _KEY_H void KEY_InitConfig(); #endif EXTI.c #include "exti.h" #include "key.h" #include "stm32f10x.h" void EXTI_InitConfig() { NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; KEY_InitConfig(); // 初始化KEY0 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 配置中断分组 NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; // 配置中断优先级,使能中断通道 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4); // 配置GPIO端口引脚与中断线的关系 EXTI_InitStructure.EXTI_Line = EXTI_Line4; // EXTI外部中断初始化配置 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_Init(&EXTI_InitStructure); } EXTI.h #ifndef _EXTI_H #define _EXTI_H void EXTI_InitConfig(); #endif |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1760 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1613 浏览 1 评论
1058 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
721 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1932浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
724浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
564浏览 3评论
590浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
548浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 18:13 , Processed in 0.973046 second(s), Total 99, Slave 83 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号