本文展现了STM32串口通信配置流程,及示例。
根据串口发送方式的不同,使用的中断不同。发送方式:直接收发、DMA收发。此文只展示直接收发方式。
目录
一、确认使用的串口与对应的引脚
串口号 | RXD | TXD |
1 | PA10(PB7) | PA9 (PB6) |
2 | PA3(PD6) | PA2(PD5) |
3 | PB11(PC11/PD9) | PB10(PC10/PD8) |
4 | PC11(PA1) | PC10(PA0) |
5 | PD2 | PC12 |
6 | PC7(PG9) | PC6(PG14) |
二、进行串口配置
1、串口IO初始化
GPIO_InitTypeDef GPIO_InitStructure;
//IO时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
//IO复用为串口x
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);
//IO初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; //速度 25MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化
2、串口配置
USART_InitTypeDef USART_InitStructure;
//串口时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
USART_InitStructure.USART_BaudRate = 9600 ; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_9b;//字长为9位数据格式
USART_InitStructure.USART_Parity = USART_Parity_Even; //偶校验
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1个停止位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
USART_Init(USART3, &USART_InitStructure); //初始化串口
3、开启中断
NVIC_InitTypeDef NVIC_InitStructure;
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //开启 接收到数据中断
USART_ITConfig(USART3, USART_IT_IDLE, ENABLE); //开启 空闲中断
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //抢占优先级 2
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //响应优先级 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化 VIC 寄存器
4、使能串口
USART_Cmd(USART3, ENABLE);//使能串口
5、串口接收与发送
串口中断服务函数(接收)
USART_IT_RXNE:每接收一个字节数据触发一次。
USART_IT_IDLE:接收进入空闲时触发,此时接收完成。
void USART3_IRQHandler(void)
{
BYTE Res;
//直接收发 读取数据
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART3, USART_IT_RXNE);
Res = USART_ReceiveData(USART3);
RxBuf[RxLen] = Res;
RxLen ++;
}
//空闲中断
if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET)
{
(void)USART3->SR;
(void)USART3->DR;
Finish = TRUE;//接收完成
}
}
发送函数(发送)
参数buf 为发送区首地址, len 为发送的字节数
void USART3_Send_Data(u8 *buf,u16 len)
{
u16 t;
for(t=0;t<len;t++) //循环发送数据
{
while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
USART_SendData(USART3,buf[t]);
}
while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
}