1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
外部中断通用I/O映像
中断处理函数分配 EXTI寄存器一览 以下图片全部摘自STM32中文参考手册 中断屏蔽寄存器(EXTI_IMR) 往对应的位写1就是开启中断,写0就是关闭中断 例如开放来自线0上的中断请求 EXTI-》IMR|=1《《0;//开放来自线0上的中断请求 事件屏蔽寄存器(EXTI_EMR) 参考**中断屏蔽寄存器(EXTI_IMR)**的操作 上升沿触发选择寄存器(EXTI_RTSR) 设置对应的外部中断触发事件为上升沿 上升沿就是电平从0到1 例如允许输入线0上的上升沿触发 EXTI-》RTSR|=1《《0;//允许输入线0上的上升沿触发 下降沿触发选择寄存器(EXTI_FTSR) 设置对应的外部中断触发事件为下降沿 下降沿就是电平从1到0 例如允许输入线0上的下降沿触发 EXTI-》FTSR|=1《《0;//允许输入线0上的下降沿触发 软件中断事件寄存器(EXTI_SWIER) 对应位写1则触发中断 挂起寄存器(EXTI_PR) 这个寄存器和SR寄存器差不多,都是检查相应的中断是否发生,不同的是清除的方式 外部中断配置寄存器 1(AFIO_EXTICR1) 外部中断配置寄存器 2(AFIO_EXTICR2) 外部中断配置寄存器 3(AFIO_EXTICR3) 外部中断配置寄存器 4(AFIO_EXTICR4) 实例操作 这里我们开启外部中断线0上的PA0 步骤 1)开启PA的时钟,配置IO RCC-》APB2ENR|=1《《2;//使能PA时钟 GPIOA-》CRL&=0XFFFFFFF0;//PA0配置清零 GPIOA-》CRL|=0X00000008;//PA0下拉输入 GPIOA-》ODR|=0《《0;//PA0下拉 2)开启复用时钟,设置 IO 口与中断线的映射关系 RCC-》APB2ENR|=1《《0;//开启复用辅助时钟 AFIO-》EXTICR[0]&=~(0XF《《0);//清除原来的设置 AFIO-》EXTICR[0]|=0《《0;//外部中断0映射到PA0上 特别注意这里的AFIO-》EXTICR寄存器的编号 3)开启外部中断线上中断,设置触发条件 EXTI-》IMR|=1《《0;//开放来自线0上的中断请求 EXTI-》RTSR|=1《《0;//允许输入线0上的上升沿触发 4)配置中断分组(NVIC),并使能中断 MY_NVIC_Init(2,3,EXTI0_IRQn,2); //抢占2,子优先级3,组2 5)编写中断服务函数 //外部中断0服务程序 void EXTI0_IRQHandler(void) { delay_ms(10); //消抖 if(GPIOA-》IDR&1《《0) //PA0按下 { LED1=!LED1; } EXTI-》PR=1《《0; //清除线0上的中断标志位 } 源文件 EXTI.C #include “EXTI.h” #include “delay.h” #include “led.h” void exti_init(void) { RCC-》APB2ENR|=1《《2;//使能PA时钟 GPIOA-》CRL&=0XFFFFFFF0;//PA0配置清零 GPIOA-》CRL|=0X00000008;//PA0下拉输入 GPIOA-》ODR|=0《《0;//PA0下拉 RCC-》APB2ENR|=1《《0;//开启复用辅助时钟 AFIO-》EXTICR[0]&=~(0XF《《0);//清除原来的设置 AFIO-》EXTICR[0]|=0《《0;//外部中断0映射到PA0上 EXTI-》IMR|=1《《0;//开放来自线0上的中断请求 EXTI-》RTSR|=1《《0;//允许输入线0上的上升沿触发 MY_NVIC_Init(2,3,EXTI0_IRQn,2); //抢占2,子优先级3,组2 } //外部中断0服务程序 void EXTI0_IRQHandler(void) { delay_ms(10); //消抖 if(GPIOA-》IDR&1《《0) //PA0按下 { LED1=!LED1; } EXTI-》PR=1《《0; //清除线0上的中断标志位 } EXTI.H #ifndef __EXTI_H #define __EXTI_H #include “sys.h” void exti_init(void); #endif MAIN.C #include “sys.h” #include “usart.h” #include “delay.h” #include “led.h” #include “EXTI.h” int main(void) { Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 uart_init(72,115200); //串口初始化为115200 led_init(); //LED初始化 exti_init(); //EXTI初始化 while(1) { LED0=!LED0; //LED0用来指示程序正在运行 delay_ms(200); } } 结果 LED0(红灯)闪烁,代表程序正在运行。 按下PA0之后,PA0电平由0变到1,LED1亮(绿灯)。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1780 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1081 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1679 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
556浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 20:25 , Processed in 1.114190 second(s), Total 77, Slave 61 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号