《2022年嵌入式系统流水灯按键定时器实验报告.pdf》由会员分享,可在线阅读,更多相关《2022年嵌入式系统流水灯按键定时器实验报告.pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式系统流水灯、按键、定时器实验报告嵌入式系统应用实验报告姓名:学号: 学院: 专业: 班级: 指导教师 :实验 1、流水灯实验1、1 实验要求编程控制实验板上LED 灯轮流点亮、熄灭 ,中间间隔一定时间。1、2 原理分析实验主要考察对 STM32F10X 系列单片机 GPIO 的输出操作。参阅数据手册可知 ,通过软件编程 ,GPIO 可以配置成以下几种模式: 输入浮空输入上拉输入下拉模拟输入开漏输出推挽式输出推挽式复用功能精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 11 页 - - -
2、 - - - - - - - 嵌入式系统流水灯、按键、定时器实验报告开漏式复用功能根据实验要求 , 应该首先将 GPIO配置为推挽输出模式。由原理图可知 , 单片机 GPIO输出信号经过74HC244缓冲器 , 连接 LED灯。由于 74HC244 的 OE1与 OE2都接地 , 为相同电平 , 故 A端电平与 Y端电平相同且 LED灯共阳 , 所以, 如果要点亮 LED,GPIO应输出低电平。反之 ,LED灯熄灭。1、3 程序分析软件方面 ,在程序启动时 ,调用 SystemInit()函数(见附录 1),对系统时钟等关键部分进行初始化 ,然后再对 GPIO 进行配置。GPIO 配置函数为
3、SZ_STM32_LEDInit() (见附录 2), 函数中首先使能GPIO 时钟: RCC_APB2PeriphClockCmd(GPIO_CLKLed, ENABLE); 然后配置 GPIO 输入输出模式 : GPIO_InitStructure、GPIO_Mode = GPIO_Mode_Out_PP; 再配置 GPIO 端口翻转速度 : GPIO_InitStructure、GPIO_Speed = GPIO_Speed_50MHz; 最后将配置好的参数写入寄存器,初始化完成 : GPIO_Init(GPIO_PORTLed, &GPIO_InitStructure) 。初始化完成后
4、 , 程序循环点亮一个LED并熄灭其她 LED,中间通过 Delay() 函数进行延时 , 达到流水灯的效果 (程序完整代码见附录3)。实验程序流程图如下 : 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 2 页,共 11 页 - - - - - - - - - - 嵌入式系统流水灯、按键、定时器实验报告硬件方面 , 根据实验指南 , 将实验板做如下连接 : 1、3 实验结果实验二、按键实验2、1 实验要求利用 STM32读取外部按键状态 , 按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯
5、亮起。2、2 原理分析实验主要考察对 STM32F10X 系列单片机 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精品资料 - - - 欢迎下载 - - -
6、 - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 3 页,共 11 页 - - - - - - - - - - 嵌入式系统流水灯、按键、定时器实验报告与 PE15共享一个 GPIO 中断。以下图片为以EXTI0 为例的外部中断 /事件线路映像: 要产生中断 , 必须先配置好并使能中断线。根据需要的边沿检测设置2 个触发寄存器 , 同时在中断屏蔽寄存器的相应位写1允许中断请求。 当外部中断线上发生了期待的边沿时 , 将产生一个中断请求 , 对应的挂起位也随之被置1。在挂起寄存器的对应位写1, 将清除该中断请求。要把 IO 口作为外部中断输入 , 有以
7、下几个步骤 : (1) 初始化 IO 口为输入。这一步设置要作为外部中断输入的IO 口的状态 ,可以设置为上拉 / 下拉输入 , 也可以设置为浮空输入 , 但浮空的时候外部一定要带上拉, 或者下拉电阻。 否则可能导致中断不停的触发。在干扰较大的地方 , 就算使用了上拉 / 下拉 , 也建议使用外部上拉/ 下拉电阻 , 这样可以一定程度防止外部干扰带来的影响。(2) 开启 IO 口复用时钟 , 设置 IO 口与中断线的映射关系。 STM32 的 IO 口与中断线的对应关系需要配置外部中断配置寄存器EXTICR, 这样我们要先开启复用时钟, 然后配置 IO 口与中断线的对应关系。才能把外部中断与中
8、断线连接起来。(3) 开启与该 IO 口相对的线上中断 / 事件, 设置触发条件。这一步 , 我们要配置中断产生的条件 ,STM32 可以配置成上升沿触发, 下降沿触发 , 或者任意电平变化触发 , 但就是不能配置成高电平触发与低电平触发。这里根据自己的实际情况来配置。同时要开启中断线上的中断, 这里需要注意的就是 : 如果使用外部中断 ,并设置该中断的EMR位的话 , 会引起软件仿真不能跳到中断, 而硬件上就是可以的。而不设置EMR, 软件仿真就可以进入中断服务函数, 并且硬件上也就是可以的。建议不要配置EMR 位。(4) 配置中断分组 (NVIC), 并使能中断。 这一步 , 我们就就是配
9、置中断的分组以及使能 , 对 STM32的中断来说 , 只有配置了 NVIC 的设置 , 并开启才能被执行 ,否则就是不会执行到中断服务函数里面去的。(5) 编写中断服务函数。这就是中断设置的最后一步, 中断服务函数 , 就是必不可少的 , 如果在代码里面开启了中断, 但就是没编写中断服务函数, 就可能引起硬件错误 , 从而导致程序崩溃。 所以在开启了某个中断后 , 应为该中断编写服务函数。在中断服务函数里面编写要执行的中断后的操作, 并很据情况判断就是否要对中断产生的标志位进行清零。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - -
10、 - - - - - -第 4 页,共 11 页 - - - - - - - - - - 嵌入式系统流水灯、按键、定时器实验报告由原理图可知 , 按键未按下时 ,GPIO读到的为高电平 , 按键按下后 ,IO 口接地 ,产生一个电平跳变 , 所以外部中断触发方式应该设置为下降沿触发。2、3 程序分析LED灯的点亮与实验一中相同 , 不过多赘述。程序首先对按键进行初始化, 初始化函数为 GPIO_KEY_Config()(见附录 4), 配置过程与实验一中GPIO配置基本一致。由于此处GPIO需要采集外界按键信号 , 故 GPIO模式应该为调整为内部上拉电阻输入GPIO_InitStructur
11、e、GPIO_Mode = GPIO_Mode_IPU。然后执行 GPIO中断初始化函数 KEY_EXIT_Init() (见附录 5), 首先将连接按键的 IO 口与 EXTI 线链接到一起 : GPIO_EXTILineConfig(GPIO_KEY1_EXTI_PORT_SOURCE,GPIO_KEY1_EXTI_PIN_SOURCE); 然后将触发方式设置为下降沿触发并写入中断配置寄存器, 并使能中断 : EXTI_InitStructure、EXTI_Line = GPIO_KEY1_EXTI_LINE; EXTI_InitStructure、EXTI_Mode = EXTI_Mod
12、e_Interrupt; EXTI_InitStructure、EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure、EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure)。之后进行中断分组配置及中断优先级配置, 函数为 InterruptConfig()(见附录 6)。配置过程较为复杂 , 涉及到抢占优先级与响应优先级的概念。程序首先将所有外部中断归为 NVIC_PriorityGroup_2,即 2 位抢占优先级与2 位响应优先级 : NVIC_PriorityGroupConfi
13、g(NVIC_PriorityGroup_2); 然后将所有外部中断信号的抢占优先级规定为0、1、2, 使其可以相互区别 ,并将配置好的参数写入对应寄存器中, 完成配置 : NVIC_InitStructure、NVIC_IRQChannel = GPIO_KEY1_EXTI_IRQn; NVIC_InitStructure、NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure、NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure、NVIC_IRQChannelCmd = ENABLE
14、; NVIC_Init(&NVIC_InitStructure); 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 5 页,共 11 页 - - - - - - - - - - 嵌入式系统流水灯、按键、定时器实验报告NVIC_InitStructure、NVIC_IRQChannel = GPIO_KEY2_EXTI_IRQn; NVIC_InitStructure、NVIC_IRQChannelPreemptionPriority = 1; NVIC_Init(&NVIC_InitStructure);
15、 NVIC_InitStructure、NVIC_IRQChannel = GPIO_KEY3_EXTI_IRQn; NVIC_InitStructure、NVIC_IRQChannelPreemptionPriority = 2; NVIC_Init(&NVIC_InitStructure)。初始化完成后 , 程序进入等待按键中断触发状态, 一旦按键按下 , 则进入中断服务函数 EXTI9_5_IRQHandler() (见附录 7)中。在函数中对 LED灯进行点亮、熄灭操作 , 并重置中断产生标志位。实验流程图如下 (主函数代码见附录8): 硬件连接方式如下图所示 : 精品资料 - - -
16、 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 6 页,共 11 页 - - - - - - - - - - 嵌入式系统流水灯、按键、定时器实验报告2、3 实验结果实验三、定时器实验3、1 实验要求利用 STM32的通用定时器 TIM5 产生一个1S 的中断 , 在中断函数中实现LED1 、LED2 、LED3 、LED4同时翻转的效果。3、2 原理分析实验主要考察对 STM32F10X 系列单片机定时器的使用。实验中使用的 STM32F107 单片机有多达 10 个定时器 ,包括: 多达 4 个 16 位定时器 ,每个定时
17、器有多达4 个用于输入捕获 /输出比较/PWM 或脉冲计数的通道与增量编码器输入1 个 16位带死区控制与紧急刹车,用于电机控制的PWM 高级控制定时器2 个独立的瞧门狗定时器 (独立的与窗口型的 ) 系统时间定时器 :24 位自减型计数器2 个 16 位基本定时器用于驱动DAC 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 7 页,共 11 页 - - - - - - - - - - 嵌入式系统流水灯、按键、定时器实验报告根据时钟树可知 ,系统时钟经过分频之后 ,进入 TIM5 的时钟模块入口 ,在经
18、过预分频处理,才供给TIM5作时钟使用。预分频器的系数为:TIMx_PSC, 当TIMx_PSC = 0 时表示不分频 ,则 TIM5 定时器的时钟用 CK_CNT = 模块入口时钟 72MHz;当 TIMx_PSC = 1 时表示不分频 ,则 TIM5 定时器的时钟用CK_CNT= 模块入口时钟36MHz; 以此类推。公式为:CK_CNT =fCK_PSC/(PSC15:0+1),其中 PSC最大为 65535。其次就是 TIM5 计数器计数值的设置 ,TIM5 计数器以 CK_CNT 为时钟计数 ,向下计数到 0或向上计数到设定值 (TIMx_ARR) 则产生中断。以向上计数为例 ,从 0
19、 开始计数到设定值 TIMx_ARR 时产生中断。要产生一秒一次中断则要使计数器的值乘以预分频的值=系统时钟72MHz, 其中计数器的值与预分频值都必须小于65535。我们使预分频值为7200,计数器值为 10000,则 7200 * 10000 = 72,000,000即 72M。其中拆分方法很多35000*2000 = 72,000,000,只要注意计数器的值与预分频值都必须小于65535 即可。当计数值溢出后 ,会改变计数溢出标志位 ,并产生定时器中断 ,实验中使用其产生中断来进行LED 灯翻转。3、3 程序分析LED 初始化部分与实验一相同,完成初始化后 ,点亮所有 LED 灯。定时器
20、配置函数为 TIM5_Init() (见附录 6)。配置函数首先使能计数器时钟: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); 然后自动装载计数值 ,计数从 0 开始: TIM_TimeBaseStructure、TIM_Period = (100 - 1); 再对计时器进行预分频系数设置: TIM_TimeBaseStructure、TIM_Prescaler = (7200 - 1); 并将计数器设置为向上计数: TIM_TimeBaseStructure、TIM_CounterMode = TIM_CounterMode_Up;
21、 最后写入计时器配置寄存器,完成配置 : TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure) 。配置完成后 ,还要对计数器溢出标志位进行清零,并打开溢出中断 ,使能计数器以开始计数。TIM_ClearITPendingBit(TIM5, TIM_IT_Update); 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 8 页,共 11 页 - - - - - - - - - - 嵌入式系统流水灯、按键、定时器实验报告TIM_ITConfig(TIM5, TIM_IT
22、_Update, ENABLE); TIM_Cmd(TIM5, ENABLE) 。定时器配置完成并使能后,计数器开始工作 ,当到达预设的计数值之后,产生中断信号。系统在进行相关配置后可以响应定时器产生的中断,中断配置函数为NVIC_Configuration() (见附录 7)。 函数首先将中断向量表首地址置于0 x08000000: NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0 x0000); 然后使能 TIM5 中断: NVIC_InitStructure 、NVIC_IRQChannel = TIM5_IRQn; NVIC_InitStructure
23、 、NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure 、NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure 、NVIC_IRQChannelCmd = ENABLE; 最后将配置参数写入中断控制寄存器,完成配置 : NVIC_Init(&NVIC_InitStructure)。一旦中断产生 ,系统会对中断产生响应,暂停所有正在执行的低优先级任务且将任务信息与数据压入对应对战区,并进入中断服务函数TIM5_IRQHandler() (见附录 8)中进行处理。在中断服务函数中判断并清
24、除了中断标志位,以便定时器下一次计数中断产生。函数中调用了LED_Spark()函数(见附录 9),实现了 LED 的闪烁。程序流程图如下 : 硬件连接方式如下图所示 : 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 9 页,共 11 页 - - - - - - - - - - 嵌入式系统流水灯、按键、定时器实验报告实验四、按键中断控制LED灯定时闪烁4、1 实验要求综合实验一、二、三 , 利用 STM32 读取外部按键状态 , 按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯闪烁, 闪烁间
25、隔通过定时器定时控制。 其中,SKEY1控制 LED1以 1S为间隔 , 闪烁 3 次,SKEY2控制 LED2以 2S为间隔闪烁 3 次,SKEY3控制 LED3以 3S为间隔 , 闪烁 3次。4、2 原理分析实验需要用到STM32的 GPIO输入输出操作 ,GPIO 外部中断与内部定时器中断。在以上三个实验中, 对各个部分都已经进行过详尽的解释, 这里不再赘述。此实验需要将以上实验做综合, 并对时序进行调整。难点为, 对 GPIO外部中断与定时器内部中断的处理, 即如何确定两种不同中断的优先级。这 里 的 使 用 的 方 法 就 是 , 将 所 有 按 键 外 部 中 断 置 于 中 断
26、分 组 2, 即NVIC_PriorityGroup_2中。 将所有按键中断抢占优先级置为0, 即最高级别中断 ,响应优先级置分别置为1、2、3, 相互区别。将定时器中断抢占优先级置为1, 相应优先级社会中低于按键中断, 使其可以被按键信号中断计时, 并刷新 LED 闪烁状态。4、3 程序分析这在程序初始化阶段 , 分别对 LED 、按键外部中断与定时器中断进行初始化。主函数如下 : int main(void) /* LED 初始化 */ LED_config(); /* LED 闪烁? */ Led_Turn_on_all(); Delay(3000000); 精品资料 - - - 欢迎下
27、载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 10 页,共 11 页 - - - - - - - - - - 嵌入式系统流水灯、按键、定时器实验报告 Led_Turn_off_all(); Delay(3000000); Led_Turn_on_all(); Delay(3000000); Led_Turn_off_all(); Delay(3000000); Led_Turn_on_all(); Delay(3000000); Led_Turn_off_all(); /* 按键初始化 */ GPIO_KEY_Config();
28、/* 按键外部中断初始化 */ KEY_EXIT_Init(); /* 外部中断向量初始化 */ InterruptConfig(); /* 定时器 5 初始化 */ TIM5_Init(); /* 定时器中断初始化 */ NVIC_Configuration(); /* 等待中断触发 */ while (1) 初始化完成后 , 等待中断触发。一旦按键按下, 触发外部中断 , 则进入外部中断服务函数 , 函数中将判断哪一个按键被按下, 记录按下的按键 , 然后给定时器清零并开始计数 , 且清零外部中断标志位。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 11 页,共 11 页 - - - - - - - - - -