嵌入式系统 流水灯、按键、定时器实验报告 联系客服

发布时间 : 星期四 文章嵌入式系统 流水灯、按键、定时器实验报告更新完毕开始阅读d3214c3304a1b0717ed5dd9f

然后自动装载计数值,计数从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)。函数首先将中断向量表首地址置于0x08000000:

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000); 然后使能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)中进行处理。

在中断服务函数中判断并清除了中断标志位,以便定时器下一次计数中断产生。函数中调用了LED_Spark()函数(见附录9),实现了LED的闪烁。

程序流程图如下:

硬件连接方式如下图所示:

实验四、按键中断控制LED灯定时闪烁

4.1实验要求

综合实验一、二、三,利用STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯闪烁,闪烁间隔通过定时器定时控制。其中,SKEY1控制LED1以1S为间隔,闪烁3次,SKEY2控制LED2以2S为间隔闪烁3次,SKEY3控制LED3以3S为间隔,闪烁3次。

4.2原理分析

实验需要用到STM32的GPIO输入输出操作,GPIO外部中断和内部定时器中断。在以上三个实验中,对各个部分都已经进行过详尽的解释,这里不再赘述。 此实验需要将以上实验做综合,并对时序进行调整。难点为,对GPIO外部中断和定时器内部中断的处理,即如何确定两种不同中断的优先级。

这里的使用的方法是,将所有按键外部中断置于中断分组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); 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) { } }

初始化完成后,等待中断触发。一旦按键按下,触发外部中断,则进入外部中断服务函数,函数中将判断哪一个按键被按下,记录按下的按键,然后给定时器清零并开始计数,且清零外部中断标志位。