这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
icore3_arm_hal_4 [2020/01/16 16:43] zgf 创建 |
icore3_arm_hal_4 [2022/03/18 15:00] (当前版本) sean |
||
---|---|---|---|
行 1: | 行 1: | ||
+ | |**银杏科技有限公司旗下技术文档发布平台** |||| | ||
+ | |技术支持电话|**0379-69926675-801** ||| | ||
+ | |技术支持邮件|Gingko@vip.163.com ||| | ||
+ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
+ | | V1.0 | 2020-1-16 | gingko | 初次建立 | | ||
+ | |||
+ | |||
===== STM32CubeMX教程四——EXTI外部中断输入实验 ===== | ===== STM32CubeMX教程四——EXTI外部中断输入实验 ===== | ||
1. 新建工程:在主界面选择File-->New Project 或者直接点击ACCEE TO MCU SELECTOR | 1. 新建工程:在主界面选择File-->New Project 或者直接点击ACCEE TO MCU SELECTOR | ||
- | + | {{ :icore3:icore3_cube_4_1.png?direct&900 | }} | |
2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 | 2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 | ||
在搜索栏的下面,提供的各 种查找方式,可以选择芯片内核,型号,等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F407IGTx。 | 在搜索栏的下面,提供的各 种查找方式,可以选择芯片内核,型号,等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F407IGTx。 | ||
- | + | {{ :icore3:icore3_cube_4_2.png?direct&900 | }} | |
- | + | ||
3. 配置RCC,使用外部时钟源 | 3. 配置RCC,使用外部时钟源 | ||
- | + | {{ :icore3:icore3_cube_4_3.png?direct&900 | }} | |
4. 配置调试引脚 | 4. 配置调试引脚 | ||
- | + | {{ :icore3:icore3_cube_4_4.png?direct&900 | }} | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
5. 将LED对应的3个引脚(PI5,PI6,PI7)设置为GPIO_Output | 5. 将LED对应的3个引脚(PI5,PI6,PI7)设置为GPIO_Output | ||
- | + | {{ :icore3:icore3_cube_4_5.png?direct&900 | }} | |
6. 将ARM_KEY对应的引脚(PH15)设置为GPIO_EXTI15 | 6. 将ARM_KEY对应的引脚(PH15)设置为GPIO_EXTI15 | ||
- | + | {{ :icore3:icore3_cube_4_6.png?direct&900 | }} | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
7. 引脚模式配置 | 7. 引脚模式配置 | ||
- | 三色LED引脚配置 | + | * 三色LED引脚配置 |
- | + | {{ :icore3:icore3_cube_4_7.png?direct&900 | }} | |
- | ARM_KEY引脚配置,GPIO_EXIT有6种模式,这里选择下降沿触发外部中断。 | + | * ARM_KEY引脚配置,GPIO_EXIT有6种模式,这里选择下降沿触发外部中断。 |
- | + | {{ :icore3:icore3_cube_4_8.png?direct&900 | }} | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
8. 设置NVIC(嵌套向量中断控制器) | 8. 设置NVIC(嵌套向量中断控制器) | ||
- | + | {{ :icore3:icore3_cube_4_9.png?direct&900 | }} | |
9. 时钟源设置,选择外部高速时钟源,配置为最大主频 | 9. 时钟源设置,选择外部高速时钟源,配置为最大主频 | ||
- | + | {{ :icore3:icore3_cube_4_10.png?direct&900 | }} | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
10. 工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK5 | 10. 工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK5 | ||
- | + | {{ :icore3:icore3_cube_4_11.png?direct&900 | }} | |
11. 点击Code Generator,进行进一步配置 | 11. 点击Code Generator,进行进一步配置 | ||
- | + | {{ :icore3:icore3_cube_4_12.png?direct&900 | }} | |
* **Copy all used libraries into the project folder** | * **Copy all used libraries into the project folder** | ||
* 将HAL库的所有.C和.H都复制到所建工程中 | * 将HAL库的所有.C和.H都复制到所建工程中 | ||
行 75: | 行 49: | ||
12. 然后点击GENERATE CODE 创建工程。创建成功,打开工程。 | 12. 然后点击GENERATE CODE 创建工程。创建成功,打开工程。 | ||
- | + | {{ :icore3:icore3_cube_4_13.png?direct&900 | }} | |
===== 实验四:EXTI外部中断输入实验——读取ARM按键状态 ===== | ===== 实验四:EXTI外部中断输入实验——读取ARM按键状态 ===== | ||
行 87: | 行 61: | ||
==== 二、 实验设备及平台 ==== | ==== 二、 实验设备及平台 ==== | ||
- | - iCore3 双核心板 | + | - iCore3 双核心板[[https://item.taobao.com/item.htm?spm=a1z10.1-c.w4024-251734887.3.5923532fXD2RIN&id=524229438677&scene=taobao_shop|点击购买]] |
- | - JLINK(或相同功能)仿真器 | + | - JLINK(或相同功能)仿真器[[https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-251734908.13.20822b61MmPeNN&id=554869837940|点击购买]] |
- Micro USB线缆 | - Micro USB线缆 | ||
- Keil MDK 开发平台 | - Keil MDK 开发平台 | ||
行 107: | 行 81: | ||
=== 2、外部中断/时间控制器(EXTI)外部中断 === | === 2、外部中断/时间控制器(EXTI)外部中断 === | ||
- | * **EXTI主要特性** | + | * EXTI主要特性 |
- 每个中断/事件线上都具有独立的触发和屏蔽。 | - 每个中断/事件线上都具有独立的触发和屏蔽。 | ||
- 每个中断线都具有专用的状态位。 | - 每个中断线都具有专用的状态位。 | ||
- 支持多达23个软件事件/中断请求。 | - 支持多达23个软件事件/中断请求。 | ||
- | + | {{ :icore3:icore3_arm_hal_4_1.png?direct&700 |}} | |
* 外部中断/事件线映射: | * 外部中断/事件线映射: | ||
* 多达140个的GPIO通过以下方式连接到16个外部中断/事件线: | * 多达140个的GPIO通过以下方式连接到16个外部中断/事件线: | ||
- | + | {{ :icore3:icore3_arm_hal_4_2.png?direct&400 |}} | |
* 另外七根EXTI线连接方式如下: | * 另外七根EXTI线连接方式如下: | ||
* EXTI线16连接到PVD输出。 | * EXTI线16连接到PVD输出。 | ||
行 128: | 行 102: | ||
* 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。 | * 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。 | ||
**优先级分组:** | **优先级分组:** | ||
- | * 中断优先级分组域中,可以有8种分配方式,如下: | + | 中断优先级分组域中,可以有8种分配方式,如下: |
- | * 所有8位用于指定响应优先级。 | + | * 所有8位用于指定响应优先级。 |
* 最高1位用于指定抢占式优先级。 | * 最高1位用于指定抢占式优先级。 | ||
* 最低7位用于指定响应优先级。 | * 最低7位用于指定响应优先级。 | ||
行 145: | 行 119: | ||
* 最低1位用于指定响应优先级。 | * 最低1位用于指定响应优先级。 | ||
* 按键的一端与STM32的GPIO(PH15)相连,另外一端接地,且PH15外接一个1K电流大小的上拉电阻。初始化时把PH15设置成输入模式,当按键弹起时,PH15由于上拉电阻的作用呈高电平(3.3V);当按键按下时,PH15直接被按键短接到GND,呈低电平。因此PH15的电平变化产生下降沿,从而进入中断函数,可得到按键状态。原理示意图如下图所示。 | * 按键的一端与STM32的GPIO(PH15)相连,另外一端接地,且PH15外接一个1K电流大小的上拉电阻。初始化时把PH15设置成输入模式,当按键弹起时,PH15由于上拉电阻的作用呈高电平(3.3V);当按键按下时,PH15直接被按键短接到GND,呈低电平。因此PH15的电平变化产生下降沿,从而进入中断函数,可得到按键状态。原理示意图如下图所示。 | ||
- | + | {{ :icore3:icore3_arm_hal_4_3.png?direct&500 |}} | |
==== 四、 实验程序 ==== | ==== 四、 实验程序 ==== | ||
=== 1. 主函数 === | === 1. 主函数 === | ||
- | + | <code c> | |
- | + | int main(void) | |
+ | { | ||
+ | HAL_Init(); //重置所有外围设备。 | ||
+ | SystemClock_Config(); //配置系统时钟 | ||
+ | MX_GPIO_Init(); //初始化所有已配置的外围设备 | ||
+ | LED_RED_ON; //初始化LED状态 | ||
+ | while (1) | ||
+ | { | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
=== 2. 中断回调函数 === | === 2. 中断回调函数 === | ||
+ | <code c> | ||
+ | void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); | ||
+ | </code> | ||
功能:中断函数具体要响应的动作。 | 功能:中断函数具体要响应的动作。 | ||
- | + | <code c> | |
+ | void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) | ||
+ | { | ||
+ | static int led_work_status = 0; | ||
+ | HAL_Delay(10); | ||
+ | if(ARM_KEY_STATE == KEY_DOWN){ | ||
+ | led_work_status += 1; | ||
+ | if(led_work_status > 2)led_work_status = 0; | ||
+ | } | ||
+ | switch(led_work_status){ | ||
+ | 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; | ||
+ | break; | ||
+ | default: | ||
+ | break; | ||
+ | } | ||
+ | __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_9); | ||
+ | } | ||
+ | </code> | ||
==== 五、 实验步骤 ==== | ==== 五、 实验步骤 ==== |