您好,欢迎来到六九路网。
搜索
您的当前位置:首页嵌入式技术及应用实验中断实验报告

嵌入式技术及应用实验中断实验报告

来源:六九路网


年级 专业 题目名称 实验设计要求 11级 自动化 班级 11级自动化 一班 学号 姓名 110029 杨胜提 实验二、中断实验 1、设计一个中断优先级抢占的实例。设置三个中断:EXTI0、EXTI9和SysTick,在EXTI9的中断服务子程序中实现EXTI0和SysTick的优先级别的转换,使之分别出现:在EXTI0中断时可以被SysTick抢占和不可以被SysTick抢占这两种状态。 2、自己建立一个工程。 1、 硬件电路设计 在EduKit-M3实验平台上按键Key与PB.9相连作为EXTI9,按键Wakeup与PA.0相连作为EXTI0;LED1、LED2、LED3、LED4分别与PC6、PC7、PC8、PC9相连,用于显示不同的优先级抢占状态。 2、软件程序设计 根据设计任务要求,软件程序主要内容包括: (1) 配置两根EXTI 外部中断线(Line0 和 Line9),在下降沿产生中断,并配置SysTick中断。其中: EXTI0: 优先级= PreemptionPriorityValue,子优先级=0; EXTI9: 优先级= 0,子优先级= 1; SysTick Handler:优先级= !PreemptionPriorityValue,子优先级 SubPriority = 0; (2) 刚开始设置PreemptionPriorityValue=0,即EXTI0优先级比SysTick优先级高;在EXTI9中断服务子 程序中,EXTI Line0和SysTick 的优先级对换; (3) 在EXTI0中断服务子程序中,SysTick中断挂起位被置1,若SysTick优先级比EXTI Line0 优先级高, 则EXTI 0中断被抢占,转而去执行SysTick中断服务子程序;否则继续执行EXTI Line0中断服务子程序。 (4) 如果EXTI0被SysTick抢占则LED1、LED2、LED3、LED4循环闪烁,如果EXTI0抢占SysTick则LED1、 LED2、LED3、LED4常亮或者常灭。 实 验 设 计 思 路 1

1、建立工程 1)、在工程文件中包含如下文件 (int、doc、user、lib、start) 2)、选择STM32F103VB芯片 实 验 步 骤 与 结 果 分 析 3)、分别添加如下文件 2、运行过程 (1) 使用Keil uVision3 通过ULINK仿真器连接EduKit-M3实验平台,打开实验例程NVIC_test子目录下的NVIC.Uv2 例程,编译链接工程; (2) 点击MDK 的Debug菜单,选择Start/Stop Debug Session项或Ctrl+F5键,远程连接EduKit-M3实验平台并下载 调试代码到目标系统的RAM中; (3) 程序正常启动运行后,会有以下结果: 当第一次发生EXTI9 中断后(按下EduKit-M3实验平台上Key按钮),SysTick中断的优先级比EXTI0中断 优先级高。因此当EXTI0中断发生时(按下Wakeup按钮),将先执行

2

SysTick中断服务子程序, 发生抢占,变量PreemptionOccured 为真,LED1-LED4开始闪烁; 当第二次发生EXTI9中断后,SysTick中断的优先级比EXTI0优先级低,因此当EXTI0中断发 生时SysTick无法抢占,变量PreemptionOccured 为假,LED1-LED4停止闪烁; 每次EXTI9发生后,SysTick和EXTI0就会发生优先级转换,出现前面2步的状态。 3

/* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 主从优先级的选择Group_1,有先占优先级1位,从优先级3位 //配置一个比特为抢占优先级 /* Enable the EXTI0 Interrupt */ //使能EXTI0中断 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue; 主优先级的选择PreemptionPriorityValue NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//从优先级等于0. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); 主 要 程 序 代 码 分 析 /* Enable the EXTI9_5 Interrupt */ //使能EXTI9_5中断 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//EXTI9_5主优先级的选择等于0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//EXTI9_5主优先级的选择等于0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Configure the SysTick Handler Priority: Preemption priority and sub priority */ //配置SysTick处理程序优先级:抢占优先级和子优先级 NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, !PreemptionPriorityValue, 0); while (1) { if(PreemptionOccured != FALSE)//当PreemptionOccured != FALSE)抢占发生 { GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6))); Delay(0x5FFFF); GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 - 4

GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7))); Delay(0x5FFFF); GPIO_WriteBit(GPIOC, GPIO_Pin_8, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_8))); Delay(0x5FFFF); GPIO_WriteBit(GPIOC, GPIO_Pin_9, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_9))); Delay(0x5FFFF); } } void GPIO_Configuration(void) { /* Configure PC6, PC7, PC8 and PC9 as output push-pull */ 使能为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //使能其速度为50MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //使能为推挽输出 GPIO_Init(GPIOC, &GPIO_InitStructure); /* Configure GPIOA Pin0 as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 使能为浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure GPIOB Pin9 as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 使能为推挽输出入 GPIO_Init(GPIOB, &GPIO_InitStructure); } GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

/* Configure EXTI Line0 to generate an interrupt on falling edge */ 配置EXTI Line0产生一

5

个中断在下降沿 EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); (写不完时,可调整表结构。) (这部分内容要手写) 心 得 体 会 6

成 绩 评 定 教师签名: 年 月 日 7

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 69lv.com 版权所有 湘ICP备2023021910号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务