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

Nucleo-STM32H563 RTC SSR 寄存器值中途回跳

[复制链接]
提问时间:2024-3-1 11:08 / 未解决
我在使用 Nucleo-STM32H563ZI 开发板的时候发现,RTC 的 SSR(子秒)寄存器值的变化有时候会出现回跳的现象。如下例,值在从 29 变到 28 后,没有紧跟着变为 27,而是先回跳到 31 后,再跳到 27。
00030-->00029
00029-->00028
00028-->00031
00031-->00027
00027-->00026
00026-->00025
初步观察到这种现象出现的频率很高,一秒钟内有3、4次。每次回跳值都是3(如上例:31-28=3)。
请问下是我的配置或程序有问题吗?

NucleoH563RTCSSR_ioc.doc

下载

9.78 KB, 下载次数: 1, 下载积分: ST金币 -1

CubeMX ioc

main_c.doc

下载

12.78 KB, 下载次数: 1, 下载积分: ST金币 -1

main.c

串口数据记录.doc

下载

30.27 KB, 下载次数: 1, 下载积分: ST金币 -1

TXT 文档

NucleoH563RTCSSR.zip

下载

1.16 MB, 下载次数: 1, 下载积分: ST金币 -1

整个工程文件包

收藏 评论12 发布时间:2024-3-1 11:08

举报

12个回答
butterflyspring 回答时间:2024-3-1 14:32:56
从芯片原理上看,这个RTC配置好并启动,它是一直计数的,不太可能跟配置有关。

因为它的速度很快,所以如果调试窗口看会有一定不同步现象。

如果代码去读,注意读取是有一定方式的。并且串口输出的时间也要考虑进去。
回答时间:2024-3-1 15:11:14

butterflyspring 发表于 2024-3-1 14:32
从芯片原理上看,这个RTC配置好并启动,它是一直计数的,不太可能跟配置有关。</p>
<p>因为它的速度很快,所以如 ...

RTC的分频采用默认值,即 SSR 分频值是 255,即一秒钟会发生256次变化,一次变化大概3.9ms。

串口波特率是115200,按照程序中一次发送的内容有14个字节,发送所需时间大概1.2ms。

而程序只做了检查寄存器值一件事情,没有其他事情。这个过程中也只有 SysTick 产生的中断需要处理

MCU主频被设置成最高的250MHz。

可以确信,这个程序运行时不会漏掉任何一个变化。串口的输出内容也验证了这一点。

回答时间:2024-3-1 15:18:42

butterflyspring 发表于 2024-3-1 14:32
从芯片原理上看,这个RTC配置好并启动,它是一直计数的,不太可能跟配置有关。</p>
<p>因为它的速度很快,所以如 ...

RTC 的 SSR 分频配置使用的是默认值 255,即是说一秒钟会发生 256 次变化,相邻变化时间间隔大概 3.9ms。

而串口波特率设置是 115200,程序中一次发送内容是 14 字节,大概需要 1.2ms。

而整个程序只做检查 SSR 值这一件事情,没有其他线程。需要处理的中断也只有 SysTick。

可以确信,程序不会错过任何一次 SSR 值变化。而串口输出也验证了这一点。

至于您说的读取要有一定的方式,这也是我想问的:读取这个寄存器是否需要什么秘诀?

我的程序是参考了 HAL 库里的 HAL_RTC_GetTime 函数实现。但没发现里面有什么窍门……

回答时间:2024-3-1 18:14:32

butterflyspring 发表于 2024-3-1 14:32
从芯片原理上看,这个RTC配置好并启动,它是一直计数的,不太可能跟配置有关。</p>
<p>因为它的速度很快,所以如 ...

我是使用串口打印的方式查看,不是调试窗口。

SSR分频使用默认值255,即一秒钟有256次变化,相邻变化时间间隔约3.9ms

串口波特率115200,程序一次发送数据14字节,需要时间大约1.2ms

可以确信,程序不会错过任何一次正常的变化。串口输出也验证了这一点

回答时间:2024-3-1 18:16:10

butterflyspring 发表于 2024-3-1 14:32
从芯片原理上看,这个RTC配置好并启动,它是一直计数的,不太可能跟配置有关。</p>
<p>因为它的速度很快,所以如 ...

SSR 分频使用默认值 255,即一秒钟有256次变化,变化时间间隔约3.9ms

串口波特率115200,一次发送数据14字节,需时1.2ms

程序不会错过任何一次正常的变化。串口输出也验证了这一点

回答时间:2024-3-1 18:18:41

butterflyspring 发表于 2024-3-1 14:32
从芯片原理上看,这个RTC配置好并启动,它是一直计数的,不太可能跟配置有关。</p>
<p>因为它的速度很快,所以如 ...

SSR 分频为255,即每秒256次变化,变化间隔3.9ms。串口波特率115200,一次发送14B,需时1.2ms。程序不会错过任何一次正常的变化。串口输出验证了这一点

xmshao 回答时间:2024-3-2 14:55:07
我怀疑是种误会,数据本身可能根本没问题。


现在假设你面前有个滚动盘,可以依序匀速循环滚动显示0到59,


你可以按固定时间来读显示数据,也可以不定速来读,把每次读到的


数据依次写下来,只要它的转速和你读取它的速率不同步,最后记录下


来的数据一定存在无序情况。
回答时间:2024-3-3 09:23:57
butterflyspring 发表于 2024-3-1 14:32
从芯片原理上看,这个RTC配置好并启动,它是一直计数的,不太可能跟配置有关。

因为它的速度很快,所以如 ...

没有用调试窗口.看的是串口输出数据.
SSR 分频使用默认的255,正常情况大概3.9ms变化一次.
串口波特率115200,发送一次数据14个字节,用时大概1.2ms.
所以不存在不同步或漏读数据的问题

回答时间:2024-3-3 09:27:07
xmshao 发表于 2024-3-2 14:55
我怀疑是种误会,数据本身可能根本没问题。

你说的情况确实在现实中经常出现.但如我在另一个回复里说明的,我已经充分考虑到运行时间的因素.
程序观察数据肯定是足够快的,不存在不同步的问题

背影101 回答时间:2024-3-5 11:09:13
[md]
xmshao 回答时间:2024-3-5 11:15:07
你可以这样,弄个基于子秒级的alarm中断,比方就比较1位,


即每7.8ms产生一次中断. 基于中断来读取,看看数据还乱不乱。


并看看相邻两次读到的时间是否固定在7.8ms样子。


另外,读取时间时遵循先TIMER后Date的规矩。
回答时间:2024-3-5 14:23:53
xmshao 发表于 2024-3-5 11:15
你可以这样,弄个基于子秒级的alarm中断,比方就比较1位,

感谢你的关注!

使用中断方式试了一下,数据还是乱的。见下方实例数据,左侧是 SSR 值,右侧是 SysTick 计数。
00243:00000152
00241:00000159
00239:00000167
00237:00000175
00239:00000183
00233:00000191

00231:00000198
可以看出,正常情况下,大概7、8个SysTick(也就是7、8ms)变化一次。
本来应该紧跟在237后的235没有出现,而是回跳到了239,之后有恢复正常。
如果直接读取 SSR 值的话,数据应该是这样的:
00237:......
00236:......
00239:......
00235:......
00234:......

话说回来,就算使用中断方式数据会有序起来,也很难满足我的需要。
因为我需要更高精度的时钟,要把 SSR 的分频设为最大的32767,而不是默认的 255。
这样的话,使用中断方式会需要很大的中断开销:大概60微秒就要处理一次中断。这不是我所希望的。

下面是主程序代码:
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * @file           : main.c
  5.   * @brief          : Main program body
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * Copyright (c) 2024 STMicroelectronics.
  10.   * All rights reserved.
  11.   *
  12.   * This software is licensed under terms that can be found in the LICENSE file
  13.   * in the root directory of this software component.
  14.   * If no LICENSE file comes with this software, it is provided AS-IS.
  15.   *
  16.   ******************************************************************************
  17.   */
  18. /* USER CODE END Header */
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "main.h"

  21. /* Private includes ----------------------------------------------------------*/
  22. /* USER CODE BEGIN Includes */
  23. #include <stdio.h>
  24. /* USER CODE END Includes */

  25. /* Private typedef -----------------------------------------------------------*/
  26. /* USER CODE BEGIN PTD */

  27. /* USER CODE END PTD */

  28. /* Private define ------------------------------------------------------------*/
  29. /* USER CODE BEGIN PD */

  30. /* USER CODE END PD */

  31. /* Private macro -------------------------------------------------------------*/
  32. /* USER CODE BEGIN PM */

  33. /* USER CODE END PM */

  34. /* Private variables ---------------------------------------------------------*/

  35. DCACHE_HandleTypeDef hdcache1;

  36. RTC_HandleTypeDef hrtc;

  37. UART_HandleTypeDef huart3;

  38. /* USER CODE BEGIN PV */
  39. volatile uint32_t ssr = 0;
  40. volatile uint32_t tr = 0;
  41. volatile uint32_t dr = 0;
  42. /* USER CODE END PV */

  43. /* Private function prototypes -----------------------------------------------*/
  44. void SystemClock_Config(void);
  45. static void MX_GPIO_Init(void);
  46. static void MX_ICACHE_Init(void);
  47. static void MX_RTC_Init(void);
  48. static void MX_USART3_UART_Init(void);
  49. static void MX_DCACHE1_Init(void);
  50. /* USER CODE BEGIN PFP */

  51. /* USER CODE END PFP */

  52. /* Private user code ---------------------------------------------------------*/
  53. /* USER CODE BEGIN 0 */

  54. /* USER CODE END 0 */

  55. /**
  56.   * @brief  The application entry point.
  57.   * @retval int
  58.   */
  59. int main(void)
  60. {
  61.   /* USER CODE BEGIN 1 */

  62.   /* USER CODE END 1 */

  63.   /* MCU Configuration--------------------------------------------------------*/

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

  66.   /* USER CODE BEGIN Init */

  67.   /* USER CODE END Init */

  68.   /* Configure the system clock */
  69.   SystemClock_Config();

  70.   /* USER CODE BEGIN SysInit */

  71.   /* USER CODE END SysInit */

  72.   /* Initialize all configured peripherals */
  73.   MX_GPIO_Init();
  74.   MX_ICACHE_Init();
  75.   MX_RTC_Init();
  76.   MX_USART3_UART_Init();
  77.   MX_DCACHE1_Init();
  78.   /* USER CODE BEGIN 2 */

  79.   /* USER CODE END 2 */

  80.   /* Infinite loop */
  81.   /* USER CODE BEGIN WHILE */
  82.         unsigned prev_ssr = 0;
  83.         unsigned this_ssr, tick;
  84.         int count;
  85.         char print_buf[32] = { 0 };
  86.         while (1) {
  87.                 this_ssr = ssr;
  88.                 tr = tr;
  89.                 dr = dr;

  90.                 tick = HAL_GetTick();
  91.                 if (this_ssr != prev_ssr) {
  92.                         count = sprintf(print_buf, "%05u:%08u\n", this_ssr, tick);
  93.                         HAL_UART_Transmit(&huart3, (uint8_t const*) print_buf, count, 10);
  94.                         prev_ssr = this_ssr;
  95.                 }
  96.     /* USER CODE END WHILE */

  97.     /* USER CODE BEGIN 3 */
  98.         }
  99.   /* USER CODE END 3 */
  100. }

  101. /**
  102.   * @brief System Clock Configuration
  103.   * @retval None
  104.   */
  105. void SystemClock_Config(void)
  106. {
  107.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  108.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  109.   /** Configure the main internal regulator output voltage
  110.   */
  111.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);

  112.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  113.   /** Configure LSE Drive Capability
  114.   */
  115.   HAL_PWR_EnableBkUpAccess();
  116.   __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);

  117.   /** Initializes the RCC Oscillators according to the specified parameters
  118.   * in the RCC_OscInitTypeDef structure.
  119.   */
  120.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_CSI;
  121.   RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  122.   RCC_OscInitStruct.CSIState = RCC_CSI_ON;
  123.   RCC_OscInitStruct.CSICalibrationValue = RCC_CSICALIBRATION_DEFAULT;
  124.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  125.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLL1_SOURCE_CSI;
  126.   RCC_OscInitStruct.PLL.PLLM = 1;
  127.   RCC_OscInitStruct.PLL.PLLN = 125;
  128.   RCC_OscInitStruct.PLL.PLLP = 2;
  129.   RCC_OscInitStruct.PLL.PLLQ = 2;
  130.   RCC_OscInitStruct.PLL.PLLR = 2;
  131.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1_VCIRANGE_2;
  132.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1_VCORANGE_WIDE;
  133.   RCC_OscInitStruct.PLL.PLLFRACN = 0;
  134.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  135.   {
  136.     Error_Handler();
  137.   }

  138.   /** Initializes the CPU, AHB and APB buses clocks
  139.   */
  140.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  141.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
  142.                               |RCC_CLOCKTYPE_PCLK3;
  143.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  144.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  145.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  146.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  147.   RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;

  148.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  149.   {
  150.     Error_Handler();
  151.   }
  152. }

  153. /**
  154.   * @brief DCACHE1 Initialization Function
  155.   * @param None
  156.   * @retval None
  157.   */
  158. static void MX_DCACHE1_Init(void)
  159. {

  160.   /* USER CODE BEGIN DCACHE1_Init 0 */

  161.   /* USER CODE END DCACHE1_Init 0 */

  162.   /* USER CODE BEGIN DCACHE1_Init 1 */

  163.   /* USER CODE END DCACHE1_Init 1 */
  164.   hdcache1.Instance = DCACHE1;
  165.   hdcache1.Init.ReadBurstType = DCACHE_READ_BURST_WRAP;
  166.   if (HAL_DCACHE_Init(&hdcache1) != HAL_OK)
  167.   {
  168.     Error_Handler();
  169.   }
  170.   /* USER CODE BEGIN DCACHE1_Init 2 */

  171.   /* USER CODE END DCACHE1_Init 2 */

  172. }

  173. /**
  174.   * @brief ICACHE Initialization Function
  175.   * @param None
  176.   * @retval None
  177.   */
  178. static void MX_ICACHE_Init(void)
  179. {

  180.   /* USER CODE BEGIN ICACHE_Init 0 */

  181.   /* USER CODE END ICACHE_Init 0 */

  182.   ICACHE_RegionConfigTypeDef pRegionConfig = {0};

  183.   /* USER CODE BEGIN ICACHE_Init 1 */

  184.   /* USER CODE END ICACHE_Init 1 */

  185.   /** Configure and enable region 0 for memory remapping
  186.   */
  187.   pRegionConfig.BaseAddress = 0x10000000;
  188.   pRegionConfig.RemapAddress = 0x60000000;
  189.   pRegionConfig.Size = ICACHE_REGIONSIZE_2MB;
  190.   pRegionConfig.TrafficRoute = ICACHE_MASTER1_PORT;
  191.   pRegionConfig.OutputBurstType = ICACHE_OUTPUT_BURST_WRAP;
  192.   if (HAL_ICACHE_EnableRemapRegion(_NULL, &pRegionConfig) != HAL_OK)
  193.   {
  194.     Error_Handler();
  195.   }

  196.   /** Enable instruction cache in 1-way (direct mapped cache)
  197.   */
  198.   if (HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY) != HAL_OK)
  199.   {
  200.     Error_Handler();
  201.   }
  202.   if (HAL_ICACHE_Enable() != HAL_OK)
  203.   {
  204.     Error_Handler();
  205.   }
  206.   /* USER CODE BEGIN ICACHE_Init 2 */

  207.   /* USER CODE END ICACHE_Init 2 */

  208. }

  209. /**
  210.   * @brief RTC Initialization Function
  211.   * @param None
  212.   * @retval None
  213.   */
  214. static void MX_RTC_Init(void)
  215. {

  216.   /* USER CODE BEGIN RTC_Init 0 */

  217.   /* USER CODE END RTC_Init 0 */

  218.   RTC_PrivilegeStateTypeDef privilegeState = {0};
  219.   RTC_TimeTypeDef sTime = {0};
  220.   RTC_DateTypeDef sDate = {0};
  221.   RTC_AlarmTypeDef sAlarm = {0};

  222.   /* USER CODE BEGIN RTC_Init 1 */

  223.   /* USER CODE END RTC_Init 1 */

  224.   /** Initialize RTC Only
  225.   */
  226.   hrtc.Instance = RTC;
  227.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  228.   hrtc.Init.AsynchPrediv = 127;
  229.   hrtc.Init.SynchPrediv = 255;
  230.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  231.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  232.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  233.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  234.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
  235.   hrtc.Init.BinMode = RTC_BINARY_NONE;
  236.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
  237.   {
  238.     Error_Handler();
  239.   }
  240.   privilegeState.rtcPrivilegeFull = RTC_PRIVILEGE_FULL_NO;
  241.   privilegeState.backupRegisterPrivZone = RTC_PRIVILEGE_BKUP_ZONE_NONE;
  242.   privilegeState.backupRegisterStartZone2 = RTC_BKP_DR0;
  243.   privilegeState.backupRegisterStartZone3 = RTC_BKP_DR0;
  244.   if (HAL_RTCEx_PrivilegeModeSet(&hrtc, &privilegeState) != HAL_OK)
  245.   {
  246.     Error_Handler();
  247.   }

  248.   /* USER CODE BEGIN Check_RTC_BKUP */

  249.   /* USER CODE END Check_RTC_BKUP */

  250.   /** Initialize RTC and set the Time and Date
  251.   */
  252.   sTime.Hours = 12;
  253.   sTime.Minutes = 34;
  254.   sTime.Seconds = 56;
  255.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  256.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  257.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
  258.   {
  259.     Error_Handler();
  260.   }
  261.   sDate.WeekDay = RTC_WEEKDAY_SUNDAY;
  262.   sDate.Month = RTC_MONTH_FEBRUARY;
  263.   sDate.Date = 29;
  264.   sDate.Year = 24;

  265.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
  266.   {
  267.     Error_Handler();
  268.   }

  269.   /** Enable the Alarm A
  270.   */
  271.   sAlarm.AlarmTime.Hours = 0;
  272.   sAlarm.AlarmTime.Minutes = 0;
  273.   sAlarm.AlarmTime.Seconds = 0;
  274.   sAlarm.AlarmTime.SubSeconds = 1;
  275.   sAlarm.AlarmMask = RTC_ALARMMASK_ALL;
  276.   sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_SS14_1;
  277.   sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
  278.   sAlarm.AlarmDateWeekDay = 5;
  279.   sAlarm.Alarm = RTC_ALARM_A;
  280.   sAlarm.FlagAutoClr = ALARM_FLAG_AUTOCLR_ENABLE;
  281.   if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
  282.   {
  283.     Error_Handler();
  284.   }
  285.   /* USER CODE BEGIN RTC_Init 2 */

  286.   /* USER CODE END RTC_Init 2 */

  287. }

  288. /**
  289.   * @brief USART3 Initialization Function
  290.   * @param None
  291.   * @retval None
  292.   */
  293. static void MX_USART3_UART_Init(void)
  294. {

  295.   /* USER CODE BEGIN USART3_Init 0 */

  296.   /* USER CODE END USART3_Init 0 */

  297.   /* USER CODE BEGIN USART3_Init 1 */

  298.   /* USER CODE END USART3_Init 1 */
  299.   huart3.Instance = USART3;
  300.   huart3.Init.BaudRate = 115200;
  301.   huart3.Init.WordLength = UART_WORDLENGTH_8B;
  302.   huart3.Init.StopBits = UART_STOPBITS_1;
  303.   huart3.Init.Parity = UART_PARITY_NONE;
  304.   huart3.Init.Mode = UART_MODE_TX_RX;
  305.   huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  306.   huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  307.   huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  308.   huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  309.   huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  310.   if (HAL_UART_Init(&huart3) != HAL_OK)
  311.   {
  312.     Error_Handler();
  313.   }
  314.   if (HAL_UARTEx_SetTxFifoThreshold(&huart3, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  315.   {
  316.     Error_Handler();
  317.   }
  318.   if (HAL_UARTEx_SetRxFifoThreshold(&huart3, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  319.   {
  320.     Error_Handler();
  321.   }
  322.   if (HAL_UARTEx_DisableFifoMode(&huart3) != HAL_OK)
  323.   {
  324.     Error_Handler();
  325.   }
  326.   /* USER CODE BEGIN USART3_Init 2 */

  327.   /* USER CODE END USART3_Init 2 */

  328. }

  329. /**
  330.   * @brief GPIO Initialization Function
  331.   * @param None
  332.   * @retval None
  333.   */
  334. static void MX_GPIO_Init(void)
  335. {
  336.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  337. /* USER CODE BEGIN MX_GPIO_Init_1 */
  338. /* USER CODE END MX_GPIO_Init_1 */

  339.   /* GPIO Ports Clock Enable */
  340.   __HAL_RCC_GPIOC_CLK_ENABLE();
  341.   __HAL_RCC_GPIOF_CLK_ENABLE();
  342.   __HAL_RCC_GPIOB_CLK_ENABLE();
  343.   __HAL_RCC_GPIOD_CLK_ENABLE();
  344.   __HAL_RCC_GPIOG_CLK_ENABLE();
  345.   __HAL_RCC_GPIOA_CLK_ENABLE();

  346.   /*Configure GPIO pin Output Level */
  347.   HAL_GPIO_WritePin(YELLOW_GPIO_Port, YELLOW_Pin, GPIO_PIN_RESET);

  348.   /*Configure GPIO pin Output Level */
  349.   HAL_GPIO_WritePin(GREEN_GPIO_Port, GREEN_Pin, GPIO_PIN_RESET);

  350.   /*Configure GPIO pin Output Level */
  351.   HAL_GPIO_WritePin(RED_GPIO_Port, RED_Pin, GPIO_PIN_RESET);

  352.   /*Configure GPIO pin : Button_Pin */
  353.   GPIO_InitStruct.Pin = Button_Pin;
  354.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  355.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  356.   HAL_GPIO_Init(Button_GPIO_Port, &GPIO_InitStruct);

  357.   /*Configure GPIO pin : YELLOW_Pin */
  358.   GPIO_InitStruct.Pin = YELLOW_Pin;
  359.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  360.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  361.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  362.   HAL_GPIO_Init(YELLOW_GPIO_Port, &GPIO_InitStruct);

  363.   /*Configure GPIO pin : GREEN_Pin */
  364.   GPIO_InitStruct.Pin = GREEN_Pin;
  365.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  366.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  367.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  368.   HAL_GPIO_Init(GREEN_GPIO_Port, &GPIO_InitStruct);

  369.   /*Configure GPIO pin : RED_Pin */
  370.   GPIO_InitStruct.Pin = RED_Pin;
  371.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  372.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  373.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  374.   HAL_GPIO_Init(RED_GPIO_Port, &GPIO_InitStruct);

  375. /* USER CODE BEGIN MX_GPIO_Init_2 */
  376. /* USER CODE END MX_GPIO_Init_2 */
  377. }

  378. /* USER CODE BEGIN 4 */
  379. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
  380. {
  381.         ssr = READ_REG(RTC->SSR);
  382.         tr = READ_REG(RTC->TR);
  383.         dr = READ_REG(RTC->DR);
  384. }
  385. /* USER CODE END 4 */

  386. /**
  387.   * @brief  This function is executed in case of error occurrence.
  388.   * @retval None
  389.   */
  390. void Error_Handler(void)
  391. {
  392.   /* USER CODE BEGIN Error_Handler_Debug */
  393.   /* User can add his own implementation to report the HAL error return state */
  394.   __disable_irq();
  395.   while (1)
  396.   {
  397.   }
  398.   /* USER CODE END Error_Handler_Debug */
  399. }

  400. #ifdef  USE_FULL_ASSERT
  401. /**
  402.   * @brief  Reports the name of the source file and the source line number
  403.   *         where the assert_param error has occurred.
  404.   * @param  file: pointer to the source file name
  405.   * @param  line: assert_param error line source number
  406.   * @retval None
  407.   */
  408. void assert_failed(uint8_t *file, uint32_t line)
  409. {
  410.   /* USER CODE BEGIN 6 */
  411.   /* User can add his own implementation to report the file name and line number,
  412.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  413.   /* USER CODE END 6 */
  414. }
  415. #endif /* USE_FULL_ASSERT */
复制代码




关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版