2022年嵌入式系统-流水灯按键定时器实验报告.docx

上传人:Che****ry 文档编号:12951614 上传时间:2022-04-27 格式:DOCX 页数:13 大小:367.89KB
返回 下载 相关 举报
2022年嵌入式系统-流水灯按键定时器实验报告.docx_第1页
第1页 / 共13页
2022年嵌入式系统-流水灯按键定时器实验报告.docx_第2页
第2页 / 共13页
点击查看更多>>
资源描述

《2022年嵌入式系统-流水灯按键定时器实验报告.docx》由会员分享,可在线阅读,更多相关《2022年嵌入式系统-流水灯按键定时器实验报告.docx(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精品学习资源嵌入式系统应用试验报告姓名:学号:学院:专业:班级:指导老师:欢迎下载精品学习资源试验 1、流水灯试验编程掌握试验板上 LED 灯轮番点亮、熄灭,中间间隔肯定时间;试验主要考察对 STM32F10X 系列单片机 GPIO 的输出操作;参阅数据手册可知,通过软件编程, GPIO 可以配置成以下几种模式:输入浮空输入上拉输入下拉模拟输入开漏输出推挽式输出推挽式复用功能开漏式复用功能依据试验要求,应当第一将 GPIO配置为推挽输出模式;由原理图可知,单片机 GPIO输出信号经过 74HC244缓冲器,连接 LED灯;由于 74HC244的 OE1和 OE2都接地,为相同电平, 故 A端电

2、平与 Y端电平相同且LED灯共阳,所以,假如要点亮 LED,GPIO应输出低电平;反之, LED灯熄灭;软件方面,在程序启动时,调用 SystemInit函数见附录 1,对系统时钟等关键部分进行初始化,然后再对GPIO 进行配置;GPIO 配置函数为 SZ_STM32_LEDInit 见附录 2,函数中第一使能 GPIO时钟:RCC_APB2PeriphClockCmdGPIO_CLKLed, ENABLE; 然后配置 GPIO 输入输出模式: GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 再配置 GPIO 端口翻转速度:欢迎下载精品学习资源

3、GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;最终将配置好的参数写入寄存器,初始化完成: GPIO_InitGPIO_PORTLed, &GPIO_InitStructure ;初始化完成后,程序循环点亮一个LED并熄灭其他 LED,中间通过 Delay函数进行延时,到达流水灯的成效 程序完整代码见附录 3;试验程序流程图如下:硬件方面,依据试验指南,将试验板做如下连接:欢迎下载精品学习资源试验二、按键试验利用 STM32读取外部按键状态, 按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯亮起;试验主要考察对 STM32F10X

4、系列单片机 GPIO 外部中断功能的使用;STM32F107VCT 一共有 5 组 GPIO,分别是 PA15:0、PB15:0、PC15:0、PD15:0、PE15:0;STM32 的全部 GPIO 都可以作为中断输入源,单片机通过复用的方式使其对处理器来说来自GPIO 的一共有 16 个中断 Px15:0 ;详细实现是 PA0、PB0、PC0、PD0 和 PE0共享一个 GPIO 中断; PA1、PB1 、PC1、PD1 和 PE1共享一个 GPIO 中断;PA15 、PB15 、PC15、PD15和 PE15共享一个 GPIO 中断;以以下图片为以EXTI0 为例的外部中断 /大事线路映

5、像:要产生中断,必需先配置好并使能中断线;依据需要的边沿检测设置2 个触发寄存器,同时在中断屏蔽寄存器的相应位写1答应中断恳求;当外部中断 线上发生了期望的边沿时, 将产生一个中断恳求, 对应的挂起位也随之被置 1;在挂起寄存器的对应位写 1,将清除该中断恳求;要把 IO 口作为外部中断输入,有以下几个步骤:(1) 初始化 IO口为输入;这一步设置要作为外部中断输入的IO 口的状态, 可以设置为上拉 / 下拉输入,也可以设置为浮空输入,但浮空的时候外部肯定要带上拉,或者下拉电阻;否就可能导致中断不停的触发;在干扰较大的地方,就 算使用了上拉 / 下拉,也建议使用外部上拉 / 下拉电阻, 这样可

6、以肯定程度防止外部干扰带来的影响;(2) 开启 IO 口复用时钟,设置 IO 口与中断线的映射关系; STM32的 IO 口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启复用时钟,然后配置 IO 口与中断线的对应关系;才能把外部中断与中断线连接起来;(3) 开启与该 IO 口相对的线上中断 / 大事,设置触发条件;这一步,我们要配置中断产生的条件, STM32可以配置成上升沿触发,下降沿触发,或者任意欢迎下载精品学习资源电平变化触发, 但是不能配置成高电平触发和低电平触发; 这里依据自己的实际情形来配置; 同时要开启中断线上的中断, 这里需要留意的是: 假如使用外部

7、中断,并设置该中断的 EMR位的话, 会引起软件仿真不能跳到中断, 而硬件上是可以的;而不设置 EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以 的;建议不要配置 EMR位;(4) 配置中断分组 NVIC,并使能中断;这一步,我们就是配置中断的分组以及使能, 对 STM32的中断来说, 只有配置了 NVIC 的设置, 并开启才能被执行,否就是不会执行到中断服务函数里面去的;(5) 编写中断服务函数;这是中断设置的最终一步,中断服务函数,是必不可少的, 假如在代码里面开启了中断, 但是没编写中断服务函数, 就可能引起硬件错误, 从而导致程序崩溃; 所以在开启了某个中断后, 应为该中断编

8、写服务函数;在中断服务函数里面编写要执行的中断后的操作,并很据情形判定是否要对中断产生的标志位进行清零 ;由原理图可知,按键未按下时,GPIO读到的为高电平,按键按下后,IO 口接地,产生一个电平跳变,所以外部中断触发方式应当设置为下降沿触发;LED灯的点亮与试验一中相同,不过多赘述;程序第一对按键进行初始化,初始化函数为 GPIO_KEY_Config见附录 4,配置过程与试验一中 GPIO配置基本一样;由于此处 GPIO需要采集外界按键信号, 故 GPIO模式应当为调整为内部上拉电阻输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;然后执行 G

9、PIO中断初始化函数 KEY_EXIT_Init 见附录 5,第一将连接按键的 IO 口与 EXTI 线链接到一起:GPIO_EXTILineConfigGPIO_KEY1_EXTI_PORT_SOURCE,GPIO_KEY1_EXTI_PIN_SOURCE;然后将触发方式设置为下降沿触发并写入中断配置寄存器,并使能中断: EXTI_InitStructure.EXTI_Line = GPIO_KEY1_EXTI_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger =

10、 EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init&EXTI_InitStructure;之后进行中断分组配置及中断优先级配置,函数为InterruptConfig见附录 6;欢迎下载精品学习资源配置过程较为复杂,涉及到抢占优先级和响应优先级的概念;程序第一将所 有外部中断归为 NVIC_PriorityGroup_2,即 2 位抢占优先级和 2 位响应优先级:NVIC_PriorityGroupConfigNVIC_PriorityGroup_2;然后将全部外部中断信号的抢占优先级规定为0、1、2

11、,使其可以相互区分, 并将配置好的参数写入对应寄存器中,完成配置:NVIC_InitStructure.NVIC_IRQChannel = GPIO_KEY1_EXTI_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init&NVIC_InitStructure; NVIC_InitStructure.NVIC_

12、IRQChannel = GPIO_KEY2_EXTI_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_Init&NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = GPIO_KEY3_EXTI_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_Init&NVIC_InitStructure;初始化完成后,程序进入等待按键中断触发状态,一旦按键按下,就进入中断

13、服务函数 EXTI9_5_IRQHandler见附录 7中;在函数中对 LED灯进行点亮、熄灭操作,并重置中断产生标志位;试验流程图如下 主函数代码见附录 8:硬件连接方式如以下图所示:欢迎下载精品学习资源欢迎下载精品学习资源试验三、定时器试验利用 STM32的通用定时器 TIM5产生一个 1S 的中断,在中断函数中实现LED1、LED2、LED3、LED4同时翻转的成效;试验主要考察对 STM32F10X 系列单片机定时器的使用;试验中使用的 STM32F107 单片机有多达 10 个定时器,包括:多达 4 个 16 位定时器,每个定时器有多达4 个用于输入捕捉 /输出比较/PWM 或脉冲计

14、数的通道和增量编码器输入 1 个 16 位带死区掌握和紧急刹车,用于电机掌握的PWM 高级掌握定时器 2 个独立的看门狗定时器独立的和窗口型的系统时间定时器: 24 位自减型计数器 2 个 16 位基本定时器用于驱动 DAC依据时钟树可知,系统时钟经过分频之后,进入TIM5 的时钟模块入口,在经过预分频处理,才供应 TIM5 作时钟使用;预分频器的系数为: TIMx_PSC, 当 TIMx_PSC = 0 时表示不分频,就 TIM5 定时器的时钟用 CK_CNT = 模块入口时钟 72MHz ;当 TIMx_PSC = 1 时表示不分频,就 TIM5定时器的时钟用 CK_CNT= 模块入口时钟

15、 36MHz ;以此类推;公式为: CK_CNT=fCK_PSC/PSC15:0+1,其中 PSC最大为 65535;其次是 TIM5 计数器计数值的设置, TIM5 计数器以 CK_CNT 为时钟计数,向下计数到 0 或向上计数到设定值 TIMx_ARR 就产生中断;以向上计数为例,从0 开头计数到设定值 TIMx_ARR时产生中断;要产生一秒一次中断就要使计数 器的值乘以预分频的值 =系统时钟 72MHz ,其中计数器的值和预分频值都必需小 于 65535;我们使预分频值为7200,计数器值为 10000,就 7200 * 10000 = 72,000,000 即 72M ;其中拆分方法许

16、多 35000*2000 = 72,000,000,只要留意计数器的值和预分频值都必需小于 65535 即可;当计数值溢出后, 会转变计数溢出标志位,并产生定时器中断,试验中使用其产生中断来进行LED 灯翻转;LED 初始化部分与试验一相同,完成初始化后,点亮全部LED 灯;定时器配置函数为 TIM5_Init 见附录 6;配置函数第一使能计数器时钟:RCC_APB1PeriphClockCmdRCC_APB1Periph_TIM5, ENABLE ;欢迎下载精品学习资源然后自动装载计数值,计数从 0 开头: TIM_TimeBaseStructure.TIM_Period = 100 - 1

17、; 再对计时器进行预分频系数设置: TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; 并将计数器设置为向上计数:TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 最终写入计时器配置寄存器,完成配置:TIM_TimeBaseInitTIM5, &TIM_TimeBaseStructure ;配置完成后,仍要对计数器溢出标志位进行清零,并打开溢出中断,使能计数器以开头计数;TIM_ClearITPendingBitTIM5, TIM_IT_Update; TIM_ITConfigTI

18、M5, TIM_IT_Update, ENABLE;TIM_CmdTIM5, ENABLE;定时器配置完成并使能后,计数器开头工作,当到达预设的计数值之后,产 生中断信号; 系统在进行相关配置后可以响应定时器产生的中断,中断配置函数为 NVIC_Configuration 见附录 7;函数第一将中断向量表首地址置于0x08000000:NVIC_SetVectorTableNVIC_VectTab_FLASH, 0x0000;然后使能 TIM5 中断: NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; NVIC_InitStructure.NVIC

19、_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 最终将配置参数写入中断掌握寄存器,完成配置: NVIC_Init&NVIC_InitStructure;一旦中断产生,系统会对中断产生响应,暂停全部正在执行的低优先级任务且将任务信息和数据压入对应对战区,并进入中断服务函数TIM5_IRQHandler见附录 8中进行处理;在中断服务函数中判定并清除了中断标志位,以便定时器下一次计数

20、中断产生;函数中调用了 LED_Spark函数见附录 9,实现了 LED 的闪耀;程序流程图如下:欢迎下载精品学习资源硬件连接方式如以下图所示:欢迎下载精品学习资源试验四、按键中断掌握LED灯定时闪耀综合试验一、二、三,利用 STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯闪耀,闪耀间隔通过定时器定时掌握;其中, SKEY1掌握 LED1以 1S 为间隔,闪耀 3 次, SKEY2掌握 LED2以 2S 为间隔闪耀 3 次, SKEY3掌握 LED3以 3S 为间隔,闪耀 3 次;试验需要用到 STM32的 GPIO输入输出操作, GPIO外部中断和内部

21、定时器中断;在以上三个试验中,对各个部分都已经进行过详尽的说明,这里不再赘述;此试验需要将以上试验做综合,并对时序进行调整;难点为,对GPIO外部中断和定时器内部中断的处理,即如何确定两种不同中断的优先级;这里 的使 用的 方 法 是, 将 全部 按键 外部 中断 置 于中 断 分 组 2 , 即NVIC_PriorityGroup_2中;将全部按键中断抢占优先级置为0,即最高级别中断,响应优先级置分别置为 1、2、3,相互区分;将定时器中断抢占优先级置为1, 相应优先级社会中低于按键中断,使其可以被按键信号中断计时,并刷新LED 闪耀状态;这在程序初始化阶段, 分别对 LED、按键外部中断和

22、定时器中断进行初始化;主函数如下:int mainvoid/* LED 初始化 */ LED_config;/* LED 闪耀.*/ Led_Turn_on_all; Delay3000000;Led_Turn_off_all;Delay3000000;Led_Turn_on_all;Delay3000000;Led_Turn_off_all;Delay3000000;Led_Turn_on_all;Delay3000000;Led_Turn_off_all;/*按键初始化 */ GPIO_KEY_Config;/*按键外部中断初始化 */ KEY_EXIT_Init;/*外部中断向量初始化 */ InterruptConfig;欢迎下载精品学习资源/*定时器 5 初始化 */ TIM5_Init;/*定时器中断初始化 */ NVIC_Configuration;/*等待中断触发 */ while 1初始化完成后,等待中断触发;一旦按键按下,触发外部中断,就进入外部 中断服务函数, 函数中将判定哪一个按键被按下,记录按下的按键, 然后给定时器清零并开头计数,且清零外部中断标志位;欢迎下载

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁