打印
[STM32H7]

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

[复制链接]
1075|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
【STM32H7S78-DK测评】期待的串口打印来了

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

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




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

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

  /* USER CODE END UART4_MspInit 0 */

  /** Initializes the peripherals clock
  */
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART234578;
    PeriphClkInit.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    {
      Error_Handler();
    }

    /* Peripheral clock enable */
    __HAL_RCC_UART4_CLK_ENABLE();

    __HAL_RCC_GPIOD_CLK_ENABLE();
    /**UART4 GPIO Configuration
    PD1     ------> UART4_TX
    PD0     ------> UART4_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /* USER CODE BEGIN UART4_MspInit 1 */

  /* USER CODE END UART4_MspInit 1 */

  }

}

/**
* @brief UART MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param huart: UART handle pointer
* @retval None
*/
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{
  if(huart->Instance==UART4)
  {
  /* USER CODE BEGIN UART4_MspDeInit 0 */

  /* USER CODE END UART4_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_UART4_CLK_DISABLE();

    /**UART4 GPIO Configuration
    PD1     ------> UART4_TX
    PD0     ------> UART4_RX
    */
    HAL_GPIO_DeInit(GPIOD, GPIO_PIN_1|GPIO_PIN_0);

  /* USER CODE BEGIN UART4_MspDeInit 1 */

  /* USER CODE END UART4_MspDeInit 1 */
  }
}

int main(void)
{

  /* USER CODE BEGIN 1 */
    static uint8_t led_state = 0;
    MPU_Config();
  /* USER CODE END 1 */

  /* Enable the CPU Cache */

  /* Enable I-Cache---------------------------------------------------------*/
  SCB_EnableICache();

  /* Enable D-Cache---------------------------------------------------------*/
  SCB_EnableDCache();

  /* MCU Configuration--------------------------------------------------------*/

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

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

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_UART4_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
    while (1) {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

        switch (led_state) {
        case 0: {
            HAL_GPIO_WritePin(GPIOO, GPIO_PIN_1, GPIO_PIN_RESET);
            HAL_GPIO_WritePin(GPIOO, GPIO_PIN_5, GPIO_PIN_RESET);
            HAL_GPIO_WritePin(GPIOM, GPIO_PIN_2, GPIO_PIN_SET);
            HAL_GPIO_WritePin(GPIOM, GPIO_PIN_3, GPIO_PIN_SET);
            led_state = 1;
            HAL_UART_Transmit(&huart4, hello_str, sizeof(hello_str) - 1, 1000);
            break;
        }
        case 1: {
            HAL_GPIO_WritePin(GPIOO, GPIO_PIN_1, GPIO_PIN_SET);
            led_state = 2;
            break;
        }
        case 2: {
            HAL_GPIO_WritePin(GPIOO, GPIO_PIN_5, GPIO_PIN_SET);
            led_state = 3;
            break;
        }
        case 3: {
            HAL_GPIO_WritePin(GPIOM, GPIO_PIN_2, GPIO_PIN_RESET);
            led_state = 4;
            break;
        }
        case 4: {
            HAL_GPIO_WritePin(GPIOM, GPIO_PIN_3, GPIO_PIN_RESET);
            led_state = 0;
            break;
        }
        }
        HAL_Delay(200);


    }
  /* USER CODE END 3 */
}

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



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






使用特权

评论回复
沙发
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 | 只看该作者
程序用操作系统了没?是不是跑裸机

使用特权

评论回复
5
jobszheng|  楼主 | 2024-11-1 16:47 | 只看该作者
地瓜patch 发表于 2024-10-31 18:52
程序用操作系统了没?是不是跑裸机

惭愧呀!
现在是前后机跑的。这个月底会实现FreeRTOS的实现方案

使用特权

评论回复
6
10299823| | 2024-11-12 10:01 | 只看该作者
通过HAL库的HAL_UART_Transmit函数发送字符串。

使用特权

评论回复
7
cemaj| | 2024-11-13 10:49 | 只看该作者
对于STM32H7S78这样的开发板,利用板载的ST-Link v3的虚拟串口功能来实现串口打印是一个非常便捷和高效的方法。

使用特权

评论回复
8
jkl21| | 2024-11-13 22:32 | 只看该作者
可以直接通过USB接口与开发板进行串口通信,而无需额外的串口硬件。

使用特权

评论回复
9
mollylawrence| | 2024-11-14 16:01 | 只看该作者
串口打印提供了一种简单而有效的方式来查看程序的运行状态、变量的值和错误信息等,这对于快速定位和解决问题至关重要。

使用特权

评论回复
10
hudi008| | 2024-11-14 20:03 | 只看该作者
实现一个串口打印函数,如USART_Print,该函数接受一个字符串作为参数,并通过USART发送出去。

使用特权

评论回复
11
mmbs| | 2024-11-17 15:59 | 只看该作者
嵌入式代码中,使用HAL库或LL库提供的UART函数来发送数据。

使用特权

评论回复
12
eefas| | 2024-11-17 17:46 | 只看该作者
在STM32H7S78的应用程序中编写代码,使用串口发送函数(如HAL_UART_Transmit)发送调试信息。

使用特权

评论回复
13
51xlf| | 2024-11-17 20:51 | 只看该作者
ST-Link v3的虚拟串口功能,可以非常方便地实现串口打印,这对于嵌入式开发的调试和监控至关重要。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

16

主题

373

帖子

2

粉丝