完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
*STM32学习之外部中断实验粗略了解
刚开始粗略的学习STM32,写博客就当是学习笔记,简单的记录一下自己的学习过程。//文章是根据正点原子寄存器版中断实验进行撰写 对于外部中断STM32有一个优点就是它的每一个I/O口都可以当作外部中断的输入口,在使用过程中不用去考虑I/O端口的问题。 线1~15:对应外部IO口的输入中断。 线16:连接到PVD输出。 线17:连接到RTC闹钟事件。 线18:连接到USB唤醒事件。 现在暂时先考虑前十六个中断线(0~~15),16~18暂不考虑。 I/O端口有很多个但是中断线却是只有6个,这时候就要考虑端口与线的映射关系。如下图 (黄色标记需注意角标的变化,红色的线则是是说明在该中断线中只能有一个I/O端口进行中断输入) 每个PX有16个I/O端口正好和中断线对应。 中断线可以设置三种触发方式 (1)上升沿触发 (2)下降沿触发 (3)边沿触发 以及使能!!!!! 一、中断线与服务函数的关系 在这里要注意不是所有的中断线都有独立的函数来控制*//为什么不是一一对应? void EXTI0_IRQHandler(void)是外部中断 0 的服务函数, void EXTI1_IRQHandler(void)是外部中断 1 的服务函数, void EXTI2_IRQHandler(void)是外部中断 2 的服务函数, void EXTI3_IRQHandler(void)是外部中断 3 的服务函数, void EXTI4_IRQHandler(void)是外部中断 4 的服务函数, void EXTI9_5_IRQHandler(void)是外部中断 9~5 的服务函数, void EXTI15_10_IRQHandler(void)是外部中断 15~10 的服务函数 在这其中前位线有独立的服务函数,而第6~10则是共用一个函数,第10—15则是另一个函数。 1、void EXTI0_IRQHandler(void)//示例基于正点原子STM32 F103mini版 { delay_ms(10); //延时 10ms 以消抖 if(WK_UP==1) //再检测 WK_UP 是否还是为高电平 { LED0=!LED0; LED1=!LED1; } EXTI-》PR=1《《0; //清除已经发生的中断请求 }` 二、初始化I/O端口为中断输入与设置优先级 这里要用到两个函数: 1、void Ex_NVIC_Config(u8 GPIOx, u8 BITx, u8 TRIM) 只针对GPIOA~G;不包括PVD,RTC和USB唤醒,且一个函数对应一个I/O口,多个则需要多次调用!!! — 比如我们要设置GPIO PA0为上升沿触发则: Ex_NVIC_Config(GPIO_A,0,RTIR); —再比如我们要设置GPIO PB4为下降沿触发: Ex_NVIC_Config(GPIO_B,4,FTIR); 2、void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) /NVIC_PreemptionPriority:抢占优先级 NVIC_SubPriority :响应优先级 NVIC_Channel :中断编号 NVIC_Group :中断分组 0~4/ 此函数为设置优先级的高低,要注意两点: 第一, 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行; 第二, 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。 而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。 以下是函数内容 void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) { u32 temp; MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组 temp=NVIC_PreemptionPriority《《(4-NVIC_Group); temp|=NVIC_SubPriority&(0x0f》》NVIC_Group); temp&=0xf; //取低四位 NVIC-》ISER[NVIC_Channel/32]|=(1《《NVIC_Channel%32);//使能中断位(要清除的话,相反操作就OK) NVIC-》IP[NVIC_Channel]|=temp《《4; //设置响应优先级和抢断优先级 } 代码中涉及到了几个中断寄存器; ISER[8]:这是一个中断使能寄存器组,要使能某个中断,必须设置相应的 ISER 位为 1,使该中断被使能。 ICER[8]:是一个中断除能寄存器组。 IP[240]:是一个中断优先级控制的寄存器组,对于STM32来说这是一个十分重要的寄存器!IP 寄存器组由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,而 STM32 只用到了其中的 68 个。可屏蔽中断占用的 8bit 并没有全部使用,而是 只用了高 4 位。这 4 位,又分为抢占优先级和子优先级,抢占优先级在前,子优先级在后。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1602 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1536 浏览 1 评论
967 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
680 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1579 浏览 2 评论
1861浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
642浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
514浏览 3评论
528浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
501浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 16:36 , Processed in 0.867061 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号