[STM32H7] 【STM32H745I-DISCO 试用】+串行通讯与唤醒测试

[复制链接]
1271|2
 楼主| jinglixixi 发表于 2025-3-22 15:27 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2025-3-22 21:17 编辑

在例程中配有一个通过串行通讯来进行唤醒处理的程序,它使用的引脚为:
Tx Pin: PB.10
Rx Pin: PB.11

通过查看原理图可知,它无需外部的串口模块连的接就可进行测试,即直接使用调试端口来测试。
263f099ea7014448339f1d46961f9126
04525c67567f8eb3c5653b52f52e6c82
653400a8cf8a2e7a8f043afd3c230b41
图1 测试串口

该测试程序的主程序为:
  1. <font _mstmutation="1" _msttexthash="171927635750" _msthash="844">int main(void)
  2. {
  3. MPU_Config();
  4. CPU_CACHE_Enable();
  5. HAL_Init();
  6. SystemClock_Config();
  7. BSP_LED_Init(LED1);
  8. BSP_LED_Init(LED2);
  9. BSP_LED_On(LED1);
  10. UartHandle.Instance = USARTx;
  11. UartHandle.Init.BaudRate = 9600;
  12. UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
  13. UartHandle.Init.StopBits = UART_STOPBITS_1;
  14. UartHandle.Init.Parity = UART_PARITY_ODD;
  15. UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  16. UartHandle.Init.Mode = UART_MODE_TX_RX;
  17. UartHandle.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  18. UartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  19. UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
  20. if(HAL_UART_Init(&UartHandle) != HAL_OK)
  21. {
  22. Error_Handler();
  23. HAL_UARTEx_SetRxFifoThreshold(&UartHandle, UART_RXFIFO_THRESHOLD_1_4);
  24. HAL_UARTEx_EnableFifoMode(&UartHandle);
  25. HAL_UART_Transmit(&UartHandle, (uint8_t*)&HeaderTxBuffer, countof(HeaderTxBuffer)-1, HAL_TIMEOUT_VALUE);
  26. HAL_UARTEx_EnableStopMode(&UartHandle);
  27. __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_RXFT);
  28. __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_WUF);
  29. HAL_UART_Transmit(&UartHandle, (uint8_t*)&Part1TxBuffer, countof(Part1TxBuffer)-1, HAL_TIMEOUT_VALUE);
  30. HAL_UART_Receive_IT(&UartHandle, (uint8_t*)&RxBuffer, 3);
  31. BSP_LED_Off(LED1);
  32. HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);
  33. while(HAL_UART_GetState(&UartHandle) != HAL_UART_STATE_READY)
  34. {
  35. }
  36. BSP_LED_On(LED1);
  37. __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_WUF);
  38. __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_RXFT);
  39. HAL_UARTEx_DisableStopMode(&UartHandle);
  40. HAL_UART_Transmit(&UartHandle, (uint8_t*)&WakeupRXFTBuffer, countof(WakeupRXFTBuffer)-1, HAL_TIMEOUT_VALUE);
  41. HAL_UARTEx_EnableStopMode(&UartHandle);
  42. __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_RXFF);
  43. __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_WUF);
  44. HAL_UART_Transmit(&UartHandle, (uint8_t*)&Part2TxBuffer, countof(Part2TxBuffer)-1, HAL_TIMEOUT_VALUE);
  45. HAL_UART_Receive_IT(&UartHandle, (uint8_t*)&RxBuffer, 15);
  46. BSP_LED_Off(LED1);
  47. HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);
  48. while(HAL_UART_GetState(&UartHandle) != HAL_UART_STATE_READY)
  49. {
  50. }
  51. BSP_LED_On(LED1);
  52. __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_WUF);
  53. __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_RXFF);
  54. HAL_UARTEx_DisableStopMode(&UartHandle);
  55. HAL_UART_Transmit(&UartHandle, (uint8_t*)&WakeupRXFFBuffer, countof(WakeupRXFFBuffer)-1, HAL_TIMEOUT_VALUE);
  56. HAL_UART_Transmit(&UartHandle, (uint8_t*)&FooterTxBuffer, countof(FooterTxBuffer)-1, HAL_TIMEOUT_VALUE);
  57. while(1) { ; }</font>
  58. }



通过对程序的分析可知,在测试时需将串口的波特率设置为9600bps,数据位数为7位,1个停止位,采用奇校验。
33f91c4fb29c83a20e580a7429be79f7
图2 串口设置

经程序的编译和下载,其测试过程如图3至图5所示。
1568482c181ec8ce557cbbee32b0f1f2
图3 上电复位后的提示信息

在按提示信息输入4个字节的数据后,其提示信息如图4所示,让再输入16个字节,不会是这样一直倍增下去吧?
84e241250ee1e761a33c0a483b6d06c0
图4 完成输入后的提示信息

还好,在输入完16字节数据后,测试终于结束了,其内容如图5所示。
89d24c946b91b0136600646b86965dd6
图5 完成测试

通过这次,我们可以掌握串口的收发及由静止模式唤醒的处理方法。

以此为基础,通过串口通讯还可实现语音模块的播放控制。
语音模块的引脚发布如图6所示,通常情况下将RX引脚与开发板的TXD引脚即可。
b142d0956c216e14f9ff25fb3d3e2807
图6 引脚排列

由于语音模块在工作时是采用9600bps的波特率,8位数据,1位停止位且无校验位,故在使用时需对串口的配置稍加修改。
修改后的主程序为:
  1. <font _mstmutation="1" _msttexthash="16541654701" _msthash="417">int main(void)
  2. {
  3. MPU_Config();
  4. CPU_CACHE_Enable();
  5. HAL_Init();
  6. SystemClock_Config();
  7. BSP_LED_Init(LED1);
  8. BSP_LED_Init(LED2);
  9. BSP_LED_On(LED1);
  10. UartHandle.Instance = USARTx;
  11. UartHandle.Init.BaudRate = 9600;
  12. UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
  13. UartHandle.Init.StopBits = UART_STOPBITS_1;
  14. UartHandle.Init.Parity = UART_PARITY_NONE;
  15. UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  16. UartHandle.Init.Mode = UART_MODE_TX_RX;
  17. UartHandle.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  18. UartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  19. UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
  20. } if(HAL_UART_Init(&UartHandle) != HAL_OK){

  21. Error_Handler();
  22. }
  23. HAL_UARTEx_SetRxFifoThreshold(&UartHandle, UART_RXFIFO_THRESHOLD_1_4);
  24. HAL_UARTEx_EnableFifoMode(&UartHandle);
  25. playn(3);
  26. HAL_UART_Transmit(&UartHandle, (uint8_t*)&cmd3, countof(cmd3), HAL_TIMEOUT_VALUE);
  27. while(1) { ; }</font>
  28. }

经程序的编译与下载,其测试结果如图7所示。
4de29e0224730a5cd8ff79b27c8b8d57
图7 测试结果

此时,还有一个问题要解决,那就是所用的串行通讯引脚从哪里获得,因为在测试时是通过调试口来进行,而控制语音模块是需要引脚来连接的。
通过搜寻,终于发现可从CN4的接口来获得,只是该引脚的间距很小,需要通过匹配的连接件来连接。
64343ea26d859f1a694c2f49addbaeb1
图8 引脚连接接口



yangjiaxu 发表于 2025-4-9 14:44 | 显示全部楼层
串口唤醒,话说H745这个芯片还有一个低功耗的串口是么
 楼主| jinglixixi 发表于 2025-4-9 19:08 | 显示全部楼层
主要是通过串口通讯可用进行工作模式间切换
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

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