你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G431RBTx 模拟升降控制器

[复制链接]
STMCU小助手 发布时间:2023-3-1 20:24
一、题目

099e4b16e471429bb39d727596cf89ed.png

bc1a008f7e014c2dba2c5474a114f779.png

二、模块初始化

这里就简单描述一下模块的配置方法,具体方法到基本模块中有描述。
1.LCD这里不用配置,直接使用提供的资源包就行
2.KEY, 四个按键IO口都要配置,分别是PB0, PB1,PB2,PA0依次是B1,B2,B3,B4不要弄错了
3.PWM:这里使用TIM16的CH1和TIM17的CH1作为发生通道,TIM16→PSC:800-1,ARR:100-1,Pulse:80
TIM17→PSC:400-1,ARR:100-1,Pulse:60
4.LED:开启PC8,9,10,11,12,13,14,15输出模式就行了
5.RTC:详见RTC模块部分,配置方法一样的
6.定时器:由于题目的逻辑比较复杂(笔者个人认为),所以除了开TIM16,TIM17外还要开TIM2,3,4,6,7,8,15,而且中断要全部打开。


三、代码实现
1.void DisposeKey(void); //按键响应函数
  1. void DisposeKey(void)
  2. {

  3.                 if(key[0].single_flag)
  4.                 {
  5.                         if(Dispfloor - 1 != 0)
  6.                         {
  7.                                 LED |= 0x01;
  8.                                 LED_Disp(LED);
  9.                                 floor_want[0] = 1;
  10.                                 __HAL_TIM_SetCounter(&htim4, 0);
  11.                                 last_key_time = 0;
  12.                                 HAL_TIM_Base_Start_IT(&htim4);
  13.                         }
  14.                         key[0].single_flag = 0;
  15.                 }
  16.                 if(key[1].single_flag)
  17.                 {
  18.                         if(Dispfloor - 1 != 1)
  19.                         {
  20.                                 LED |= 0x02;
  21.                                 LED_Disp(LED);
  22.                                 floor_want[1] = 1;
  23.                                 LCD_DisplayStringLine(Line5, "     ");
  24.                                 __HAL_TIM_SetCounter(&htim4, 0);
  25.                                 last_key_time = 0;
  26.                                 HAL_TIM_Base_Start_IT(&htim4);
  27.                         }
  28.                         key[1].single_flag = 0;
  29.                 }
  30.                 if(key[2].single_flag)
  31.                 {
  32.                         if(Dispfloor - 1 != 2)
  33.                         {
  34.                                 LED |= 0x04;
  35.                                 LED_Disp(LED);
  36.                                 floor_want[2] = 1;
  37.                                 __HAL_TIM_SetCounter(&htim4, 0);
  38.                                 last_key_time = 0;
  39.                                 HAL_TIM_Base_Start_IT(&htim4);
  40.                         }
  41.                         key[2].single_flag = 0;
  42.                 }
  43.                 if(key[3].single_flag)
  44.                 {
  45.                         if(Dispfloor - 1 != 3)
  46.                         {
  47.                                 LED |= 0x08;
  48.                                 LED_Disp(LED);
  49.                                 floor_want[3] = 1;
  50.                                 __HAL_TIM_SetCounter(&htim4, 0);
  51.                                 last_key_time = 0;
  52.                                 HAL_TIM_Base_Start_IT(&htim4);

  53.                         }
  54.                         key[3].single_flag = 0;
  55.                 }
  56. }
复制代码

2.void Gate_Control(unsigned char command); //控制门开关
  1. void Gate_Control(unsigned char command)
  2. {
  3.         if(command == 0)
  4.         {
  5.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
  6.                 GateCommand = 0;
  7.         }
  8.         else
  9.         {
  10.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
  11.                 GateCommand = 1;
  12.         }
  13. }
复制代码

3.void Gate_Run(unsigned char GateCommand); //执行门开关
  1. void Gate_Run(unsigned char GateCommand)
  2. {
  3.         if(GateCommand == 0)
  4.         {
  5.                 __HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1, 60);
  6.                 HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);
  7.         }
  8.         if(GateCommand == 1)
  9.         {
  10.                 __HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1, 50);
  11.                 HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);
  12.         }
  13. }
复制代码

4.void UporDown_Control(unsigned char command); //控制上下
  1. void UporDown_Control(unsigned char command)
  2. {
  3.         if(command)
  4.         {
  5.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
  6.                 FloorCommand = 0;
  7.         }
  8.         else
  9.         {
  10.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
  11.                 FloorCommand = 1;
  12.         }
  13. }
复制代码

5.void UporDown_Run(unsigned char FloorCommand); //上下执行
  1. void UporDown_Run(unsigned char FloorCommand)
  2. {
  3.         if(FloorCommand == 0)
  4.         {
  5.                 __HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, 60);
  6.                 HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1);
  7.         }
  8.         else
  9.         {
  10.                 __HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, 80);
  11.                 HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1);               
  12.         }
  13. }
复制代码

6.void Judge_upordown(void); //上下行判断
  1. void Judge_upordown(void)
  2. {
  3.         for(unsigned char i = 0; i < Dispfloor - 1; i++)
  4.         {
  5.                 if(floor_want[i] == 1)
  6.                 {
  7.                         isupdown = DOWN;
  8.                 }
  9.         }
  10.         for(unsigned char i = 3; i > Dispfloor - 1; i--)
  11.         {
  12.                 if(floor_want[i] == 1)
  13.                 {
  14.                         isupdown = UP;
  15.                 }
  16.         }
  17. }
复制代码

7.unsigned char Judge_LowestFloor(void); //判断目标楼层中的最低层
  1. unsigned char Judge_LowestFloor(void)
  2. {
  3.         unsigned char i = 1;
  4.         for(i = 1; i < 4; i++)
  5.         {
  6.                 if(floor_want[i - 1] == 1)
  7.                 {
  8.                         break;
  9.                 }
  10.         }
  11.         return i;
  12. }
复制代码

8.unsigned char Judge_HighestFloor(void); //判断目标楼层中的最高层
  1. unsigned char Judge_HighestFloor(void)
  2. {
  3.         unsigned char i = 4;
  4.         for(i = 4; i > 1; i--)
  5.         {
  6.                 if(floor_want[i - 1] == 1)
  7.                 {
  8.                         break;
  9.                 }
  10.         }
  11.         return i;
  12. }
复制代码


9.unsigned char judge_NextUpFloor(void); //判断上升的下一目标
  1. unsigned char judge_NextUpFloor(void)
  2. {
  3.         unsigned char i = Dispfloor + 1;
  4.         for(i = Dispfloor + 1; i < 4; i++)
  5.         {
  6.                 if(floor_want[i - 1] == 1)
  7.                 {
  8.                         break;
  9.                 }
  10.         }
  11.         return i;
  12. }
复制代码

10.unsigned char judge_NextDownFloor(void); //判断下降的下一目标
  1. unsigned char judge_NextDownFloor(void)
  2. {
  3.         unsigned char i = Dispfloor - 1;
  4.         for(i = Dispfloor - 1; i >= 1; i--)
  5.         {
  6.                 if(floor_want[i - 1] == 1)
  7.                 {
  8.                         break;
  9.                 }
  10.         }
  11.         return i;
  12. }
复制代码

11.interrupt.h以及interrupt.c的全部代码部分
interrupt.h:
  1. #ifndef __INTERRUPT_H__
  2. #define __INTERRUPT_H__

  3. #include "main.h"
  4. #include "stdbool.h"

  5. struct keys
  6. {
  7.         unsigned char judge_sta;
  8.         bool key_sta;
  9.         bool single_flag;
  10.         unsigned int key_time;
  11.         bool long_flag;
  12. };



  13. #endif

复制代码

interrupt.c:
  1. #include "interrupt.h"
  2. #include "lcd.h"
  3. #include "tim.h"
  4. #include "stdio.h"
  5. #include "led.h"

  6. struct keys key[4] = {0, 0, 0, 0, 0};
  7. extern unsigned int last_key_time;
  8. unsigned char should_close_flag = 0;
  9. extern unsigned int closeGate_time;
  10. extern unsigned char should_up_flag;
  11. extern unsigned int upfloor_time;
  12. extern unsigned char upordownRunningflag;
  13. extern unsigned char UpFloorNum;
  14. extern unsigned char Dispfloor;
  15. extern unsigned char NextUpFloor;
  16. extern char text[30];
  17. extern unsigned char isupdown;
  18. extern unsigned char should_open_flag;
  19. extern unsigned char openordownTypeflag;
  20. extern unsigned int openGate_time;
  21. extern unsigned char HighestFloor;
  22. extern unsigned char LowestFloor;
  23. extern unsigned char should_wait_flag;
  24. extern unsigned char waitGate_time;
  25. extern unsigned char LED;
  26. extern unsigned char should_lcdflash_flag;
  27. extern unsigned int lcdflash_time;
  28. extern unsigned char should_lcdflash_flag;
  29. extern unsigned int lcdflash_time;
  30. extern unsigned char floor_want[4];
  31. extern unsigned char should_down_flag;
  32. extern unsigned int downfloor_time;
  33. extern unsigned char DownFloorNum;
  34. extern unsigned char NextDownFloor;
  35. extern unsigned char openorcloseRunningflag;
  36. extern unsigned char waiting;
  37. extern unsigned int ledflash_time;
  38. extern unsigned char index;
  39. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  40. {
  41.         if(htim->Instance == TIM3)
  42.         {
  43.                 if((upordownRunningflag || openorcloseRunningflag || waiting) == 0)
  44.                 {
  45.                         key[0].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);
  46.                         key[1].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
  47.                         key[2].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);
  48.                         key[3].key_sta = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
  49.                         for(unsigned char i = 0; i < 4; i++)
  50.                         {
  51.                                 switch(key[i].judge_sta)
  52.                                 {
  53.                                         case 0:
  54.                                         {
  55.                                                 if(key[i].key_sta == 0)
  56.                                                 {
  57.                                                         key[i].judge_sta = 1;
  58.                                                         key[i].key_time = 0;
  59.                                                 }
  60.                                                 break;
  61.                                         }
  62.                                         case 1:
  63.                                         {
  64.                                                 if(key[i].key_sta == 0)
  65.                                                 {
  66.                                                         key[i].judge_sta = 2;
  67.                                                 }
  68.                                                 else
  69.                                                 {
  70.                                                         key[i].judge_sta = 0;
  71.                                                 }
  72.                                                 break;
  73.                                         }
  74.                                         case 2:
  75.                                         {
  76.                                                 if(key[i].key_sta == 1)
  77.                                                 {
  78.                                                         key[i].judge_sta = 0;
  79.                                                         if(key[i].key_time <= 70)
  80.                                                         {
  81.                                                                 key[i].single_flag = 1;
  82.                                                         }
  83.                                                 }
  84.                                                 else
  85.                                                 {
  86.                                                         key[i].key_time++;
  87.                                                         if(key[i].key_time > 70)
  88.                                                         {
  89.                                                                 key[i].long_flag = 1;
  90.                                                         }
  91.                                                 }
  92.                                                 break;
  93.                                         }
  94.                                 }
  95.                         }
  96.                 }

  97.         }
  98.         if(htim->Instance == TIM4) //按键1s后响应
  99.         {
  100.                         last_key_time++;
  101.                         if(last_key_time == 100)
  102.                         {
  103.                                 last_key_time = 0;
  104.                                 HAL_TIM_Base_Stop(htim);
  105.                                 should_close_flag = 1;
  106.                         }
  107.         }
  108.         if(htim->Instance == TIM6)//关门4s
  109.         {
  110.                 if(openordownTypeflag == CLOSE)
  111.                 {
  112.                         closeGate_time++;
  113.                         if(closeGate_time == 400)
  114.                         {
  115.                                 closeGate_time = 0;
  116.                                 HAL_TIM_Base_Stop_IT(htim);
  117.                                 HAL_TIM_PWM_Stop(&htim17, TIM_CHANNEL_1);
  118.                                 if(isupdown == UP)
  119.                                 {
  120.                                         if(Dispfloor != HighestFloor)
  121.                                         {
  122.                                                 should_up_flag = 1;
  123.                                         }
  124.                                 }
  125.                                 if(isupdown == DOWN)
  126.                                 {
  127.                                         if(Dispfloor != LowestFloor)
  128.                                         {
  129.                                                 should_down_flag = 1;
  130.                                         }
  131.                                 }
  132.                         }
  133.                 }
  134.                 if(openordownTypeflag == OPEN)
  135.                 {
  136.                         openGate_time++;
  137.                         if(openGate_time == 400)
  138.                         {
  139.                                 openGate_time = 0;
  140.                                 HAL_TIM_Base_Stop_IT(htim);
  141.                                 HAL_TIM_PWM_Stop(&htim17, TIM_CHANNEL_1);
  142.                                 openorcloseRunningflag = 0;
  143.                                 if(isupdown == UP)
  144.                                 {
  145.                                         if(Dispfloor != HighestFloor)
  146.                                         {
  147.                                                 should_wait_flag = 1;
  148.                                         }
  149.                                 }
  150.                                 else
  151.                                 {
  152.                                         if(Dispfloor != LowestFloor)
  153.                                         {
  154.                                                 should_wait_flag = 1;
  155.                                         }
  156.                                 }
  157.                         }
  158.                 }

  159.         }
  160.         if(htim->Instance == TIM7) //上楼6s * 层数
  161.         {
  162.                 if(isupdown == UP)
  163.                 {
  164.                         upfloor_time++;
  165.                         if(upfloor_time == 600 * UpFloorNum)
  166.                         {
  167.                                 upfloor_time = 0;
  168.                                 HAL_TIM_Base_Stop_IT(htim);
  169.                                 HAL_TIM_PWM_Stop(&htim16, TIM_CHANNEL_1);
  170.                                 upordownRunningflag = 0;
  171.                                 Dispfloor = NextUpFloor;
  172.                                 floor_want[Dispfloor - 1] = 0;
  173.                                 LED = LED & (~(0x01 << (Dispfloor - 1)));
  174.                                 LED_Disp(LED);
  175.                                 sprintf(text, "            ");
  176.                                 LCD_DisplayStringLine(Line2, text);
  177.                                 should_open_flag = 1;
  178.                                 should_lcdflash_flag = 1;
  179.                         }
  180.                 }
  181.                 if(isupdown == DOWN)
  182.                 {
  183.                         downfloor_time++;
  184.                         if(downfloor_time >= 600 * DownFloorNum)
  185.                         {
  186.                                 downfloor_time = 0;
  187.                                 HAL_TIM_Base_Stop_IT(htim);
  188.                                 HAL_TIM_PWM_Stop(&htim16, TIM_CHANNEL_1);
  189.                                 upordownRunningflag = 0;
  190.                                 Dispfloor = NextDownFloor;
  191.                                 floor_want[Dispfloor - 1] = 0;
  192.                                 LED = LED & (~(0x01 << (Dispfloor - 1)));
  193.                                 LED_Disp(LED);
  194.                                 sprintf(text, "            ");
  195.                                 LCD_DisplayStringLine(Line2, text);
  196.                                 should_open_flag = 1;
  197.                                 should_lcdflash_flag = 1;
  198.                         }
  199.                 }
  200.                
  201.         }
  202.         if(htim->Instance == TIM8)
  203.         {
  204.                 waitGate_time++;
  205.                 if(waitGate_time == 200)
  206.                 {
  207.                         waitGate_time = 0;
  208.                         HAL_TIM_Base_Stop_IT(htim);
  209.                         waiting = 0;
  210.                         should_close_flag = 1;
  211.                 }
  212.         }
  213.         if(htim->Instance == TIM15)
  214.         {
  215.                 lcdflash_time++;
  216.                 if(lcdflash_time == 25)
  217.                 {
  218.                         sprintf(text, "         %d   ", Dispfloor);
  219.                         LCD_DisplayStringLine(Line2, text);
  220.                 }
  221.                 else if(lcdflash_time == 50)
  222.                 {
  223.                         sprintf(text, "              ");
  224.                         LCD_DisplayStringLine(Line2, text);
  225.                 }
  226.                 else if(lcdflash_time == 75)
  227.                 {
  228.                         sprintf(text, "         %d   ", Dispfloor);
  229.                         LCD_DisplayStringLine(Line2, text);
  230.                 }
  231.                 else if(lcdflash_time == 100)
  232.                 {
  233.                         lcdflash_time = 0;
  234.                         HAL_TIM_Base_Stop_IT(htim);
  235.                 }
  236.         }
  237.         if(htim->Instance == TIM2)
  238.         {
  239.                 ledflash_time++;
  240.                 if(ledflash_time == 10)
  241.                 {
  242.                         ledflash_time = 0;
  243.                         index++;
  244.                         index %= 4;
  245.                 }
  246.         }
  247. }

复制代码

12.main.c的全部代码:
main.c:
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * @file           : main.c
  5.   * @brief          : Main program body
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * <h2><center>© Copyright (c) 2023 STMicroelectronics.
  10.   * All rights reserved.</center></h2>
  11.   *
  12.   * This software component is licensed by ST under BSD 3-Clause license,
  13.   * the "License"; You may not use this file except in compliance with the
  14.   * License. You may obtain a copy of the License at:
  15.   *                        opensource.org/licenses/BSD-3-Clause
  16.   *
  17.   ******************************************************************************
  18.   */
  19. /* USER CODE END Header */
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "main.h"
  22. #include "rtc.h"
  23. #include "tim.h"
  24. #include "gpio.h"

  25. /* Private includes ----------------------------------------------------------*/
  26. /* USER CODE BEGIN Includes */
  27. #include "lcd.h"
  28. #include "interrupt.h"
  29. #include "stdio.h"
  30. #include "led.h"
  31. #include "stdlib.h"
  32. /* USER CODE END Includes */

  33. /* Private typedef -----------------------------------------------------------*/
  34. /* USER CODE BEGIN PTD */

  35. /* USER CODE END PTD */

  36. /* Private define ------------------------------------------------------------*/
  37. /* USER CODE BEGIN PD */
  38. /* USER CODE END PD */

  39. /* Private macro -------------------------------------------------------------*/
  40. /* USER CODE BEGIN PM */

  41. /* USER CODE END PM */

  42. /* Private variables ---------------------------------------------------------*/

  43. /* USER CODE BEGIN PV */
  44. extern struct keys key[4];
  45. char text[30];

  46. unsigned char Dispfloor = 1;
  47. RTC_TimeTypeDef T;
  48. RTC_DateTypeDef D;
  49. unsigned char second;
  50. unsigned char LED = 0x00;
  51. unsigned int last_key_time = 0;
  52. extern unsigned char should_close_flag;
  53. unsigned char GateCommand;
  54. unsigned int closeGate_time;
  55. unsigned char FloorCommand;
  56. unsigned char should_up_flag;
  57. unsigned int upfloor_time;
  58. unsigned char floor_want[4] = {0, 0, 0, 0};
  59. unsigned char isupdown = UP;
  60. unsigned char HighestFloor = 1;
  61. unsigned char LowestFloor = 1;
  62. unsigned char should_judge_flag = 1;
  63. unsigned char upordownRunningflag;
  64. unsigned char NextUpFloor;
  65. unsigned char UpFloorNum;
  66. unsigned char should_open_flag;
  67. unsigned char openordownTypeflag;
  68. unsigned int openGate_time;
  69. unsigned char should_wait_flag;
  70. unsigned char waitGate_time;
  71. unsigned char should_lcdflash_flag;
  72. unsigned int lcdflash_time;
  73. unsigned char NextDownFloor;
  74. unsigned char DownFloorNum;
  75. unsigned char should_down_flag;
  76. unsigned int downfloor_time;
  77. unsigned char openorcloseRunningflag;
  78. unsigned char waiting;
  79. unsigned int ledflash_time;
  80. unsigned char index;
  81. /* USER CODE END PV */

  82. /* Private function prototypes -----------------------------------------------*/
  83. void SystemClock_Config(void);
  84. /* USER CODE BEGIN PFP */
  85. void DisposeKey(void);
  86. void Gate_Control(unsigned char command);
  87. void Gate_Run(unsigned char GateCommand);
  88. void UporDown_Control(unsigned char command);
  89. void UporDown_Run(unsigned char FloorCommand);
  90. void Judge_upordown(void);
  91. unsigned char Judge_HighestFloor(void);
  92. unsigned char Judge_LowestFloor(void);
  93. unsigned char judge_NextUpFloor(void);
  94. unsigned char judge_NextDownFloor(void);
  95. /* USER CODE END PFP */

  96. /* Private user code ---------------------------------------------------------*/
  97. /* USER CODE BEGIN 0 */

  98. /* USER CODE END 0 */

  99. /**
  100.   * @brief  The application entry point.
  101.   * @retval int
  102.   */
  103. int main(void)
  104. {
  105.   /* USER CODE BEGIN 1 */

  106.   /* USER CODE END 1 */

  107.   /* MCU Configuration--------------------------------------------------------*/

  108.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  109.   HAL_Init();

  110.   /* USER CODE BEGIN Init */

  111.   /* USER CODE END Init */

  112.   /* Configure the system clock */
  113.   SystemClock_Config();

  114.   /* USER CODE BEGIN SysInit */

  115.   /* USER CODE END SysInit */

  116.   /* Initialize all configured peripherals */
  117.   MX_GPIO_Init();
  118.   MX_TIM3_Init();
  119.   MX_TIM16_Init();
  120.   MX_TIM17_Init();
  121.   MX_RTC_Init();
  122.   MX_TIM4_Init();
  123.   MX_TIM6_Init();
  124.   MX_TIM7_Init();
  125.   MX_TIM8_Init();
  126.   MX_TIM15_Init();
  127.   MX_TIM2_Init();
  128.   /* USER CODE BEGIN 2 */
  129.         LCD_Init();
  130.         LCD_Clear(Black);
  131.         LCD_SetBackColor(Black);
  132.         LCD_SetTextColor(White);
  133.         HAL_TIM_Base_Start_IT(&htim3);
  134.         LCD_DisplayStringLine(Line1, "        floor");
  135.         sprintf(text, "         %d", Dispfloor);
  136.         LCD_DisplayStringLine(Line2, text);
  137.         LED_Disp(0x00);
  138.   /* USER CODE END 2 */

  139.   /* Infinite loop */
  140.   /* USER CODE BEGIN WHILE */
  141.   while (1)
  142.   {
  143.     /* USER CODE END WHILE */

  144.     /* USER CODE BEGIN 3 */
  145.                 HAL_RTC_GetTime(&hrtc, &T, RTC_FORMAT_BIN);
  146.                 HAL_RTC_GetDate(&hrtc, &D, RTC_FORMAT_BIN);
  147.                 if(second != T.Seconds)
  148.                 {
  149.                         second = T.Seconds;
  150.                         sprintf(text, "      %02d:%02d:%02d", T.Hours, T.Minutes, T.Seconds);
  151.                         LCD_DisplayStringLine(Line4, text);
  152.                 }
  153. /*************************以上是RTC*********************************************************/
  154.                 DisposeKey();
  155.                 if(floor_want[0] + floor_want[1] + floor_want[2] + floor_want[3] != 0)
  156.                 {
  157.                         if(isupdown == UP)
  158.                         {
  159.                                 HighestFloor = Judge_HighestFloor();
  160.                         }
  161.                         if(isupdown == DOWN)
  162.                         {
  163.                                 LowestFloor = Judge_LowestFloor();
  164.                         }
  165.                 }
  166.                 if(isupdown == UP)
  167.                 {
  168.                         if(Dispfloor == HighestFloor)
  169.                         {
  170.                                 should_judge_flag = 1;
  171.                         }
  172.                 }
  173.                 if(isupdown == DOWN)
  174.                 {
  175.                         if(Dispfloor == LowestFloor)
  176.                         {
  177.                                 should_judge_flag = 1;
  178.                         }
  179.                 }
  180.                 if(should_judge_flag)
  181.                 {
  182.                         if(floor_want[0] + floor_want[1] + floor_want[2] + floor_want[3] != 0)
  183.                         {
  184.                                 unsigned char temp_Highest = Judge_HighestFloor();
  185.                                 unsigned char temp_Lowest = Judge_LowestFloor();
  186.                                 if(Dispfloor > temp_Lowest)
  187.                                 {
  188.                                         isupdown = DOWN;
  189.                                 }
  190.                                 if(Dispfloor < temp_Highest)
  191.                                 {
  192.                                         isupdown = UP;
  193.                                 }

  194.                         }
  195.                 }
  196. /***********************以上是判断上行还是下行******************************************************/
  197.                 if(upordownRunningflag)
  198.                 {

  199.                         HAL_TIM_Base_Start_IT(&htim2);
  200.                         if(isupdown == UP)
  201.                         {
  202.                                 LED = ((LED & 0x0f) | (0x01 << (4 + index)));
  203.                                 LED_Disp(LED);
  204.                         }
  205.                         else
  206.                         {
  207.                                 LED = ((LED & 0x0f) | (0x08 << (4 - index)));
  208.                                 LED_Disp(LED);
  209.                         }
  210.                 }
  211.                 else
  212.                 {
  213.                         __HAL_TIM_SetCounter(&htim2, 0);
  214.                         ledflash_time = 0;
  215.                         HAL_TIM_Base_Stop_IT(&htim2);
  216.                         LED = LED & 0x0f;
  217.                         LED_Disp(LED);
  218.                 }
  219. /**********************以上是LED流动***************************************************************/

  220.                 if(isupdown == UP)
  221.                 {
  222.                         NextUpFloor = judge_NextUpFloor();
  223.                         UpFloorNum = NextUpFloor - Dispfloor;
  224.                 }
  225.                 else
  226.                 {
  227.                         NextDownFloor = judge_NextDownFloor();
  228.                         DownFloorNum = Dispfloor - NextDownFloor;
  229.                 }
  230.                 if(should_close_flag)
  231.                 {
  232.                         should_close_flag = 0;
  233.                         Gate_Control(CLOSE);
  234.                         Gate_Run(CLOSE);
  235.                         openordownTypeflag = CLOSE;
  236.                         openorcloseRunningflag = 1;
  237.                         __HAL_TIM_SetCounter(&htim6, 0);
  238.                         closeGate_time = 0;
  239.                         HAL_TIM_Base_Start_IT(&htim6);
  240.                 }
  241.                 if(should_up_flag)
  242.                 {
  243.                         should_up_flag = 0;
  244.                         UporDown_Control(UP);
  245.                         UporDown_Run(UP);
  246.                         upordownRunningflag = 1;
  247.                         __HAL_TIM_SetCounter(&htim7, 0);
  248.                         upfloor_time = 0;
  249.                         HAL_TIM_Base_Start_IT(&htim7);
  250.                 }
  251.                 if(should_down_flag)
  252.                 {
  253.                         should_down_flag = 0;
  254.                         UporDown_Control(DOWN);
  255.                         UporDown_Run(DOWN);
  256.                         upordownRunningflag = 1;
  257.                         __HAL_TIM_SetCounter(&htim7, 0);
  258.                         downfloor_time = 0;
  259.                         HAL_TIM_Base_Start_IT(&htim7);
  260.                 }
  261.                 if(should_open_flag)
  262.                 {
  263.                         should_open_flag = 0;
  264.                         Gate_Control(OPEN);
  265.                         Gate_Run(OPEN);
  266.                         openordownTypeflag = OPEN;
  267.                         openorcloseRunningflag = 1;
  268.                         __HAL_TIM_SetCounter(&htim6, 0);
  269.                         openGate_time = 0;
  270.                         HAL_TIM_Base_Start_IT(&htim6);
  271.                 }
  272.                 if(should_wait_flag)
  273.                 {
  274.                         should_wait_flag = 0;
  275.                         waiting = 1;
  276.                         __HAL_TIM_SetCounter(&htim8, 0);
  277.                         waitGate_time = 0;
  278.                         HAL_TIM_Base_Start_IT(&htim8);
  279.                 }
  280.                 if(should_lcdflash_flag)
  281.                 {
  282.                         should_lcdflash_flag = 0;
  283.                         __HAL_TIM_SetCounter(&htim15, 0);
  284.                         lcdflash_time = 0;
  285.                         HAL_TIM_Base_Start_IT(&htim15);
  286.                 }
  287.                
  288. /*****************************************************以上是控制区******************************/               

  289.   }
  290.   /* USER CODE END 3 */
  291. }

  292. /**
  293.   * @brief System Clock Configuration
  294.   * @retval None
  295.   */
  296. void SystemClock_Config(void)
  297. {
  298.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  299.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  300.   RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  301.   /** Configure the main internal regulator output voltage
  302.   */
  303.   HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
  304.   /** Initializes the RCC Oscillators according to the specified parameters
  305.   * in the RCC_OscInitTypeDef structure.
  306.   */
  307.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  308.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  309.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  310.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  311.   RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;
  312.   RCC_OscInitStruct.PLL.PLLN = 20;
  313.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  314.   RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  315.   RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  316.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  317.   {
  318.     Error_Handler();
  319.   }
  320.   /** Initializes the CPU, AHB and APB buses clocks
  321.   */
  322.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  323.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  324.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  325.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  326.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  327.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  328.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  329.   {
  330.     Error_Handler();
  331.   }
  332.   /** Initializes the peripherals clocks
  333.   */
  334.   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  335.   PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_HSE_DIV32;

  336.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  337.   {
  338.     Error_Handler();
  339.   }
  340. }

  341. /* USER CODE BEGIN 4 */
  342. void DisposeKey(void)
  343. {

  344.                 if(key[0].single_flag)
  345.                 {
  346.                         if(Dispfloor - 1 != 0)
  347.                         {
  348.                                 LED |= 0x01;
  349.                                 LED_Disp(LED);
  350.                                 floor_want[0] = 1;
  351.                                 __HAL_TIM_SetCounter(&htim4, 0);
  352.                                 last_key_time = 0;
  353.                                 HAL_TIM_Base_Start_IT(&htim4);
  354.                         }
  355.                         key[0].single_flag = 0;
  356.                 }
  357.                 if(key[1].single_flag)
  358.                 {
  359.                         if(Dispfloor - 1 != 1)
  360.                         {
  361.                                 LED |= 0x02;
  362.                                 LED_Disp(LED);
  363.                                 floor_want[1] = 1;
  364.                                 LCD_DisplayStringLine(Line5, "     ");
  365.                                 __HAL_TIM_SetCounter(&htim4, 0);
  366.                                 last_key_time = 0;
  367.                                 HAL_TIM_Base_Start_IT(&htim4);
  368.                         }
  369.                         key[1].single_flag = 0;
  370.                 }
  371.                 if(key[2].single_flag)
  372.                 {
  373.                         if(Dispfloor - 1 != 2)
  374.                         {
  375.                                 LED |= 0x04;
  376.                                 LED_Disp(LED);
  377.                                 floor_want[2] = 1;
  378.                                 __HAL_TIM_SetCounter(&htim4, 0);
  379.                                 last_key_time = 0;
  380.                                 HAL_TIM_Base_Start_IT(&htim4);
  381.                         }
  382.                         key[2].single_flag = 0;
  383.                 }
  384.                 if(key[3].single_flag)
  385.                 {
  386.                         if(Dispfloor - 1 != 3)
  387.                         {
  388.                                 LED |= 0x08;
  389.                                 LED_Disp(LED);
  390.                                 floor_want[3] = 1;
  391.                                 __HAL_TIM_SetCounter(&htim4, 0);
  392.                                 last_key_time = 0;
  393.                                 HAL_TIM_Base_Start_IT(&htim4);

  394.                         }
  395.                         key[3].single_flag = 0;
  396.                 }
  397.        
  398.        
  399. }

  400. void Gate_Control(unsigned char command)
  401. {
  402.         if(command == 0)
  403.         {
  404.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
  405.                 GateCommand = 0;
  406.         }
  407.         else
  408.         {
  409.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
  410.                 GateCommand = 1;
  411.         }
  412. }

  413. void Gate_Run(unsigned char GateCommand)
  414. {
  415.         if(GateCommand == 0)
  416.         {
  417.                 __HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1, 60);
  418.                 HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);
  419.         }
  420.         if(GateCommand == 1)
  421.         {
  422.                 __HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1, 50);
  423.                 HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);
  424.         }
  425. }

  426. void UporDown_Control(unsigned char command)
  427. {
  428.         if(command)
  429.         {
  430.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
  431.                 FloorCommand = 0;
  432.         }
  433.         else
  434.         {
  435.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
  436.                 FloorCommand = 1;
  437.         }
  438. }

  439. void UporDown_Run(unsigned char FloorCommand)
  440. {
  441.         if(FloorCommand == 0)
  442.         {
  443.                 __HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, 60);
  444.                 HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1);
  445.         }
  446.         else
  447.         {
  448.                 __HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, 80);
  449.                 HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1);               
  450.         }
  451. }

  452. void Judge_upordown(void)
  453. {
  454.         for(unsigned char i = 0; i < Dispfloor - 1; i++)
  455.         {
  456.                 if(floor_want[i] == 1)
  457.                 {
  458.                         isupdown = DOWN;
  459.                 }
  460.         }
  461.         for(unsigned char i = 3; i > Dispfloor - 1; i--)
  462.         {
  463.                 if(floor_want[i] == 1)
  464.                 {
  465.                         isupdown = UP;
  466.                 }
  467.         }
  468. }

  469. unsigned char Judge_HighestFloor(void)
  470. {
  471.         unsigned char i = 4;
  472.         for(i = 4; i > 1; i--)
  473.         {
  474.                 if(floor_want[i - 1] == 1)
  475.                 {
  476.                         break;
  477.                 }
  478.         }
  479.         return i;
  480. }

  481. unsigned char Judge_LowestFloor(void)
  482. {
  483.         unsigned char i = 1;
  484.         for(i = 1; i < 4; i++)
  485.         {
  486.                 if(floor_want[i - 1] == 1)
  487.                 {
  488.                         break;
  489.                 }
  490.         }
  491.         return i;
  492. }

  493. unsigned char judge_NextUpFloor(void)
  494. {
  495.         unsigned char i = Dispfloor + 1;
  496.         for(i = Dispfloor + 1; i < 4; i++)
  497.         {
  498.                 if(floor_want[i - 1] == 1)
  499.                 {
  500.                         break;
  501.                 }
  502.         }
  503.         return i;
  504. }

  505. unsigned char judge_NextDownFloor(void)
  506. {
  507.         unsigned char i = Dispfloor - 1;
  508.         for(i = Dispfloor - 1; i >= 1; i--)
  509.         {
  510.                 if(floor_want[i - 1] == 1)
  511.                 {
  512.                         break;
  513.                 }
  514.         }
  515.         return i;
  516. }


  517. /* USER CODE END 4 */

  518. /**
  519.   * @brief  This function is executed in case of error occurrence.
  520.   * @retval None
  521.   */
  522. void Error_Handler(void)
  523. {
  524.   /* USER CODE BEGIN Error_Handler_Debug */
  525.   /* User can add his own implementation to report the HAL error return state */
  526.   __disable_irq();
  527.   while (1)
  528.   {
  529.   }
  530.   /* USER CODE END Error_Handler_Debug */
  531. }

  532. #ifdef  USE_FULL_ASSERT
  533. /**
  534.   * @brief  Reports the name of the source file and the source line number
  535.   *         where the assert_param error has occurred.
  536.   * @param  file: pointer to the source file name
  537.   * @param  line: assert_param error line source number
  538.   * @retval None
  539.   */
  540. void assert_failed(uint8_t *file, uint32_t line)
  541. {
  542.   /* USER CODE BEGIN 6 */
  543.   /* User can add his own implementation to report the file name and line number,
  544.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  545.   /* USER CODE END 6 */
  546. }
  547. #endif /* USE_FULL_ASSERT */

  548. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

复制代码

————————————————
版权声明:火花页.



收藏 评论0 发布时间:2023-3-1 20:24

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版