当前位置:   article > 正文

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

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,每一个状态切换变量只持续相应的时间,并在持续了相应时间后赋值给状态切换变量下一个状态对应的值,最后给计时变量清零,重新计时(主要代码如下所示)。

  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3. if(htim->Instance == TIM3)
  4. {
  5. tim++;
  6. switch(LED_flag)
  7. {
  8. case 1:
  9. {
  10. if(tim == 5000)
  11. {
  12. LED_flag = 2;
  13. tim = 0;
  14. }
  15. break;
  16. }
  17. case 2:
  18. {
  19. if(tim == 2000)
  20. {
  21. LED_flag = 3;
  22. tim = 0;
  23. }
  24. break;
  25. }
  26. case 3:
  27. {
  28. if(tim == 5000)
  29. {
  30. LED_flag = 4;
  31. tim = 0;
  32. }
  33. break;
  34. }
  35. case 4:
  36. {
  37. if(tim == 2000)
  38. {
  39. LED_flag = 1;
  40. tim = 0;
  41. }
  42. break;
  43. }
  44. }
  45. }
  46. }

⑤在主函数中调用定时器文件的状态切换变量LED_flag,输入定时器开启函数,使用状态切换变量的值来开启对应状态的GPIO,随着状态切换变量值的变化改变GPIO输出值,进行硬件连线从而实现实验功能(主要代码如下如示)。

  1. while (1)
  2. {
  3. switch(LED_flag)
  4. {
  5. case 1:
  6. {
  7. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_7,GPIO_PIN_RESET);
  8. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_6,GPIO_PIN_SET);
  9. break;
  10. }
  11. case 2:
  12. {
  13. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_6,GPIO_PIN_RESET);
  14. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_5|GPIO_PIN_7,GPIO_PIN_RESET);
  15. break;
  16. }
  17. case 3:
  18. {
  19. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_6,GPIO_PIN_RESET);
  20. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_7,GPIO_PIN_SET);
  21. break;
  22. }
  23. case 4:
  24. {
  25. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_6,GPIO_PIN_RESET);
  26. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_7|GPIO_PIN_5,GPIO_PIN_RESET);
  27. break;
  28. }
  29. }

四、实验收获 

①学会了定时器中断的使用,通过定时器中断服务函数来改变变量,在主程序中进行外部变量调用来改变while循环中灯光状态的切换。

②学会了GPIO的高低电平的输出函数。

③学会了定时器中断的周期计算,定时器频率=定时器的输入时钟频率/[(PRESCALE+1)*(Counter Period+1)]

④学会了GPIO输出和定时器中断开启在CUBE上的配置和在KEIL软件中的开启和调用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/302027
推荐阅读
相关标签
  

闽ICP备14008679号