You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BluePill(STM32F10C8) UART初始化问题:LL库无推挽复用模式选项

解决STM32F10C8(BluePill)LL库UART初始化复用推挽模式问题

问题说明

STM32F1系列的LL库中没有直接的LL_GPIO_MODE_ALTERNATE_PUSH_PULL宏定义,因为该系列GPIO的复用功能与输出类型是分开配置的。同时你的初始化代码还存在时钟使能、引脚速度配置的错误,以下是修正方案:

修正后的UART初始化代码

#include <stdio.h>

void uart1_init()
{
    // 修正时钟使能:GPIOA和USART1均挂载在APB2总线
    LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
    LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);

    // 配置PA9为复用功能模式
    LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_9, LL_GPIO_MODE_ALTERNATE);
    // 单独设置复用输出类型为推挽
    LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_9, LL_GPIO_OUTPUT_PUSHPULL);
    // 修正引脚速度参数:使用速度枚举值而非模式宏
    LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_9, LL_GPIO_SPEED_FREQ_50MHz);

    // USART核心参数配置
    LL_USART_SetTransferDirection(USART1, LL_USART_DIRECTION_TX);
    LL_USART_ConfigCharacter(USART1, LL_USART_DATAWIDTH_8B, LL_USART_PARITY_NONE, LL_USART_STOPBITS_1);
    // 基于8MHz系统时钟配置9600波特率
    LL_USART_SetBaudRate(USART1, 8000000, 9600);
    LL_USART_Enable(USART1);
}

整数发送实现函数

UART仅支持字节发送,需先将整数转换为ASCII字符串再逐字节发送:

void uart_send_int(USART_TypeDef *USARTx, int num)
{
    char buf[16];
    // 将整数转为带换行的字符串
    sprintf(buf, "%d\r\n", num);
    
    // 循环发送每个字符
    for(int i = 0; buf[i] != '\0'; i++)
    {
        // 等待发送寄存器为空
        while(!LL_USART_IsActiveFlag_TXE(USARTx));
        LL_USART_TransmitData8(USARTx, buf[i]);
    }
    // 等待整个帧发送完成
    while(!LL_USART_IsActiveFlag_TC(USARTx));
}

使用示例

int main(void)
{
    uart1_init();
    while(1)
    {
        uart_send_int(USART1, 12345);
        // 简单延时循环
        for(uint32_t i = 0; i < 500000; i++);
    }
}

内容的提问来源于stack exchange,提问作者user1482636

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:25:04