[STM32H7] 【STM32H745I-DISCO 试用】+RTC与电子时钟

[复制链接]
 楼主| jinglixixi 发表于 2025-3-25 22:27 | 显示全部楼层 |阅读模式
<
本帖最后由 jinglixixi 于 2025-3-26 00:02 编辑

在厂家提供的例程中,配有RTC的示例,但好像是要考验使用者的功力,却没有为其配置相应显示后输出功能。
为此,我们可以通过为它添加串口输出功能或是将RTC计时功能添加到类似Hellow World类的程序中以便观察和使用。
为方便实现,这里采用的是将串口输出功能添加到RTC例程中的方式,其测试效果如图1所示。
0aea8bd0875f7f6bc34fe92a0f45287f
图1 测试效果

其实现的主程序为:
  1. <font _mstmutation="1">int main(void)
  2. {
  3. int32_t timeout;
  4. MPU_Config();
  5. CPU_CACHE_Enable();
  6. timeout = 0xFFFF;
  7. while((__HAL_RCC_GET_FLAG(RCC_FLAG_D2CKRDY) != RESET) && (timeout-- > 0));
  8. if ( timeout < 0 )
  9. {
  10. Error_Handler();
  11. }
  12. HAL_Init();
  13. SystemClock_Config();
  14. BSP_LED_Init(LED2);
  15. UartHandle.Instance = USARTx;
  16. UartHandle.Init.BaudRate = 9600;
  17. UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
  18. UartHandle.Init.StopBits = UART_STOPBITS_1;
  19. UartHandle.Init.Parity = UART_PARITY_NONE;
  20. UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  21. UartHandle.Init.Mode = UART_MODE_TX_RX;
  22. UartHandle.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  23. UartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  24. UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
  25. if(HAL_UART_Init(&UartHandle) != HAL_OK)
  26. {
  27. Error_Handler();
  28. }
  29. HAL_UARTEx_SetRxFifoThreshold(&UartHandle, UART_RXFIFO_THRESHOLD_1_4);
  30. HAL_UARTEx_EnableFifoMode(&UartHandle);
  31. RtcHandle.Instance = RTC;
  32. RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24;
  33. RtcHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
  34. RtcHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;
  35. RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
  36. RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  37. RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  38. if (HAL_RTC_Init(&RtcHandle) != HAL_OK)
  39. {
  40. Error_Handler();
  41. }
  42. RTC_AlarmConfig();
  43. __HAL_RTC_ALARM_EXTID2_CLEAR_FLAG();
  44. HAL_EXTI_D2_EventInputConfig(EXTI_LINE17 , EXTI_MODE_IT, ENABLE);
  45. while (1)
  46. {
  47. RTC_TimeShow(aShowTime);</font>
  48. }
  49. }


经修改,实现电子时钟输出效果的RTC显示函数为:
  1. static void RTC_TimeShow(uint8_t* showtime)
  2. {
  3. RTC_DateTypeDef sdatestructureget;
  4. RTC_TimeTypeDef stimestructureget;
  5. HAL_RTC_GetTime(&RtcHandle, &stimestructureget, RTC_FORMAT_BIN);
  6. HAL_RTC_GetDate(&RtcHandle, &sdatestructureget, RTC_FORMAT_BIN);
  7. cmd4[0] =stimestructureget.Hours/10+'0';
  8. if(BY!=stimestructureget.Seconds)
  9. {
  10. cmd4[1] =stimestructureget.Hours%10+'0';
  11. cmd4[3] =stimestructureget.Minutes/10+'0';
  12. cmd4[4] =stimestructureget.Minutes%10+'0';
  13. cmd4[6] =stimestructureget.Seconds/10+'0';
  14. cmd4[7] =stimestructureget.Seconds%10+'0';
  15. HAL_UART_Transmit(&UartHandle, (uint8_t*)&cmd4, countof(cmd3), HAL_TIMEOUT_VALUE);
  16. BY=stimestructureget.Seconds;
  17. }
  18. }

除此之外,该需要main.h文件中添加如下内容:
  1. #define USARTx USART3
  2. #define USARTx_CLK_ENABLE() __HAL_RCC_USART3_CLK_ENABLE()
  3. #define USARTx_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
  4. #define USARTx_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
  5. #define RCC_PERIPHCLK_USARTx RCC_PERIPHCLK_USART3
  6. #define RCC_USARTxCLKSOURCE_HSI RCC_USART3CLKSOURCE_HSI
  7. #define USARTx_FORCE_RESET() __HAL_RCC_USART3_FORCE_RESET()
  8. #define USARTx_RELEASE_RESET() __HAL_RCC_USART3_RELEASE_RESET()
  9. #define USARTx_IRQn USART3_IRQn
  10. #define USARTx_IRQHandler USART3_IRQHandler
  11. #define USARTx_TX_PIN GPIO_PIN_10
  12. #define USARTx_TX_GPIO_PORT GPIOB
  13. #define USARTx_TX_AF GPIO_AF7_USART3
  14. #define USARTx_RX_PIN GPIO_PIN_11
  15. #define USARTx_RX_GPIO_PORT GPIOB
  16. #define USARTx_RX_AF GPIO_AF7_USART3

在stm32h7xx_hal_msp.c文件中添加如下内容:
  1. void HAL_UART_MspInit(UART_HandleTypeDef *huart)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStruct;
  4. RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
  5. USARTx_TX_GPIO_CLK_ENABLE();
  6. USARTx_RX_GPIO_CLK_ENABLE();
  7. RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USARTx;
  8. RCC_PeriphClkInit.Usart234578ClockSelection = RCC_USARTxCLKSOURCE_HSI;
  9. HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
  10. USARTx_CLK_ENABLE();
  11. GPIO_InitStruct.Pin = USARTx_TX_PIN;
  12. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  13. GPIO_InitStruct.Pull = GPIO_PULLUP;
  14. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  15. GPIO_InitStruct.Alternate = USARTx_TX_AF;
  16. HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);
  17. GPIO_InitStruct.Pin = USARTx_RX_PIN;
  18. GPIO_InitStruct.Alternate = USARTx_RX_AF;
  19. HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);
  20. HAL_NVIC_SetPriority(USARTx_IRQn, 0, 1);
  21. HAL_NVIC_EnableIRQ(USARTx_IRQn);
  22. }

  23. void HAL_UART_MspDeInit(UART_HandleTypeDef *huart)
  24. {
  25. USARTx_FORCE_RESET();
  26. USARTx_RELEASE_RESET();
  27. HAL_GPIO_DeInit(USARTx_TX_GPIO_PORT, USARTx_TX_PIN);
  28. HAL_GPIO_DeInit(USARTx_RX_GPIO_PORT, USARTx_RX_PIN);
  29. }

在stm32h7xx_it.c文件中添加如下内容:
extern UART_HandleTypeDef UartHandle;

这样,就可以实现基于RTC计时器的电子时钟输出显示功能。
此外,若将串口输出功能添加到A/D检测程序中,则可显示出检测值,见图2所示。
f1e850cd3cedd09affe3f8022f94966a
图2 检测结果

相应得程序内容为:
  1. int main(void)
  2. {
  3. int32_t timeout;
  4. MPU_Config();
  5. CPU_CACHE_Enable();
  6. timeout = 0xFFFF;
  7. while((__HAL_RCC_GET_FLAG(RCC_FLAG_D2CKRDY) != RESET) && (timeout-- > 0));
  8. if ( timeout < 0 )
  9. {
  10. Error_Handler();
  11. }
  12. HAL_Init();
  13. SystemClock_Config();
  14. BSP_LED_Init(LED2);
  15. BSP_LED_Init(LED1);
  16. UartHandle.Instance = USARTx;
  17. UartHandle.Init.BaudRate = 9600;
  18. UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
  19. UartHandle.Init.StopBits = UART_STOPBITS_1;
  20. UartHandle.Init.Parity = UART_PARITY_NONE;
  21. UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  22. UartHandle.Init.Mode = UART_MODE_TX_RX;
  23. UartHandle.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  24. UartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  25. UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
  26. if(HAL_UART_Init(&UartHandle) != HAL_OK)
  27. {
  28. Error_Handler();
  29. }
  30. HAL_UARTEx_SetRxFifoThreshold(&UartHandle, UART_RXFIFO_THRESHOLD_1_4);
  31. HAL_UARTEx_EnableFifoMode(&UartHandle);
  32. BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI);
  33. ADC_Config();
  34. if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED) != HAL_OK)
  35. {
  36. Error_Handler();
  37. }
  38. #if defined(ADC_TRIGGER_FROM_TIMER)
  39. TIM_Config();
  40. #endif /* ADC_TRIGGER_FROM_TIMER */
  41. #if defined(WAVEFORM_VOLTAGE_GENERATION_FOR_TEST)
  42. WaveformVoltageGenerationForTest_Config();
  43. #endif /* WAVEFORM_VOLTAGE_GENERATION_FOR_TEST */
  44. #if defined(ADC_TRIGGER_FROM_TIMER)
  45. if (HAL_TIM_Base_Start(&TimHandle) != HAL_OK)
  46. {
  47. Error_Handler();
  48. }
  49. #endif /* ADC_TRIGGER_FROM_TIMER */
  50. if (HAL_ADC_Start_DMA(&AdcHandle,
  51. (uint32_t *)aADCxConvertedValues,
  52. ADCCONVERTEDVALUES_BUFFER_SIZE
  53. ) != HAL_OK)
  54. {
  55. Error_Handler();
  56. }
  57. while (1)
  58. {
  59. while ((ubUserButtonClickEvent) == RESET)
  60. {
  61. }
  62. ubUserButtonClickEvent = RESET;
  63. if (HAL_ADCEx_InjectedStart_IT(&AdcHandle) != HAL_OK)
  64. {
  65. Error_Handler();
  66. }
  67. #if defined(WAVEFORM_VOLTAGE_GENERATION_FOR_TEST)
  68. WaveformVoltageGenerationForTest_Update();
  69. #endif /* WAVEFORM_VOLTAGE_GENERATION_FOR_TEST */
  70. HAL_Delay(31);
  71. cmd4[0]=uhADCxConvertedValue_Injected/10000+'0';
  72. cmd4[1]=uhADCxConvertedValue_Injected%10000/1000+'0';
  73. cmd4[2]=uhADCxConvertedValue_Injected%1000/100+'0';
  74. cmd4[3]=uhADCxConvertedValue_Injected%100/10+'0';
  75. cmd4[4]=uhADCxConvertedValue_Injected%10+'0';
  76. HAL_UART_Transmit(&UartHandle, (uint8_t*)&cmd4, countof(cmd4), HAL_TIMEOUT_VALUE);
  77. if (uhADCxConvertedValue_Injected < *puhADCxConvertedValue_Regular_Avg)
  78. {
  79. BSP_LED_Off(LED1);
  80. }
  81. else
  82. {
  83. BSP_LED_On(LED1);
  84. }
  85. }
  86. }



peterLaw 发表于 2025-3-26 17:25 | 显示全部楼层
RTC非常有必要的
 楼主| jinglixixi 发表于 2025-3-26 18:12 | 显示全部楼层

的确是这样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

517

主题

2932

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部