单片机实验一(GPIO口输出+定时器实验)

一、实验设备

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软件中的开启和调用。

  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值