这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
icore3l_arm_4 [2020/11/25 10:40] zgf 创建 |
icore3l_arm_4 [2022/03/19 10:57] (当前版本) sean |
||
---|---|---|---|
行 2: | 行 2: | ||
|技术支持电话|**0379-69926675-801**||| | |技术支持电话|**0379-69926675-801**||| | ||
|技术支持邮件|Gingko@vip.163.com||| | |技术支持邮件|Gingko@vip.163.com||| | ||
- | |技术论坛|http://www.eeschool.org||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
- | | V1.0 | 2020-03-06 | gingko | 初次建立 | | + | | V1.0 | 2020-11-25 | gingko | 初次建立 | |
\\ | \\ | ||
\\ | \\ | ||
行 48: | 行 47: | ||
{{ :icore3l:icore3l_cube_4_14.png?direct |}} | {{ :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.主函数 | ||
+ | <code c> | ||
+ | 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; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | 2.中断回调函数 | ||
+ | <code c> | ||
+ | void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) | ||
+ | { | ||
+ | if(GPIO_Pin == ARM_KEY_Pin) | ||
+ | { | ||
+ | exti_flag = 1; | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | ==== 五、实验步骤 ==== | ||
+ | - 把仿真器与iCore3L的SWD调试口相连(直接相连或者通过转接器相连); | ||
+ | - 把iCore3L通过Micro USB线与计算机相连,为iCore3L供电; | ||
+ | - 打开Keil MDK 开发环境,并打开本实验工程; | ||
+ | - 烧写程序到iCore3L上; | ||
+ | - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。 | ||
+ | ==== 六、实验现象 ==== | ||
+ | ARM按键每按下一次,红、绿、蓝三色LED交替点亮。 |