Advertisement
Guest User

Untitled

a guest
Oct 19th, 2021
499
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.14 KB | None | 0 0
  1. /* USER CODE BEGIN Header */
  2. /**
  3.  ******************************************************************************
  4.  * @file           : main.c
  5.  * @brief          : Main program body
  6.  ******************************************************************************
  7.  * @attention
  8.  *
  9.  * <h2><center>&copy; Copyright (c) 2021 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.  
  23. /* Private includes ----------------------------------------------------------*/
  24. /* USER CODE BEGIN Includes */
  25. #include "stdio.h"
  26. #include "string.h"
  27. /* USER CODE END Includes */
  28.  
  29. /* Private typedef -----------------------------------------------------------*/
  30. /* USER CODE BEGIN PTD */
  31.  
  32. /* USER CODE END PTD */
  33.  
  34. /* Private define ------------------------------------------------------------*/
  35. /* USER CODE BEGIN PD */
  36. /* USER CODE END PD */
  37.  
  38. /* Private macro -------------------------------------------------------------*/
  39. /* USER CODE BEGIN PM */
  40.  
  41. /* USER CODE END PM */
  42.  
  43. /* Private variables ---------------------------------------------------------*/
  44. RTC_HandleTypeDef hrtc;
  45.  
  46. UART_HandleTypeDef huart2;
  47.  
  48. /* USER CODE BEGIN PV */
  49. char time[10];
  50. char date[10];
  51.  
  52. uint8_t alarm = 0;
  53.  
  54. char TxData[] = "Buttom is pressed!\r\n";  
  55. char TxData2[] = "Redy!\r\n";  
  56. char trans_str[64] = { 0, };  
  57.  
  58. RTC_TimeTypeDef sTime = { 0 };
  59. RTC_DateTypeDef DateToUpdate = { 0 };
  60. RTC_AlarmTypeDef sAlarm = { 0 };  
  61.  
  62. /* USER CODE END PV */
  63.  
  64. /* Private function prototypes -----------------------------------------------*/
  65. void SystemClock_Config(void);
  66. static void MX_GPIO_Init(void);
  67. static void MX_RTC_Init(void);
  68. static void MX_USART2_UART_Init(void);
  69. /* USER CODE BEGIN PFP */
  70.  
  71. /* USER CODE END PFP */
  72.  
  73. /* Private user code ---------------------------------------------------------*/
  74. /* USER CODE BEGIN 0 */
  75. void set_time(void) {
  76.     RTC_TimeTypeDef sTime = { 0 };
  77.     RTC_DateTypeDef sDate = { 0 };
  78.     /** Initialize RTC and set the Time and Date */
  79.     sTime.Hours = 0x12;    // 12h.
  80.     sTime.Minutes = 0x45;  // 45m.
  81.     sTime.Seconds = 0x50;  // 50c.
  82.     sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  83.     sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  84.     if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) {
  85.         Error_Handler();
  86.     }
  87.     sDate.WeekDay = RTC_WEEKDAY_TUESDAY;
  88.     sDate.Month = RTC_MONTH_OCTOBER;
  89.     sDate.Date = 0x19;
  90.     sDate.Year = 0x21;
  91.  
  92.     if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) {
  93.         Error_Handler();
  94.     }
  95.     /* Backup register to store TIME and DATE! */
  96.     //HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x32F2);  // backup register
  97. }
  98.  
  99. void set_alarm(void) {
  100.     RTC_AlarmTypeDef sAlarm = { 0 };
  101.     /** Enable the Alarm A
  102.      */
  103.     sAlarm.AlarmTime.Hours = 0x12;    
  104.     sAlarm.AlarmTime.Minutes = 0x46;  
  105.     sAlarm.AlarmTime.Seconds = 0x0;  
  106.     sAlarm.AlarmTime.SubSeconds = 0x0;
  107.     sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  108.     sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
  109.     sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
  110.     sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
  111.     sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
  112.     sAlarm.AlarmDateWeekDay = 0x13;  
  113.     sAlarm.Alarm = RTC_ALARM_A;
  114.     if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK) {
  115.         Error_Handler();
  116.     }
  117.  
  118. }
  119.  
  120. void get_time(void) {
  121.  
  122.     RTC_TimeTypeDef sTime = { 0 };
  123.     RTC_DateTypeDef sDate = { 0 };
  124.  
  125.     /* Get the RTC current Time */
  126.     HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
  127.     /* Get the RTC current Date */
  128.     HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
  129.  
  130.     /* Display time Format: hh:mm:ss */
  131.     sprintf((char*) time, "%02d:%02d:%02d", sTime.Hours, sTime.Minutes,
  132.             sTime.Seconds);
  133.  
  134.     /* Display date Format: mm-dd-yy */
  135.     sprintf((char*) date, "%02d-%02d-%2d", sDate.Date, sDate.Month,
  136.             2000 + sDate.Year);  // I like the date first
  137.  
  138. }
  139.  
  140. void display_time(void) { //Let's display the time and date on lcd
  141.     //lcd_send_cmd (0x80);
  142.     //lcd_send_string (time);
  143.     //lcd_send_cmd (0xc0);
  144.     //lcd_send_string (date);
  145.  
  146.     HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); // RTC_FORMAT_BIN , RTC_FORMAT_BCD
  147.     //snprintf(trans_str, 63, "Time %d:%d:%d\n", sTime.Hours, sTime.Minutes, sTime.Seconds);
  148.     snprintf(trans_str, 63, "Time %d:%d:%d:%lu\n", sTime.Hours, sTime.Minutes,
  149.             sTime.Seconds, sTime.SubSeconds);
  150.     HAL_UART_Transmit(&huart2, (uint8_t*) trans_str, strlen(trans_str), 1000);
  151.  
  152.     HAL_RTC_GetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN);
  153.     snprintf(trans_str, 63, "Date %d-%d-20%d\n", DateToUpdate.Date,
  154.             DateToUpdate.Month, DateToUpdate.Year);
  155.     HAL_UART_Transmit(&huart2, (uint8_t*) trans_str, strlen(trans_str), 1000);
  156.  
  157.     HAL_RTC_GetAlarm(&hrtc, &sAlarm, RTC_ALARM_A, RTC_FORMAT_BIN);
  158.     snprintf(trans_str, 63, "Alarm %d:%d:%d\n", sAlarm.AlarmTime.Hours,
  159.             sAlarm.AlarmTime.Minutes, sAlarm.AlarmTime.Seconds);
  160.     HAL_UART_Transmit(&huart2, (uint8_t*) trans_str, strlen(trans_str), 1000);
  161.  
  162.     HAL_UART_Abort(&huart2); // Обрываем связь UART
  163. }
  164.  
  165. void to_do_on_alarm(void)  
  166. {
  167.     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, 0);  // set led ON
  168. }
  169. }
  170. /* USER CODE END 0 */
  171.  
  172. /**
  173.  * @brief  The application entry point.
  174.  * @retval int
  175.  */
  176. int main(void) {
  177.     /* USER CODE BEGIN 1 */
  178.  
  179.     /* USER CODE END 1 */
  180.  
  181.     /* MCU Configuration--------------------------------------------------------*/
  182.  
  183.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  184.     HAL_Init();
  185.  
  186.     /* USER CODE BEGIN Init */
  187.  
  188.     /* USER CODE END Init */
  189.  
  190.     /* Configure the system clock */
  191.     SystemClock_Config();
  192.  
  193.     /* USER CODE BEGIN SysInit */
  194.  
  195.     /* USER CODE END SysInit */
  196.  
  197.     /* Initialize all configured peripherals */
  198.     MX_GPIO_Init();
  199.     MX_RTC_Init();
  200.     MX_USART2_UART_Init();
  201.     /* USER CODE BEGIN 2 */
  202.     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, 1);  
  203.  
  204.     /* Backup register to store TIME and DATE! */
  205.     if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x32F2) // Time is not restting now!
  206.             {
  207.         set_time(); // Set the time
  208.     }
  209.  
  210.     set_alarm();
  211.  
  212.     HAL_UART_Transmit(&huart2, (uint8_t*) TxData2, sizeof(TxData2), 500);
  213.     /* USER CODE END 2 */
  214.  
  215.     /* Infinite loop */
  216.     /* USER CODE BEGIN WHILE */
  217.     while (1) {
  218.         /* USER CODE END WHILE */
  219.  
  220.         /* USER CODE BEGIN 3 */
  221.         if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {
  222.             display_time();
  223.             HAL_Delay(1000);
  224.         }
  225.  
  226.         //display_time();
  227.         get_time();
  228.         HAL_Delay(500);
  229.  
  230.         if (alarm) {
  231.             to_do_on_alarm();
  232.             alarm = 0;
  233.         }
  234.     }
  235.     /* USER CODE END 3 */
  236. }
  237.  
  238. /**
  239.  * @brief System Clock Configuration
  240.  * @retval None
  241.  */
  242. void SystemClock_Config(void) {
  243.     RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };
  244.     RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };
  245.  
  246.     /** Configure the main internal regulator output voltage
  247.      */
  248.     __HAL_RCC_PWR_CLK_ENABLE();
  249.     __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  250.     /** Initializes the RCC Oscillators according to the specified parameters
  251.      * in the RCC_OscInitTypeDef structure.
  252.      */
  253.     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI
  254.             | RCC_OSCILLATORTYPE_HSE;
  255.     RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  256.     RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  257.     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  258.     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  259.     RCC_OscInitStruct.PLL.PLLM = 4;
  260.     RCC_OscInitStruct.PLL.PLLN = 168;
  261.     RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  262.     RCC_OscInitStruct.PLL.PLLQ = 4;
  263.     if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
  264.         Error_Handler();
  265.     }
  266.     /** Initializes the CPU, AHB and APB buses clocks
  267.      */
  268.     RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
  269.             | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  270.     RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  271.     RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  272.     RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  273.     RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  274.  
  275.     if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
  276.         Error_Handler();
  277.     }
  278. }
  279.  
  280. /**
  281.  * @brief RTC Initialization Function
  282.  * @param None
  283.  * @retval None
  284.  */
  285. static void MX_RTC_Init(void) {
  286.  
  287.     /* USER CODE BEGIN RTC_Init 0 */
  288.  
  289.     /* USER CODE END RTC_Init 0 */
  290.  
  291. //  RTC_TimeTypeDef sTime = {0};
  292. //  RTC_DateTypeDef sDate = {0};
  293. //  RTC_AlarmTypeDef sAlarm = {0};
  294.     /* USER CODE BEGIN RTC_Init 1 */
  295.  
  296.     /* USER CODE END RTC_Init 1 */
  297.     /** Initialize RTC Only
  298.      */
  299.     hrtc.Instance = RTC;
  300.     hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  301.     hrtc.Init.AsynchPrediv = 127;
  302.     hrtc.Init.SynchPrediv = 255;
  303.     hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  304.     hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  305.     hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  306.     if (HAL_RTC_Init(&hrtc) != HAL_OK) {
  307.         Error_Handler();
  308.     }
  309.  
  310.     /* USER CODE BEGIN Check_RTC_BKUP */
  311.  
  312.     /* USER CODE END Check_RTC_BKUP */
  313.  
  314.     /** Initialize RTC and set the Time and Date
  315.      */
  316. //  sTime.Hours = 0x12;
  317. //  sTime.Minutes = 0x45;
  318. //  sTime.Seconds = 0x50;
  319. //  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  320. //  sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  321. //  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  322. //  {
  323. //    Error_Handler();
  324. //  }
  325. //  sDate.WeekDay = RTC_WEEKDAY_MONDAY;
  326. //  sDate.Month = RTC_MONTH_JANUARY;
  327. //  sDate.Date = 0x19;
  328. //  sDate.Year = 0x21;
  329. //
  330. //  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
  331. //  {
  332. //    Error_Handler();
  333. //  }
  334. //  /** Enable the Alarm A
  335. //  */
  336. //  sAlarm.AlarmTime.Hours = 0x12;
  337. //  sAlarm.AlarmTime.Minutes = 0x46;
  338. //  sAlarm.AlarmTime.Seconds = 0x0;
  339. //  sAlarm.AlarmTime.SubSeconds = 0x0;
  340. //  sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  341. //  sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
  342. //  sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
  343. //  sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
  344. //  sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
  345. //  sAlarm.AlarmDateWeekDay = 0x1;
  346. //  sAlarm.Alarm = RTC_ALARM_A;
  347. //  if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK)
  348. //  {
  349. //    Error_Handler();
  350. //  }
  351.     /* USER CODE BEGIN RTC_Init 2 */
  352.  
  353.     /* USER CODE END RTC_Init 2 */
  354.  
  355. }
  356.  
  357. /**
  358.  * @brief USART2 Initialization Function
  359.  * @param None
  360.  * @retval None
  361.  */
  362. static void MX_USART2_UART_Init(void) {
  363.  
  364.     /* USER CODE BEGIN USART2_Init 0 */
  365.  
  366.     /* USER CODE END USART2_Init 0 */
  367.  
  368.     /* USER CODE BEGIN USART2_Init 1 */
  369.  
  370.     /* USER CODE END USART2_Init 1 */
  371.     huart2.Instance = USART2;
  372.     huart2.Init.BaudRate = 115200;
  373.     huart2.Init.WordLength = UART_WORDLENGTH_8B;
  374.     huart2.Init.StopBits = UART_STOPBITS_1;
  375.     huart2.Init.Parity = UART_PARITY_NONE;
  376.     huart2.Init.Mode = UART_MODE_TX_RX;
  377.     huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  378.     huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  379.     if (HAL_UART_Init(&huart2) != HAL_OK) {
  380.         Error_Handler();
  381.     }
  382.     /* USER CODE BEGIN USART2_Init 2 */
  383.  
  384.     /* USER CODE END USART2_Init 2 */
  385.  
  386. }
  387.  
  388. /**
  389.  * @brief GPIO Initialization Function
  390.  * @param None
  391.  * @retval None
  392.  */
  393. static void MX_GPIO_Init(void) {
  394.     GPIO_InitTypeDef GPIO_InitStruct = { 0 };
  395.  
  396.     /* GPIO Ports Clock Enable */
  397.     __HAL_RCC_GPIOH_CLK_ENABLE();
  398.     __HAL_RCC_GPIOA_CLK_ENABLE();
  399.  
  400.     /*Configure GPIO pin Output Level */
  401.     HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
  402.  
  403.     /*Configure GPIO pin : BTN_Pin */
  404.     GPIO_InitStruct.Pin = BTN_Pin;
  405.     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  406.     GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  407.     HAL_GPIO_Init(BTN_GPIO_Port, &GPIO_InitStruct);
  408.  
  409.     /*Configure GPIO pin : LED_Pin */
  410.     GPIO_InitStruct.Pin = LED_Pin;
  411.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  412.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  413.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  414.     HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
  415.  
  416. }
  417.  
  418. /* USER CODE BEGIN 4 */
  419. /*** Callback будилькина ***/
  420. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) {
  421.     snprintf(trans_str, 63, "ALARM\n");
  422.     HAL_UART_Transmit(&huart2, (uint8_t*) trans_str, strlen(trans_str), 1000);
  423.  
  424.     alarm = 1;
  425. }
  426. /* USER CODE END 4 */
  427.  
  428. /**
  429.  * @brief  This function is executed in case of error occurrence.
  430.  * @retval None
  431.  */
  432. void Error_Handler(void) {
  433.     /* USER CODE BEGIN Error_Handler_Debug */
  434.     /* User can add his own implementation to report the HAL error return state */
  435.     __disable_irq();
  436.     while (1) {
  437.     }
  438.     /* USER CODE END Error_Handler_Debug */
  439. }
  440.  
  441. #ifdef  USE_FULL_ASSERT
  442. /**
  443.   * @brief  Reports the name of the source file and the source line number
  444.   *         where the assert_param error has occurred.
  445.   * @param  file: pointer to the source file name
  446.   * @param  line: assert_param error line source number
  447.   * @retval None
  448.   */
  449. void assert_failed(uint8_t *file, uint32_t line)
  450. {
  451.   /* USER CODE BEGIN 6 */
  452.   /* User can add his own implementation to report the file name and line number,
  453.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  454.   /* USER CODE END 6 */
  455. }
  456. #endif /* USE_FULL_ASSERT */
  457.  
  458. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  459.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement