[STM32H7] 【STM32H7S78-DK测评】期待的串口打印来了

[复制链接]
2717|28
 楼主| jobszheng 发表于 2024-10-13 23:40 | 显示全部楼层 |阅读模式
【STM32H7S78-DK测评】期待的串口打印来了

串口在嵌入式工程师眼中的地位非常高,高到拿到开发板后搭建好开发环境后必先要实现之。作为一名嵌入式工程师的我,我也要在第一时间实现串口打印用来调试程序。

在之前的开发板上,调试器只负责调试而无串口,而现在的STM32H7S78上板载的ST-Link v3自带有虚拟串口功能,我们本次也是使用这个虚拟串口来实现调试信息的输出打印。

串口01.png


串口03.png

可以看到连接到了PD0引脚和PD1引脚。阅读datasheet后,可以看到ST-Link的VCP连接到了STM32H7RS的uart4外设上。于是,我们通过STM32CubeMX来配置并生成外设驱动代码。

  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] UART MSP Initialization
  3. * This function configures the hardware resources used in this example
  4. * @param huart: UART handle pointer
  5. * @retval None
  6. */
  7. void HAL_UART_MspInit(UART_HandleTypeDef* huart)
  8. {
  9.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  10.   RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  11.   if(huart->Instance==UART4)
  12.   {
  13.   /* USER CODE BEGIN UART4_MspInit 0 */

  14.   /* USER CODE END UART4_MspInit 0 */

  15.   /** Initializes the peripherals clock
  16.   */
  17.     PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART234578;
  18.     PeriphClkInit.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_PCLK1;
  19.     if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  20.     {
  21.       Error_Handler();
  22.     }

  23.     /* Peripheral clock enable */
  24.     __HAL_RCC_UART4_CLK_ENABLE();

  25.     __HAL_RCC_GPIOD_CLK_ENABLE();
  26.     /**UART4 GPIO Configuration
  27.     PD1     ------> UART4_TX
  28.     PD0     ------> UART4_RX
  29.     */
  30.     GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_0;
  31.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  32.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  33.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  34.     GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
  35.     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  36.   /* USER CODE BEGIN UART4_MspInit 1 */

  37.   /* USER CODE END UART4_MspInit 1 */

  38.   }

  39. }

  40. /**
  41. * @brief UART MSP De-Initialization
  42. * This function freeze the hardware resources used in this example
  43. * @param huart: UART handle pointer
  44. * @retval None
  45. */
  46. void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
  47. {
  48.   if(huart->Instance==UART4)
  49.   {
  50.   /* USER CODE BEGIN UART4_MspDeInit 0 */

  51.   /* USER CODE END UART4_MspDeInit 0 */
  52.     /* Peripheral clock disable */
  53.     __HAL_RCC_UART4_CLK_DISABLE();

  54.     /**UART4 GPIO Configuration
  55.     PD1     ------> UART4_TX
  56.     PD0     ------> UART4_RX
  57.     */
  58.     HAL_GPIO_DeInit(GPIOD, GPIO_PIN_1|GPIO_PIN_0);

  59.   /* USER CODE BEGIN UART4_MspDeInit 1 */

  60.   /* USER CODE END UART4_MspDeInit 1 */
  61.   }
  62. }

  63. int main(void)
  64. {

  65.   /* USER CODE BEGIN 1 */
  66.     static uint8_t led_state = 0;
  67.     MPU_Config();
  68.   /* USER CODE END 1 */

  69.   /* Enable the CPU Cache */

  70.   /* Enable I-Cache---------------------------------------------------------*/
  71.   SCB_EnableICache();

  72.   /* Enable D-Cache---------------------------------------------------------*/
  73.   SCB_EnableDCache();

  74.   /* MCU Configuration--------------------------------------------------------*/

  75.   /* Update SystemCoreClock variable according to RCC registers values. */
  76.   SystemCoreClockUpdate();

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

  79.   /* USER CODE BEGIN Init */

  80.   /* USER CODE END Init */

  81.   /* USER CODE BEGIN SysInit */

  82.   /* USER CODE END SysInit */

  83.   /* Initialize all configured peripherals */
  84.   MX_GPIO_Init();
  85.   MX_UART4_Init();
  86.   /* USER CODE BEGIN 2 */

  87.   /* USER CODE END 2 */

  88.   /* Infinite loop */
  89.   /* USER CODE BEGIN WHILE */
  90.     while (1) {
  91.     /* USER CODE END WHILE */

  92.     /* USER CODE BEGIN 3 */

  93.         switch (led_state) {
  94.         case 0: {
  95.             HAL_GPIO_WritePin(GPIOO, GPIO_PIN_1, GPIO_PIN_RESET);
  96.             HAL_GPIO_WritePin(GPIOO, GPIO_PIN_5, GPIO_PIN_RESET);
  97.             HAL_GPIO_WritePin(GPIOM, GPIO_PIN_2, GPIO_PIN_SET);
  98.             HAL_GPIO_WritePin(GPIOM, GPIO_PIN_3, GPIO_PIN_SET);
  99.             led_state = 1;
  100.             HAL_UART_Transmit(&huart4, hello_str, sizeof(hello_str) - 1, 1000);
  101.             break;
  102.         }
  103.         case 1: {
  104.             HAL_GPIO_WritePin(GPIOO, GPIO_PIN_1, GPIO_PIN_SET);
  105.             led_state = 2;
  106.             break;
  107.         }
  108.         case 2: {
  109.             HAL_GPIO_WritePin(GPIOO, GPIO_PIN_5, GPIO_PIN_SET);
  110.             led_state = 3;
  111.             break;
  112.         }
  113.         case 3: {
  114.             HAL_GPIO_WritePin(GPIOM, GPIO_PIN_2, GPIO_PIN_RESET);
  115.             led_state = 4;
  116.             break;
  117.         }
  118.         case 4: {
  119.             HAL_GPIO_WritePin(GPIOM, GPIO_PIN_3, GPIO_PIN_RESET);
  120.             led_state = 0;
  121.             break;
  122.         }
  123.         }
  124.         HAL_Delay(200);


  125.     }
  126.   /* USER CODE END 3 */
  127. }

之后,代码就没有什么难度了!调用一下HAL_Uart_Transmin()即可。效果如下所示:

串口02.png


至此,我们的基础环境实验环节就结束了。接下来,我们也就开始了更高阶的实验了。






Amazingxixixi 发表于 2024-10-31 16:20 | 显示全部楼层
有没有处理ORE错误?不然会有问题
 楼主| jobszheng 发表于 2024-10-31 16:41 | 显示全部楼层
Amazingxixixi 发表于 2024-10-31 16:20
有没有处理ORE错误?不然会有问题

您这不会是小号练级吧!
地瓜patch 发表于 2024-10-31 18:52 来自手机 | 显示全部楼层
程序用操作系统了没?是不是跑裸机
 楼主| jobszheng 发表于 2024-11-1 16:47 | 显示全部楼层
地瓜patch 发表于 2024-10-31 18:52
程序用操作系统了没?是不是跑裸机

惭愧呀!
现在是前后机跑的。这个月底会实现FreeRTOS的实现方案
10299823 发表于 2024-11-12 10:01 | 显示全部楼层
通过HAL库的HAL_UART_Transmit函数发送字符串。
cemaj 发表于 2024-11-13 10:49 | 显示全部楼层
对于STM32H7S78这样的开发板,利用板载的ST-Link v3的虚拟串口功能来实现串口打印是一个非常便捷和高效的方法。
jkl21 发表于 2024-11-13 22:32 | 显示全部楼层
可以直接通过USB接口与开发板进行串口通信,而无需额外的串口硬件。
mollylawrence 发表于 2024-11-14 16:01 | 显示全部楼层
串口打印提供了一种简单而有效的方式来查看程序的运行状态、变量的值和错误信息等,这对于快速定位和解决问题至关重要。
hudi008 发表于 2024-11-14 20:03 | 显示全部楼层
实现一个串口打印函数,如USART_Print,该函数接受一个字符串作为参数,并通过USART发送出去。
mmbs 发表于 2024-11-17 15:59 | 显示全部楼层
嵌入式代码中,使用HAL库或LL库提供的UART函数来发送数据。
eefas 发表于 2024-11-17 17:46 | 显示全部楼层
在STM32H7S78的应用程序中编写代码,使用串口发送函数(如HAL_UART_Transmit)发送调试信息。
51xlf 发表于 2024-11-17 20:51 | 显示全部楼层
ST-Link v3的虚拟串口功能,可以非常方便地实现串口打印,这对于嵌入式开发的调试和监控至关重要。
lzbf 发表于 2024-11-20 15:17 | 显示全部楼层
串口通信所需的硬件资源少,只需要几根线(TXD、RXD、GND)即可实现通信。
无需额外的专用芯片或复杂的电路设计。
pmp 发表于 2024-11-20 17:10 | 显示全部楼层
串口打印提供了一种简单而有效的方式来查看程序的运行状态、变量的值和错误信息等,这对于快速定位和解决问题至关重要。
earlmax 发表于 2024-11-20 18:16 | 显示全部楼层
串口打印在嵌入式开发中的确占据着举足轻重的地位。它是嵌入式系统中最基本的调试手段之一,允许开发者将系统状态、变量值、错误信息等输出到终端,以便于观察和调试程序。
kmzuaz 发表于 2024-11-20 21:52 | 显示全部楼层
大多数微控制器都内置了串口模块,配置和使用都非常方便。
kkzz 发表于 2024-11-21 19:05 | 显示全部楼层
使用STM32CubeMX或类似的工具来配置UART外设。您需要设置波特率、数据位、停止位和校验位等参数。
claretttt 发表于 2024-11-21 20:30 | 显示全部楼层
对于嵌入式工程师来说是一项非常有用的技能,能够极大地提高开发效率和问题解决速度。
louliana 发表于 2024-11-21 20:50 | 显示全部楼层
串口通信在嵌入式系统开发中确实占据着非常重要的地位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:热爱开源,乐于分享。在嵌入式技术领域里面,主攻通讯协议,Modbus,TCP/IP以及虚拟化和RTOS

31

主题

746

帖子

23

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