| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801**||| |技术支持邮件|Gingko@vip.163.com||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V1.0 | 2020-03-06 | gingko | 初次建立 | \\ \\ ===== STM32CubeMX教程二十三——EXTI外部中断输入实验 ===== \\ 1.在主界面选择File-->New Project 或者直接点击ACCEE TO MCU SELECTOR {{ :icore4t:icore4t_cube_23_1.png?direct |}} 2.出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 在搜索栏的下面,提供的各 种查找方式,可以选择芯片内核,型号,等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32H750IBKx。 {{ :icore4t:icore4t_cube_23_2.png?direct |}} 3.配置RCC,使用外部时钟源 {{ :icore4t:icore4t_cube_23_3.png?direct |}} 4.时基源选择SysTick {{ :icore4t:icore4t_cube_23_4.png?direct |}} 5.将PA10,PB7,PB8设置为GPIO_Output {{ :icore4t:icore4t_cube_23_5.png?direct |}} 6.将ARM_KEY对应的引脚PH7设置为GPIO_EXTI7 {{ :icore4t:icore4t_cube_23_6.png?direct |}} 7.引脚模式配置 {{ :icore4t:icore4t_cube_23_7.png?direct |}} {{ :icore4t:icore4t_cube_23_8.png?direct |}} {{ :icore4t:icore4t_cube_23_9.png?direct |}} 8.设置NVIC(嵌套向量中断控制器) {{ :icore4t:icore4t_cube_23_10.png?direct |}} 9.时钟源设置,选择外部高速时钟源,配置为最大主频 {{ :icore4t:icore4t_cube_23_11.png?direct |}} 10.工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK V5.27 {{ :icore4t:icore4t_cube_23_12.png?direct |}} 11.点击Code Generator,进行进一步配置 {{ :icore4t:icore4t_cube_23_13.png?direct |}} * **Copy all used libraries into the project folder** * **将HAL库的所有.C和.H都复制到所建工程中** * 优点:这样如果后续需要新增其他外设又可能不再用STM32CubeMX的时候便会很方便 * 缺点:体积大,编译时间很长 * **Copy only the necessary library files** * **只复制所需要的.C和.H(推荐)** * 优点:体积相对小,编译时间短,并且工程可复制拷贝 * 缺点:新增外设时需要重新用STM32CubeMX导入 * **Add necessary library files as reference in the toolchain project configuration file** * **不复制文件,直接从软件包存放位置导入.C和.H** * 优点:体积小,比较节约硬盘空间 * 缺点:复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径 * 自行选择方式即可 12.然后点击GENERATE CODE 创建工程 {{ :icore4t:icore4t_cube_23_14.png?direct |}} 创建成功,打开工程。 \\ \\ ===== 实验二十三:EXTI外部中断输入实验——读取ARM按键状态 ===== ==== 一、 实验目的与意义 ==== - 了解STM32 GPIO结构。 - 了解STM32 GPIO特征。 - 掌握EXTI中断的使用方法。 - 掌握STM32 HAL库中EXTI属性的配置方法。 - 掌握KEIL MDK 集成开发环境使用方法。 ==== 二、 实验设备及平台 ==== - iCore4T 双核心板。[[https://item.taobao.com/item.htm?spm=a1z10.1-c.w137644-251734891.3.5923532fDrMDOe&id=610595120319|点击购买]] - JLINK(或相同功能)仿真器。[[https://item.taobao.com/item.htm?id=554869837940|点击购买]] - Micro USB线缆。 - Keil MDK 开发平台。 - STM32CubeMX开发平台。 - 装有WIN XP(及更高版本)系统的计算机。 ==== 三、 实验原理 ==== === 1.中断简介 === * 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 *** 中断优先权:** * 在某一时刻有几个中断源同时发出中断请求时,处理器只响应其中优先权最高的中断源。当处理机正在运行某个中断服务程序期间出现另一个中断源的请求时,如果后者的优先权低于前者,处理机不予理睬,反之,处理机立即响应后者,进入所谓的“嵌套中断”。中断优先权的排序按其性质、重要性以及处理的方便性决定,由硬件的优先权仲裁逻辑或软件的顺序询问程序来实现。 *** 中断过程:** * (1)中断源发出中断请求; * (2)判断当前处理机是否允许中断和该中断源是否被屏蔽; * (3)优先权排队; * (4)处理机执行完当前指令或当前指令无法执行完,则立即停止当前程序保护断点地址和处理机当前状态,转入相应的中断服务程序。 * (5)执行中断服务程序; * (6)恢复被保护的状态,执行“中断返回”指令回到被中断的程序或转入其他程序。 === 2.STM32 NVIC 中断优先级管理 === * CM7内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32H750并没有使用CM7内核的全部东西,而是只用了它的一部分。STM32H750xx总共有118个中断,以下仅以STM32H750xx为例讲解。 * STM32H750xx的118个中断里面,包括10个内核中断和108个可屏蔽中断,具有16级可编程的中断优先级,而我们常用的就是这108个可屏蔽中断。 * STM32H750将中断分为5个组,组0~4。该分组的设置是由SCB->AIRCR寄存器的bit10~8来定义的。具体的分配关系如下表所示: {{ :icore4t:icore4t_arm_hal_23_1.png?direct |}} * 通过这个表,我们就可以清楚的看到组0~4对应的配置关系,例如组设置为3,那么此时所有的108个中断,每个中断的中断优先寄存器的高四位中的最高3位是抢占优先级,低1位是响应优先级。每个中断,你可以设置抢占优先级为0~7,响应优先级为1或0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。 * 这里需要注意两点:第一,如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;第二,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。 === 3.STM32H7外部中断 === * STM32H7的每个IO都可以作为外部中断的中断输入口,这点也是STM32H7的强大之处。STM32H750的EXTI控制器支持78个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的屏蔽设置,其中26个有独立的触发设置。其中,前22个中断为: * 线0~15:对应外部IO口的输入中断。 * 线16:连接到PVD和AVD输出。 * 线17:连接到RTC闹钟事件。 * 线18:连接到RTC入侵检测、RTC时间戳、RTCLSE失效检测。 * 线19:连接到RTC唤醒事件。 * 线20:连接到电压比较器1。 * 线21:连接到电压比较器2。 * 其余的55个,请大家参考《STM32H7xx参考手册》第747页,Table141.EXTIEventinput mapping,从上面可以看出,中断线0-15对应外部IO口的输入中断,一共是16个外部中断线。STM32H7供IO口使用的中断线只有16个,但是STM32H7的IO口却远远不止16个,那么STM32H7是怎么把16个中断线和IO口一一对应起来的呢?于是STM32就这样设计,GPIO的引脚GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G,H,I,J,K)分别对应中断线0~15。这样每个中断线对应了最多11个IO口,以线0为例:它对应了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0,GPIOH.0,GPIOI.0,GPIOJ.0,GPIOK.0。而中断线每次只能连接到1个IO口上,这样就需要通过配置来决定对应的中断线配置到哪个GPIO上了。 * GPIO和中断线映射关系是在寄存器SYSCFG_EXTICR1~SYSCFG_EXTICR4中配置的。 * 所以我们要配置外部中断,还需要打开SYSCFG时钟。 * 在本实验中,按键的一端与STM32的GPIO(PH7)相连,另外一端接地,且PH7外接一个1K电流大小的上拉电阻。初始化时把PH7设置成输入模式,当按键弹起时,PH7由于上拉电阻的作用呈高电平;当按键按下时,PH7直接被按键短接到GND,呈低电平。因此PH7的电平变化产生下降沿,从而进入中断函数,可得到按键状态。原理图如下: {{ :icore4t:icore4t_arm_hal_23_2.png?direct |}} ==== 四、 实验程序 ==== === 1.主函数 === int main(void) { static int counter = 0; HAL_Init(); SystemClock_Config(); i2c.initialize(); axp152.initialize(); axp152.set_dcdc1(3500);//[ARM & FPGA BK1/2/6 &OTHER] axp152.set_dcdc2(1200);//[FPGA INT & PLL D] axp152.set_aldo1(2500);//[FPGA PLL A] axp152.set_dcdc4(3300);//[POWER_OUTPUT] axp152.set_dcdc3(3300);//[FPGA BK4][Adjustable] axp152.set_aldo2(3300);//[FPGA BK3][Adjustable] axp152.set_dldo1(3300);//[FPGA BK7][Adjustable] axp152.set_dldo2(3300);//[FPGA BK5][Adjustable] MX_GPIO_Init(); LED_ON; while (1) { /* 每按下一次按键触发一次中断,以LED状态表述是否触发 */ if(exti_flag == 1){ HAL_Delay(20);//消抖 if(HAL_GPIO_ReadPin(ARM_KEY_GPIO_Port, ARM_KEY_Pin) == GPIO_P IN_RESET){ exti_flag = 0; if(counter ++ % 2){ LED_ON; }else{ LED_OFF; } } } } } === 2.中断回调函数 === void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == ARM_KEY_Pin){ exti_flag = 1; } } ==== 五、 实验步骤 ==== - 把仿真器与iCore4T的SWD调试口相连(直接相连或者通过转接器相连); - 把iCore4T通过Micro USB线与计算机相连,为iCore4T供电; - 打开Keil MDK 开发环境,并打开本实验工程; - 烧写程序到iCore4T上; - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。 ==== 六、 实验现象 ==== * ARM按键每按下一次,LED状态改变一次。