赞
踩
PC机一台、实验箱一台
完成交通灯控制,实现东、南、西、北四个方向的交通灯控制,自主定义东、西、南、北方向灯。要求实现如图1所示的状态切换。
图1 交通灯控制状态切换图
①先在CUBE软件中进行硬件的图形化配置,选择STM32F407ZE芯片后,先进行常规的RCC和SYS设置,并配置时钟树使得HCLK为168MHz(如图2所示),在CUBE的项目管理中进行项目的命名、存放地址、IDE等配置。
图2 CUBE时钟树的配置
②分析实验内容得,实验中需要用到定时器来保证切换时间的精准,打开TIM2定时器及中断,配置使得定时器周期为1ms(如图3、4、5所示)。
图3 定时器的开启
图4 定时器的配置
图5 定时器中断的开启
③分析实验内容中还可以发现,在实验中需要控制4盏红灯和4盏绿灯的亮灭,打开相应的GPIO,并设置模式为输出(如图6所示)。
图6 GPIO的配置
④生成配置代码,进入到KEIL中完成相关功能代码,先进行KEIL的常规配置,设置晶振频率为8MHz,并设置硬件调试模式为J-LINK/J-TRACE Cortex,在定时器中断函数中定义计时变量tim和状态切换变量LED_flag,每一个状态切换变量只持续相应的时间,并在持续了相应时间后赋值给状态切换变量下一个状态对应的值,最后给计时变量清零,重新计时(主要代码如下所示)。
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
- {
- if(htim->Instance == TIM3)
- {
- tim++;
- switch(LED_flag)
- {
- case 1:
- {
- if(tim == 5000)
- {
- LED_flag = 2;
- tim = 0;
- }
- break;
- }
- case 2:
- {
- if(tim == 2000)
- {
- LED_flag = 3;
- tim = 0;
- }
- break;
- }
- case 3:
- {
- if(tim == 5000)
- {
- LED_flag = 4;
- tim = 0;
- }
- break;
- }
- case 4:
- {
- if(tim == 2000)
- {
- LED_flag = 1;
- tim = 0;
- }
- break;
- }
- }
- }
- }
⑤在主函数中调用定时器文件的状态切换变量LED_flag,输入定时器开启函数,使用状态切换变量的值来开启对应状态的GPIO,随着状态切换变量值的变化改变GPIO输出值,进行硬件连线从而实现实验功能(主要代码如下如示)。
- while (1)
- {
- switch(LED_flag)
- {
- case 1:
- {
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_7,GPIO_PIN_RESET);
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_6,GPIO_PIN_SET);
- break;
- }
- case 2:
- {
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_6,GPIO_PIN_RESET);
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_5|GPIO_PIN_7,GPIO_PIN_RESET);
- break;
- }
- case 3:
- {
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_6,GPIO_PIN_RESET);
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_7,GPIO_PIN_SET);
- break;
- }
- case 4:
- {
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_6,GPIO_PIN_RESET);
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_7|GPIO_PIN_5,GPIO_PIN_RESET);
- break;
- }
- }
①学会了定时器中断的使用,通过定时器中断服务函数来改变变量,在主程序中进行外部变量调用来改变while循环中灯光状态的切换。
②学会了GPIO的高低电平的输出函数。
③学会了定时器中断的周期计算,定时器频率=定时器的输入时钟频率/[(PRESCALE+1)*(Counter Period+1)]
④学会了GPIO输出和定时器中断开启在CUBE上的配置和在KEIL软件中的开启和调用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。