学习目标

  • 熟悉STM32CubeMX配置流程
  • 掌握串口发送和接收
  • 掌握串口DMA发送和DMA接收
  • 掌握printf配置

    学习内容

    开发流程

  1. 配置芯片串口功能
  2. 编写串口代码
  3. 调试

    串口功能配置

    串口功能开启

    043.png
  • Connectivity下选择合适的串口,这里选择USART1
  • 配置模式为异步,Asynchronous

    串口中断配置

    044.png

  • NVIC Settings下,打开串口中断。

    串口参数配置

    048.png

  • Parameter Settings中,根据情况配置串口的参数。

    查询配置结果

    045.png
    GPIO Setting中可以显示默认的IO引脚
    046.png
    右侧芯片引脚部分会显示配置的结果。

发送功能测试

  1. /* USER CODE BEGIN WHILE */
  2. uint8_t cnt = 0;
  3. while (1)
  4. {
  5. HAL_UART_Transmit(&huart1, &cnt, 1, HAL_MAX_DELAY);
  6. cnt++;
  7. HAL_Delay(1000);
  8. /* USER CODE END WHILE */
  9. /* USER CODE BEGIN 3 */
  10. }

通过HAL_UART_Transmit函数发送数据。

中断接收功能测试

  1. /* USER CODE BEGIN WHILE */
  2. HAL_UART_Receive_IT(&huart1, usart1_buffer, USART1_BUFFER_LEN);
  3. while (1)
  4. {
  5. /* USER CODE END WHILE */
  6. /* USER CODE BEGIN 3 */
  7. }
  8. /* USER CODE END 3 */
  1. /* USER CODE BEGIN 0 */
  2. #define USART1_BUFFER_LEN 1
  3. uint8_t usart1_buffer[USART1_BUFFER_LEN];
  4. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
  5. HAL_UART_Transmit(&huart1, (const uint8_t *)usart1_buffer, USART1_BUFFER_LEN, HAL_MAX_DELAY);
  6. // 开启中断接收
  7. HAL_UART_Receive_IT(&huart1, usart1_buffer, USART1_BUFFER_LEN);
  8. }
  9. /* USER CODE END 0 */

printf配置

  1. #include <stdio.h>
  2. int fputc(int ch, FILE* f) {
  3. HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1, 0xFFFF);
  4. return ch;
  5. }

DMA收发

配置

052.png
053.png

DMA发送

  1. /* USER CODE BEGIN WHILE */
  2. uint8_t cnt = 0;
  3. while (1)
  4. {
  5. HAL_UART_Transmit_DMA(&huart1, &cnt, 1);
  6. cnt++;
  7. HAL_Delay(1000);
  8. /* USER CODE END WHILE */
  9. /* USER CODE BEGIN 3 */
  10. }

DMA接收

  1. #define USART1_BUFFER_LEN 8
  2. uint8_t usart1_buffer[USART1_BUFFER_LEN];
  3. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
  4. HAL_UART_Transmit_DMA(&huart1, (const uint8_t *)usart1_buffer, USART1_BUFFER_LEN);
  5. // 开启中断接收
  6. HAL_UART_Receive_DMA(&huart1, usart1_buffer, USART1_BUFFER_LEN);
  7. }

练习

  1. 使用CubeMX配置串口的收发