[STM32C5] 【STM32C5 开发板评测】四、MDK5.40实现串口中断收发及printf()重定向

[复制链接]
12|0
地瓜patch 发表于 2026-9-3 20:21 | 显示全部楼层 |阅读模式

从STM32C5 开发板原理图中可以发现STM32C5将Uart2
446616a9962237fbb1.png
连接到STM32F723中
271636a996258e213b.png
首先在stm32cubeMX32中完成Uart2串口配置。
293226a996088d9f4a.png 642196a9962b78635e.png

生成MDK5.40的工程,并打开,其生成的main.c文件还是与之前生成工程一样。需要手动添加代码。
mx_usart2_uart_init()函数在mx_usart2.c中实现。实现了Uart2串口初始化和PA2和PA3--IO的初始化,并开中断。

hal_uart_handle_t *mx_usart2_uart_init(void)
{
  hal_uart_config_t uart_config;

  /* Basic configuration */
  if (HAL_UART_Init(&hUSART2, HAL_UART2) != HAL_OK)
  {
    return NULL;
  }

  HAL_RCC_USART2_EnableClock();

  if (HAL_RCC_USART2_SetKernelClkSource(HAL_RCC_USART2_CLK_SRC_PCLK1) != HAL_OK)
  {
    return NULL;
  }

  uart_config.baud_rate = 115200;
  uart_config.clock_prescaler = HAL_UART_PRESCALER_DIV1;
  uart_config.word_length = HAL_UART_WORD_LENGTH_8_BIT;
  uart_config.stop_bits = HAL_UART_STOP_BIT_1;
  uart_config.parity = HAL_UART_PARITY_NONE;
  uart_config.direction = HAL_UART_DIRECTION_TX_RX;
  uart_config.hw_flow_ctl = HAL_UART_HW_CONTROL_NONE;
  uart_config.oversampling = HAL_UART_OVERSAMPLING_16;
  uart_config.one_bit_sampling = HAL_UART_ONE_BIT_SAMPLE_DISABLE;

  if (HAL_UART_SetConfig(&hUSART2, &uart_config) != HAL_OK)
  {
    return NULL;
  }

  /* ### USART2 GPIO Configuration ########################### */
  /* GPIO Clocks activation */
  HAL_RCC_GPIOA_EnableClock();

  hal_gpio_config_t  gpio_config;

  /**
    [GPIO Pin] ------> [Signal Name] ------> [Labels]

       PA3     ------>   USART2_RX   ------>  PA3
       PA2     ------>   USART2_TX   ------>  PA2
    **/
  gpio_config.mode        = HAL_GPIO_MODE_ALTERNATE;
  gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
  gpio_config.pull        = HAL_GPIO_PULL_NO;
  gpio_config.speed       = HAL_GPIO_SPEED_FREQ_LOW;
  gpio_config.alternate   = HAL_GPIO_AF_7;
  HAL_GPIO_Init(HAL_GPIOA, PA3_PIN | PA2_PIN, &gpio_config);

  /* Enable interrupt */
  HAL_CORTEX_NVIC_SetPriority(USART2_IRQn, HAL_CORTEX_NVIC_PREEMP_PRIORITY_0, HAL_CORTEX_NVIC_SUB_PRIORITY_0);
  HAL_CORTEX_NVIC_EnableIRQ(USART2_IRQn);

  return &hUSART2;
}

在main()函数中,首先开启PA端口和Uart串口时钟

LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
    LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);
    huart2 = mx_usart2_uart_init();
    if (huart2 == NULL)
    {
      while (1);   // ?????,??
    }


其次,开启Uart中断接收
    HAL_UART_Receive_IT(huart2, &rx_byte, 1);
实现中断接收回调函数如下,接收的数据再通过串口回发。

void HAL_UART_RxCpltCallback(hal_uart_handle_t *huart, uint32_t size_byte, hal_uart_rx_event_types_t rx_event)
{

  if (huart->instance == USART2)
  {
    HAL_UART_Transmit(huart, &rx_byte, 1, 100);

    HAL_UART_Receive_IT(huart, &rx_byte, 1);
  }
}


还需要实现uart2重定义

int fputc(int ch, FILE *f)
{
    uint8_t c = (uint8_t)ch;

    if (huart2 != NULL)
    {
        HAL_UART_Transmit(huart2, &c, 1, 100);
    }

    return ch;
}

以上代码的MDK5工程文件为: stm32c5_Uart.zip (17.23 MB, 下载次数: 0)
以上代码实现数据收发如下图
632036a9965c6dc6bf.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

2993

主题

17964

帖子

31

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