嵌入式定时器实验报告.pdf
嵌入式系统应用嵌入式系统应用实验报告实验报告姓姓名:名:学学号:号:学学院:院:专专业:业:班班级:级:指导教师:指导教师:.-实验实验 1 1、流水灯实验、流水灯实验1.11.1 实验要求实验要求编程控制实验板上 LED 灯轮流点亮、熄灭,中间间隔一定时间。1.21.2 原理分析原理分析实验主要考察对 STM32F10X 系列单片机 GPIO 的输出操作。参阅数据手册可知,通过软件编程,GPIO 可以配置成以下几种模式:输入浮空输入上拉输入下拉模拟输入开漏输出推挽式输出推挽式复用功能开漏式复用功能根据实验要求,应该首先将 GPIO 配置为推挽输出模式。由原理图可知,单片机 GPIO 输出信号经过 74HC244 缓冲器,连接 LED 灯。由于 74HC244 的 OE1 和 OE2 都接地,为相同电平,故 A 端电平与 Y 端电平相同且LED 灯共阳,所以,如果要点亮 LED,GPIO 应输出低电平。反之,LED 灯熄灭。1.31.3 程序分析程序分析软件方面,在程序启动时,调用SystemInit()函数(见附录见附录 1 1),对系统时钟等关键部分进行初始化,然后再对 GPIO 进行配置。GPIO 配置函数为 SZ_STM32_LEDInit()(见附录见附录 2 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)。初始化完成后,程序循环点亮一个 LED 并熄灭其他 LED,中间通过 Delay()函数进行延时,达到流水灯的效果(程序完整代码见附录程序完整代码见附录 3 3)。实验程序流程图如下:硬件方面,根据实验指南,将实验板做如下连接:1.3 实验结果.-实验二、按键实验实验二、按键实验2.12.1 实验要求实验要求利用 STM32 读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯亮起。2.22.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和 PE15共享一个 GPIO 中断。以下图片为以 EXTI0 为例的外部中断/事件线路映像:要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2 个触发寄存器,同时在中断屏蔽寄存器的相应位写1允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置 1。在挂起寄存器的对应位写1,将清除该中断请求。要把 IO 口作为外部中断输入,有以下几个步骤:(1)初始化 IO 口为输入。这一步设置要作为外部中断输入的 IO 口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。(2)开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。STM32 的 IO 口与中断线的对应关系需要配置外部中断配置寄存器 EXTICR,这样我们要先开启复用时钟,然后配置 IO 口与中断线的对应关系。才能把外部中断与中断线连接起来。(3)开启与该 IO 口相对的线上中断/事件,设置触发条件。这一步,我们要配置中断产生的条件,STM32 可以配置成上升沿触发,下降沿触发,或者任意.-电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情况来配置。同时要开启中断线上的中断,这里需要注意的是:如果使用外部中断,并设置该中断的 EMR 位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置 EMR 位。(4)配置中断分组(NVIC),并使能中断。这一步,我们就是配置中断的分组以及使能,对 STM32 的中断来说,只有配置了 NVIC 的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。(5)编写中断服务函数。这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃。所以在开启了某个中断后,应为该中断编写服务函数。在中断服务函数里面编写要执行的中断后的操作,并很据情况判断是否要对中断产生的标志位进行清零。由原理图可知,按键未按下时,GPIO 读到的为高电平,按键按下后,IO 口接地,产生一个电平跳变,所以外部中断触发方式应该设置为下降沿触发。2.3 程序分析LED 灯的点亮与实验一中相同,不过多赘述。程序首先对按键进行初始化,初始化函数为 GPIO_KEY_Config()(见附录见附录 4 4),配置过程与实验一中 GPIO 配置基本一致。由于此处 GPIO 需要采集外界按键信号,故 GPIO 模式应该为调整为内部上拉电阻输入GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU。然后执行 GPIO 中断初始化函数 KEY_EXIT_Init()(见附录见附录 5 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_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure)。之后进行中断分组配置及中断优先级配置,函数为 InterruptConfig()(见见附录附录 6 6)。.-配置过程较为复杂,涉及到抢占优先级和响应优先级的概念。程序首先将所有外部中断归为 NVIC_PriorityGroup_2,即 2 位抢占优先级和 2 位响应优先级:NVIC_PriorityGroupConfig(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;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_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)。初始化完成后,程序进入等待按键中断触发状态,一旦按键按下,则进入中断服务函数 EXTI9_5_IRQHandler()(见附录见附录 7 7)中。在函数中对 LED 灯进行点亮、熄灭操作,并重置中断产生标志位。实验流程图如下(主函数代码见附录主函数代码见附录 8 8):硬件连接方式如下图所示:.-2.3 实验结果.-实验三、定时器实验实验三、定时器实验3.13.1 实验要求实验要求利用 STM32 的通用定时器 TIM5 产生一个 1S 的中断,在中断函数中实现LED1、LED2、LED3、LED4 同时翻转的效果。3.23.2 原理分析原理分析实验主要考察对 STM32F10X 系列单片机定时器的使用。实验中使用的 STM32F107 单片机有多达 10 个定时器,包括:多达 4 个 16 位定时器,每个定时器有多达 4 个用于输入捕获/输出比较/PWM 或脉冲计数的通道和增量编码器输入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=模块入口时钟 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。其中拆分方法很多 35000*2000=72,000,000,只要注意计数器的值和预分频值都必须小于 65535 即可。当计数值溢出后,会改变计数溢出标志位,并产生定时器中断,实验中使用其产生中断来进行 LED 灯翻转。3.33.3 程序分析程序分析LED 初始化部分与实验一相同,完成初始化后,点亮所有 LED 灯。定时器配置函数为 TIM5_Init()(见附录见附录 6 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;最后写入计时器配置寄存器,完成配置:TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure)。配置完成后,还要对计数器溢出标志位进行清零,并打开溢出中断,使能计数器以开始计数。TIM_ClearITPendingBit(TIM5,TIM_IT_Update);TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);TIM_Cmd(TIM5,ENABLE)。定时器配置完成并使能后,计数器开始工作,当到达预设的计数值之后,产生中断信号。系统在进行相关配置后可以响应定时器产生的中断,中断配置函数为 NVIC_Configuration()(见附录见附录 7 7)。函数首先将中断向量表首地址置于0 x08000000:NVIC_SetVectorTable(NVIC_VectTab_FLASH,0 x0000);然后使能 TIM5 中断:NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;最后将配置参数写入中断控制寄存器,完成配置:NVIC_Init(&NVIC_InitStructure)。一旦中断产生,系统会对中断产生响应,暂停所有正在执行的低优先级任务且将任务信息和数据压入对应对战区,并进入中断服务函数TIM5_IRQHandler()(见附录见附录 8 8)中进行处理。在中断服务函数中判断并清除了中断标志位,以便定时器下一次计数中断产生。函数中调用了 LED_Spark()函数(见附录见附录 9 9),实现了 LED 的闪烁。程序流程图如下:.-硬件连接方式如下图所示:.-实验四、按键中断控制实验四、按键中断控制 LEDLED 灯定时闪烁灯定时闪烁4.14.1 实验要求实验要求综合实验一、二、三,利用STM32 读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯闪烁,闪烁间隔通过定时器定时控制。其中,SKEY1 控制 LED1 以 1S 为间隔,闪烁 3 次,SKEY2 控制 LED2 以 2S为间隔闪烁 3 次,SKEY3 控制 LED3 以 3S 为间隔,闪烁 3 次。4.24.2 原理分析原理分析实验需要用到 STM32 的 GPIO 输入输出操作,GPIO 外部中断和内部定时器中断。在以上三个实验中,对各个部分都已经进行过详尽的解释,这里不再赘述。此实验需要将以上实验做综合,并对时序进行调整。难点为,对 GPIO 外部中断和定时器内部中断的处理,即如何确定两种不同中断的优先级。这里的使用的方法是,将所有按键外部中断置于中断分组 2,即NVIC_PriorityGroup_2 中。将所有按键中断抢占优先级置为 0,即最高级别中断,响应优先级置分别置为 1、2、3,相互区别。将定时器中断抢占优先级置为 1,相应优先级社会中低于按键中断,使其可以被按键信号中断计时,并刷新LED闪烁状态。4.34.3 程序分析程序分析这在程序初始化阶段,分别对 LED、按键外部中断和定时器中断进行初始化。主函数如下:int main(void)/*LED 初始化*/LED_config();/*LED 闪烁*/Led_Turn_on_all();Delay(3000000);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();/*按键外部中断初始化*/KEY_EXIT_Init();/*外部中断向量初始化*/.-InterruptConfig();/*定时器 5 初始化*/TIM5_Init();/*定时器中断初始化*/NVIC_Configuration();/*等待中断触发*/while(1)初始化完成后,等待中断触发。一旦按键按下,触发外部中断,则进入外部中断服务函数,函数中将判断哪一个按键被按下,记录按下的按键,然后给定时器清零并开始计数,且清零外部中断标志位。