STM32串口库函数配置
什么是串口通信?
外部设备通过TXD,RXD两个端口和单片机进行通信。
STM32串口配置常用的相关库函数
USART_DeInit(); //复位
USART_Init(); //串口初始化
USART_Cmd(); //串口使能
USART_ITConfig(); //串口中断使能
USART_SendData(); //发送数据
USART_ReceiveData(); //接收数据
USART_GetFlagStatus(); //获取状态标志位
USART_ClearFlag(); //清除状态标志位
USART_GetITStatus(); //获取中断状态标志位
USART_ClearITPendingBit(); //清除中断状态标志位
串口配置过程(以USART1串口为例子,PA9和PA10)
①串口时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //串口时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //复用功能时钟使能
②GPIO端口初始化
通过查表《stm32开发手册V10》的8.1.11查看端口复用为串口时,IO口应该设置成什么模式
PA9为TX,应该设置成推挽复用输出
PA10为RX,应该设置成浮空输入或上拉输入,这里我们选择浮空输入
GPIO_InitTypeDef GPIO_Initstrue;
GPIO_Initstrue.GPIO_Mode=GPIO_Mode_AF_PP; //推挽复用输出
GPIO_Initstrue.GPIO_Pin=GPIO_Pin_9;
GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Initstrue);
GPIO_Initstrue.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Initstrue.GPIO_Pin=GPIO_Pin_10;
GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Initstrue);
③串口复位(非必需)
USART_DeInit(USART1);
④串口参数初始化
USART_InitTypeDef USART_Initstrue;
USART_Initstrue.USART_BaudRate=115200; //波特率为115200
USART_Initstrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制为无
USART_Initstrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //收发使能
USART_Initstrue.USART_Parity=USART_Parity_No; //奇偶校验位为无
USART_Initstrue.USART_StopBits=USART_StopBits_1; //停止位为1
USART_Initstrue.USART_WordLength=USART_WordLength_8b; //字节数据长度为8为
USART_Init(USART1,&USART_Initstrue); //串口初始化函数
⑤使能串口
USART_Cmd(USART1,ENABLE);
⑥开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
NVIC_InitTypeDef NVIC_Initstrue;
NVIC_Initstrue.NVIC_IRQChannel=USART1_IRQn; //在stm32f10x.h头文件里面找到
NVIC_Initstrue.NVIC_IRQChannelCmd=ENABLE;
NVIC_Initstrue.NVIC_IRQChannelPreemptionPriority=1;
NVIC_Initstrue.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_Initstrue);
⑦编写中断处理函数
void USART1_IRQHandler(void) //USART1_IRQHandler是在启动文件startup_stm32f10x_hd.s里面找到
{ //该函数是一旦串口接收到数据,就进入到串口中断函数
u8 flag; //函数内再将接收到的数据原封不动的再发出去
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
flag =USART_ReceiveData(USART1);
USART_SendData(USART1,flag);
}
}
配置实例
void Init(void)
{
GPIO_InitTypeDef GPIO_Initstrue;
USART_InitTypeDef USART_Initstrue;
NVIC_InitTypeDef NVIC_Initstrue;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //串口时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //复用功能时钟使能
GPIO_Initstrue.GPIO_Mode=GPIO_Mode_AF_PP; //推挽复用输出
GPIO_Initstrue.GPIO_Pin=GPIO_Pin_9;
GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Initstrue);
GPIO_Initstrue.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Initstrue.GPIO_Pin=GPIO_Pin_10;
GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Initstrue);
USART_DeInit(USART1);
USART_Initstrue.USART_BaudRate=115200; //波特率为115200
USART_Initstrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制为无
USART_Initstrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //收发使能
USART_Initstrue.USART_Parity=USART_Parity_No; //奇偶校验位为无
USART_Initstrue.USART_StopBits=USART_StopBits_1; //停止位为1
USART_Initstrue.USART_WordLength=USART_WordLength_8b; //字节数据长度为8为
USART_Init(USART1,&USART_Initstrue); //串口初始化函数
USART_Cmd(USART1,ENABLE);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
NVIC_InitTypeDef NVIC_Initstrue;
NVIC_Initstrue.NVIC_IRQChannel=USART1_IRQn; //在stm32f10x.h头文件里面找到
NVIC_Initstrue.NVIC_IRQChannelCmd=ENABLE;
NVIC_Initstrue.NVIC_IRQChannelPreemptionPriority=1;
NVIC_Initstrue.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_Initstrue);
}
void USART1_IRQHandler(void) //USART1_IRQHandler是在启动文件startup_stm32f10x_hd.s里面找到
{ //该函数是一旦串口接收到数据,就进入到串口中断函数
u8 flag; //函数内再将接收到的数据原封不动的再发出去
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
flag =USART_ReceiveData(USART1);
USART_SendData(USART1,flag);
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Init();
while(1);
}