1、嵌入式系统设计(基于STM32F429)第 7 章课后题参考答案1. 外部中断的中断请求信号可以是控制器外部产生由 GPIO 引脚引入的,也可以是由控制器内部一些片上外设产生的。这一说法是否正确? 正确 。2. 每个 GPIO 引脚都可以作为外部中断信号输入引脚,GPIO 引脚编号相同的映射到同一个 EXTI 线,那么 GPIOA 的 0 号引脚映射到 EXTI 线 0 ,GPIOD 的 0 号引脚映射到 EXTI 线 0 ,GPIOC 的 5 号引脚映射到 EXTI 线 5 ,GPIOG 的 10 号引脚映射到 EXTI 线 10 。3. 外部中断信号输入的触发信号形式可以是 上升沿触发_、
2、_下降沿触发_、_边沿触发_、。4. 每个外部中断在中断向量表中,是否都独立占用一个位置? 不是 5. 外部中断 59 共用一个中断向量和外部中断 1015 共用一个中断向量。6. 外部中断的中断 0 在库函数启动文件中定义的默认中断函数名是 EXTI0_IRQHandler 。7函数 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0)有什么功能? 答:连接 GPIOA 的 0 号引脚 到 EXTI08. 函数 void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)有什么功能? 答
3、:初始化外部中断功能。9. 应用外部中断,需要先使能 GPIO 端口的时钟和 SYSCFG 时钟。10. 试述初始化外部中断的步骤。答:(1) 使能用到 GPIO 时钟和 SYSCFG 时钟。(2) 初始化相应 GPIO 的引脚为输入。(3) 设置 GPIO 引脚与 EXTI 线的映射关系。(4) 初始化工作类型、设置触发条件、使能等等。(5) 配置中断分组(NVIC),并初始化相应中断通道的优先级及使能/禁止。(6) 编写中断服务函数。(7) 编写中断服务程序处理内容。11. 初始化外部中断1:将GPIOA 的 1 号引脚作为输入引脚,中断模式,上升沿触发,中断优先级组为 3 组,抢占优先级
4、为 3,响应优先级为 1,并使能中断。RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA ,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure)
5、;SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource1);EXTI_InitStructure.EXTI_Line = EXTI_Line1; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);NVIC_PriorityGrou
6、pConfig(NVIC_PriorityGroup_3);NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);12. 外部中断被挂起后,不能硬件清除,需要在相应的中断服务程序中将
7、挂起标志清除,使用的函数是 void EXTI_ClearITPendingBit(uint32_t EXTI_Line) 。13. 请说明中断服务程序的响应过程及中断服务程序的函数名怎么更改。答:(1) 处理器在当前堆栈上把程序状态寄存器、程序计数寄存器、链接寄存器、R12、R3R0 八个寄存器自动依次入栈。(2) 读取向量表(如果是复位中断,则更新堆栈指针的值)。(3) 根据向量表更新程序计数寄存器的值。(4) 加载新程序计数寄存器处的指令(步骤(2)步骤(4)与步骤(1)同时进行)。(5) 更新链接寄存器为 EXC_RETURN(EXC_RETURN 表示退出异常后返回的模式及使用的堆栈
8、)。中断服务程序的函数名更改:(1) 直接在启动文件中修改 中断服务程序的函数(2) 在 C 文件中使用宏定义方法实现例如:#define KEY_IRQHandler EXTI0_IRQHandler14. 根据图 7-4,编写程序以完成外部中断初始化,中断输入引脚为 PE5,上升沿检测方式。图 7-4 题 14 电路图答:GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;/-第 1 步-/* 开 启 按 键 GPIO 口
9、的 时 钟 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIO ,ENABLE);/* 使能 SYSCFG 时钟 ,使用 GPIO 外部中断时必须使能 SYSCFG 时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);/-第 2 步-/* 选 择 按 键 的 引 脚 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;/* 设置引脚为输入模式 */GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;/* 设 置 引 脚
10、不 上 拉 也 不 下 拉 */ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;/* 使用上面的结构体初始化按键 */GPIO_Init(GPIOE, &GPIO_InitStructure);/-第 3 步-/* 连 接 EXTI 中 断 源 到 GPIOE 5 引 脚 */ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource5);/-第 4 步-/* 选 择 EXTI 中 断 源 */ EXTI_InitStructure.EXTI_Line = EXTI_Line5;/* 中
11、断模式 */EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;/* 上降沿触发 */EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;/* 使 能 中 断 / 事 件 线 */ EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);/-第 5 步-/* 配置 NVIC */* 配置 NVIC 为优先级组 1,整个程序处于同一组 */ NVIC_PriorityGroupConfig(NVIC_P
12、riorityGroup_1);/* 配 置 中 断 源 : 按 键 1 */ NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;/* 配置抢占优先级:1 */NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/* 配 置 子 优 先 级 :1 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/* 使能中断通道 */NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);15. 编写 14 题的外部中断的服务程序,完成 LED 灯(PB2)的开关控制。答:void EXTI9_5_IRQHandler (void)/确保是否产生了 EXTI Line 中断if(EXTI_GetITStatus(EXTI_Line5) != RESET)/清除中断标志位EXTI_ClearITPendingBit(EXTI_Line5);/ LED 状态转换GPIO_ToggleBits(GPIOB, GPIO_Pin_2);