# STM32F103 串口打印配置(HAL库)

下面是在STM32F103上配置串口打印的完整步骤(使用HAL库):

1. 硬件准备

  • STM32F103系列开发板
  • USB转TTL模块(如CH340、CP2102等)
  • 连接线(TX、RX、GND)

2. CubeMX配置

  1. 打开STM32CubeMX,新建工程选择对应型号

  2. 在"Pinout & Configuration"标签页中:

    • 启用USART1(或其他USART)
    • 模式选择"Asynchronous"
    • 配置引脚(通常PA9-TX, PA10-RX)
  3. 参数配置:

    • Baud Rate: 115200
    • Word Length: 8 bits
    • Parity: None
    • Stop Bits: 1
    • Flow Control: None
  4. NVIC设置:

    • 启用USART全局中断(如果需要中断接收)
  5. 生成代码(选择工具链为MDK-ARM/IAR/其他)

3. 代码实现

方法一:使用HAL库直接打印

#include "main.h"
#include <stdio.h>

UART_HandleTypeDef huart1;  // 假设使用USART1

// 重定向printf到串口
int __io_putchar(int ch)
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
    return ch;
}

// 或者使用更完整的实现
int _write(int file, char *ptr, int len)
{
    HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, HAL_MAX_DELAY);
    return len;
}

// 在主函数初始化后使用
int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();
    
    printf("System initialized!\r\n");
    
    while (1)
    {
        printf("Hello World!\r\n");
        HAL_Delay(1000);
    }
}

方法二:直接使用HAL_UART_Transmit函数

void send_string(UART_HandleTypeDef *huart, char *str)
{
    HAL_UART_Transmit(huart, (uint8_t *)str, strlen(str), HAL_MAX_DELAY);
}

// 使用示例
send_string(&huart1, "Hello via UART\r\n");

4. 项目设置(针对Keil MDK)

  1. 确保在"Options for Target" -> “Target"中勾选了"Use MicroLIB”
  2. 如果使用标准库,需要实现_write或__io_putchar

5. 常见问题解决

  1. 没有输出

    • 检查TX/RX接线是否正确(开发板TX接模块RX,开发板RX接模块TX)
    • 检查波特率是否匹配
    • 检查时钟配置是否正确
  2. 乱码

    • 通常是波特率不匹配或时钟配置错误
    • 检查系统时钟和USART时钟配置
  3. 只能发送一次

    • 确保没有在中断服务程序中阻塞
    • 检查硬件流控制设置

6. 高级功能

接收数据(中断方式)

// 在main.c中添加缓冲区
uint8_t rx_buffer[1];

// 在初始化后启动接收
HAL_UART_Receive_IT(&huart1, rx_buffer, 1);

// 实现接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        // 处理接收到的数据(rx_buffer[0])
        // 重新启动接收
        HAL_UART_Receive_IT(&huart1, rx_buffer, 1);
    }
}

DMA传输(高效方式)

// 在CubeMX中启用USART DMA
// 发送通道选择Memory to Peripheral
// 接收通道选择Peripheral to Memory

// 发送数据示例
uint8_t data[] = "DMA Transfer\r\n";
HAL_UART_Transmit_DMA(&huart1, data, sizeof(data));

以上配置适用于STM32F103系列大多数型号,根据具体硬件可能需要进行微调。

资源下载链接为: https://pan.quark.cn/s/502b0f9d0e26 STM32F103C8T6是意法半导体公司推出的一款基于ARM Cortex-M3内核的微控制器,常用于嵌入式系统开发。该代码包通过HAL实现了三个重要功能:LED灯控制、串口通信以及串口通信结合DMA传输。 在“LED(OK)”项目中,开发者利用HAL对GPIO接口进行编程,实现了LED灯的点亮和熄灭。STM32F103C8T6的每个GPIO端口均可配置为输出模式,通过操作数据寄存器的相应位来控制LED状态。HAL提供了封装好的API,例如HAL_GPIO_Init()用于初始化GPIO端口,HAL_GPIO_WritePin()用于向GPIO端口写入数据,从而实现LED灯的开关控制。 接下来是串口通信功能。串行通信是嵌入式系统中常见的数据传输方式,用于设备间通信。在“USART(OK)”项目中,开发人员使用HAL串口驱动,初始化了USART接口,并配置了波特率、校验位、停止位等参数。HAL_UART_Transmit()函数用于发送数据,HAL_UART_Receive()用于接收数据。其中,“不定长发送字符”指的是发送数据的长度可以根据需要动态调整,直到遇到特定结束字符为止,这在ASCII协议等许多通信协议中十分常见。 此外,代码包还展示了串口通信结合DMA的方式。在“USART+DMA(OK)”项目中,利用了STM32的DMA功能,可减轻CPU负担,提升串口通信效率。在串口通信中,CPU将数据队列交给DMA后,可继续执行其他任务,DMA则自动完成数据的发送或接收。HAL_UART_Transmit_DMA()HAL_UART_Receive_DMA()函数用于启动串口DMA传输。结合空闲中断,可在串口空闲时触发中断处理程序,检测数据传输是否完成,实现非阻塞式通信,提
配置STM32F103串口4(UART4)使用HAL需要以下几个步骤: ### 1. 初始化UART4的GPIO引脚 在使用UART4之前,需要先配置其对应的GPIO引脚为复用推挽模式,并启用相应的时钟。STM32F103的UART4通常使用`PC10`(TX)和`PC11`(RX)[^1]。 ```c // UART4 GPIO Configuration // PC10 ------> UART4_TX // PC11 ------> UART4_RX GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Alternate = GPIO_AF8_UART4; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); ``` ### 2. 配置UART4的参数 使用`UART_HandleTypeDef`结构体来配置UART4的基本参数,例如波特率、数据位、停止位和校验位等。 ```c huart4.Instance = UART4; huart4.Init.BaudRate = 9600; huart4.Init.WordLength = UART_WORDLENGTH_8B; huart4.Init.StopBits = UART_STOPBITS_1; huart4.Init.Parity = UART_PARITY_NONE; huart4.Init.Mode = UART_MODE_TX_RX; huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart4.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart4); ``` ### 3. 使能UART4中断(可选) 如果需要使用中断方式接收数据,可以启用UART4的中断,并在NVIC中配置优先级。 ```c // 使能UART4全局中断 HAL_NVIC_EnableIRQ(UART4_IRQn); // 设置中断优先级 HAL_NVIC_SetPriority(UART4_IRQn, 0, 1); ``` ### 4. 发送数据 使用`HAL_UART_Transmit`函数可以发送数据到串口4。 ```c uint8_t txData[] = "Hello UART4!\r\n"; HAL_UART_Transmit(&huart4, txData, sizeof(txData), HAL_MAX_DELAY); ``` ### 5. 接收数据(轮询或中断方式) - **轮询方式**: ```c uint8_t rxData[10]; HAL_UART_Receive(&huart4, rxData, 1, HAL_MAX_DELAY); ``` - **中断方式**: 需要实现`UART4_IRQHandler`中断处理函数,并调用`HAL_UART_IRQHandler`来处理中断。 ```c void UART4_IRQHandler(void) { HAL_UART_IRQHandler(&huart4); } ``` 此外,还需要实现`HAL_UART_RxCpltCallback`回调函数来处理接收完成后的操作。 ```c void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart4) { // 处理接收到的数据 } } ``` ### 6. 主函数中初始化并启动UART4 确保在主函数中调用`HAL_UART_Init`来初始化UART4,并根据需要启动发送或接收功能。 ```c int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_UART4_Init(); // 发送测试数据 uint8_t txData[] = "Hello UART4!\r\n"; HAL_UART_Transmit(&huart4, txData, sizeof(txData), HAL_MAX_DELAY); while (1) { // 主循环 } } ``` 通过以上步骤,可以成功配置STM32F103的UART4接口并使用HAL进行通信操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章鱼哥嵌入式开发

坚持不易,你们的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值