使用单片机STM32F103VE调试USART3的时候发现只能接收不能发送,引脚使用PB10、PB11最后发现是初始化RCC_APB2Periph_GPIOB初始化时候错误,使用了RCC_APB1PeriphClockCmd,实际应该使用RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
如下是初始化代码,亲实测通过
void RS232_Init(u32 baudrate)
{
GPIO_InitTypeDef gpio_InitStructure;
USART_InitTypeDef usart_InitStructure;
NVIC_InitTypeDef nvic_InitStructure;
//使能GPIOA,D时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
USART_DeInit(USART3); //串口恢复到默认的状态 然后再进行初始化
//PB10端口配置 USART1_TXD
gpio_InitStructure.GPIO_Pin = GPIO_Pin_10;
gpio_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//复用推挽
gpio_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &gpio_InitStructure);
//PB11端口配置 USART1_RXD
gpio_InitStructure.GPIO_Pin = GPIO_Pin_11;
//浮空输入
gpio_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
// gpio_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &gpio_InitStructure);
//设置波特率
usart_InitStructure.USART_BaudRate = baudrate;
//8为数据长度
usart_InitStructure.USART_WordLength =
USART_WordLength_8b;
//一共停止位
usart_InitStructure.USART_StopBits =
USART_StopBits_1;
//奇偶检验位
usart_InitStructure.USART_Parity =
USART_Parity_No;
//无硬件数据流控制
usart_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_None;
//收发模式
usart_InitStructure.USART_Mode =
USART_Mode_Rx | USART_Mode_Tx;
//初始化串口1
USART_Init(USART3, &usart_InitStructure);
USART_Cmd(USART3, ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
//使能串口2中断
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
nvic_InitStructure.NVIC_IRQChannel = USART3_IRQn;
//设置中断优先级 先占优先级2级
nvic_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//从优先级2级
nvic_InitStructure.NVIC_IRQChannelSubPriority = 0;
nvic_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
NVIC_Init(&nvic_InitStructure);
}
//发送
void RS232_Send_Data(u8 *buf, u8 len)
{
while (len--)
{
//等待发送区为空
while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
USART_SendData(USART3, *(buf++));
}
//等待发送完成
while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
}