| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801**||| |技术支持邮件|Gingko@vip.163.com||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V1.0 | 2020-11-25 | gingko | 初次建立 | \\ \\ ===== STM32CubeMX教程四——EXTI外部中断输入实验 ===== 1.在主界面选择File-->New Project或者直接点击ACCEE TO MCU SELECTOR {{ :icore3l:icore3l_cube_4_1.png?direct |}} 2.出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置在搜索栏的下面,提供的各 种查找方式,可以选择芯片内核,型号等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F429IGHx。 {{ :icore3l:icore3l_cube_4_2.png?direct |}} 3.配置RCC,使用外部时钟源 {{ :icore3l:icore3l_cube_4_3.png?direct |}} 4.Debug选择Serial Wire,时基源选择SysTick {{ :icore3l:icore3l_cube_4_4.png?direct |}} {{ :icore3l:icore3l_cube_4_5.png?direct |}} 5.将PI3、PI4、PH14设置为GPIO_Output {{ :icore3l:icore3l_cube_4_6.png?direct |}} 6.将ARM_KEY对应的引脚PG9设置为GPIO_EXTI9 {{ :icore3l:icore3l_cube_4_7.png?direct |}} 7.引脚模式配置 {{ :icore3l:icore3l_cube_4_8.png?direct |}} {{ :icore3l:icore3l_cube_4_9.png?direct |}} 8.设置NVIC(嵌套向量中断控制器) {{ :icore3l:icore3l_cube_4_10.png?direct |}} 9.时钟源设置,选择外部高速时钟源,配置为最大主频 {{ :icore3l:icore3l_cube_4_11.png?direct |}} 10.工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可IDE我们使用的是 MDK V5.27 {{ :icore3l:icore3l_cube_4_12.png?direct |}} 11.点击Code Generator,进行进一步配置 {{ :icore3l:icore3l_cube_4_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创建工程 {{ :icore3l:icore3l_cube_4_14.png?direct |}} 创建成功,打开工程。 \\ \\ \\ \\ ===== 实验四:EXTI外部中断输入实验——读取ARM按键状态 ===== ==== 一、实验目的与意义 ==== - 了解STM32 GPIO结构 - 了解STM32 GPIO特征 - 掌握EXTI中断的使用方法 - 掌握STM32 HAL库中EXTI属性的配置方法 - 掌握KEIL MDK 集成开发环境使用方法 ==== 二、实验设备及平台 ==== - iCore3L 双核心板 - JLINK(或相同功能)仿真器 - Micro USB线缆 - Keil MDK 开发平台 - STM32CubeMX开发平台 - 装有WIN XP(及更高版本)系统的计算机 ==== 三、实验原理 ==== === 1.中断简介 === * 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 中断优先权: * 在某一时刻有几个中断源同时发出中断请求时,处理器只响应其中优先权最高的中断源。当处理机正在运行某个中断服务程序期间出现另一个中断源的请求时,如果后者的优先权低于前者,处理机不予理睬,反之,处理机立即响应后者,进入所谓的“嵌套中断”。中断优先权的排序按其性质、重要性以及处理的方便性决定,由硬件的优先权仲裁逻辑或软件的顺序询问程序来实现。 中断过程: * (1)中断源发出中断请求; * (2)判断当前处理机是否允许中断和该中断源是否被屏蔽; * (3)优先权排队; * (4)处理机执行完当前指令或当前指令无法执行完,则立即停止当前程序保护断点地址和处理机当前状态,转入相应的中断服务程序。 * (5)执行中断服务程序; * (6)恢复被保护的状态,执行“中断返回”指令回到被中断的程序或转入其他程序。 === 2.外部中断/时间控制器(EXTI)外部中断 === * 外部中断 / 事件控制器包含23根用于产生中断 / 事件请求的边沿检测中断线。每根中断线都可以独立配置以选择触发事件(上升沿触发、下降沿触发或边沿触发),并且可以单独屏蔽。挂起寄存器用于保持中断请求的状态。EXTI 可检测到脉冲宽度小于内部 APB2 时钟周期的外部中断线。外部中断线最多有 16 根,可从最多 168 个 GPIO 中选择连接。 {{ :icore3l:icore3l_arm_hal_4_1.png?direct |}} 外部中断/事件线映射:\\ 多达168个的GPIO通过以下方式连接到16个外部中断/事件线: {{ :icore3l:icore3l_arm_hal_4_2.png?direct |}} 另外七根EXTI线连接方式如下: * EXTI线16连接到PVD输出。 * EXTI线17连接到RTC闹钟事件。 * EXTI线18连接到USB OTG FS 唤醒事件。 * EXTI线19连接到以太网唤醒事件。 * EXTI线20连接到USB OTG HS (在FS中配置)唤醒事件。 * EXTI线21连接到RTC入侵和时间戳事件。 * EXTI线22连接到RTC唤醒事件。 === 3.实验原理 === * 在本实验中,按键的一端与GD32F450的GPIO(PG9)相连,另外一端接地,且PG9外接一个1K电流大小的上拉电阻。初始化时把PG9设置成输入模式,当按键弹起时,PG9由于上拉电阻的作用呈高电平;当按键按下时,PG9直接被按键短接到GND,呈低电平。因此PG9的电平变化产生下降沿,从而进入中断函数,可得到按键状态。原理图如下: {{ :icore3l:icore3l_arm_hal_4_3.png?direct |}} ==== 四、实验程序 ==== 1.主函数 int main(void) {   static int counter = 0;   HAL_Init();   SystemClock_Config();   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_PIN_RESET) { exti_flag = 0; switch(counter++) { case 0: LED_RED_ON; LED_GREEN_OFF; LED_BLUE_OFF; break; case 1: LED_RED_OFF; LED_GREEN_ON; LED_BLUE_OFF; break; case 2: LED_RED_OFF; LED_GREEN_OFF; LED_BLUE_ON; counter = 0; break; } } } } } 2.中断回调函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {   if(GPIO_Pin == ARM_KEY_Pin) {     exti_flag = 1;   } } ==== 五、实验步骤 ==== - 把仿真器与iCore3L的SWD调试口相连(直接相连或者通过转接器相连); - 把iCore3L通过Micro USB线与计算机相连,为iCore3L供电; - 打开Keil MDK 开发环境,并打开本实验工程; - 烧写程序到iCore3L上; - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。 ==== 六、实验现象 ==== ARM按键每按下一次,红、绿、蓝三色LED交替点亮。