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
相关产品推荐
相关产品推荐

