简介
STM32F1基本配置2.串口的配置和常用函数,侧重于即配即用。
因此不会讲述太多原理性的东西,希望做到即拿即用的效果。
串口简介
串口是MCU重要的外部接口,用于数据传输,也是开发中重要的调试手段。
STM32的串口资源丰富,支持多种通讯模式,具有DMA等。
串口的参数有波特率,停止位等。
由于这里侧重于即配即用,更多详细的内容可自行查阅。
串口配置相关知识
至于串口的波特率等相关参数的知识,网上已经有很多资料可自行查阅。
在这里说一下使用printf打印串口的知识:
由于是在MCU上运行的程序,所以无法像写C语言一样直接使用printf。
要想使用printf打印串口则需要改写fputc函数,如下:
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (u8)ch);//发送一个字节数据到串口
//等待发送完毕
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{
}
return ch;
}
然后是串口中断的知识:
常用的串口中断有RXNE(读寄存器非空)和TC(发送完成)。
当使能了这两个中断
如:USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
只要产生读寄存器非空和发送完成的事件就会进入到中断函数
void USART1_IRQHandler(void)里面去执行,
一般进入中断函数后先判断是哪种中断(只要产生中断就进入这个中断函数),
判断是哪种中断:USART_GetITStatus(USART1, USART_IT_RXNE)
在出中断函数前要擦除中断标志:
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
串口无中断配置
GPIO_InitTypeDef GPIO_InitStructure; //用来配置USART对应引脚的结构体
USART_InitTypeDef USART_InitStructure; //用来配置USART的结构体
//开启串口A的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//开启串口对应端口组的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//配置USART的输出引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //串口1的输出引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速率
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化
//配置USART的输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //输入引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置浮空输入模式
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化端口
//配置串口
USART_InitStructure.USART_BaudRate = 115200; //设置波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置串口传输的字长
USART_InitStructure.USART_StopBits = USART_StopBits_1; //设置停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //设置奇偶校验位
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //设置输出和输入模式
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控制
USART_Init(USART1, &USART_InitStructure); //根据参数初始化USART
USART_Cmd(USART1, ENABLE); //使能串口
串口有中断配置
首先要在配置串口中断配置前设置NVIC中断分组,不然无法使用中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
下面是配置STM32F1RC配置相关代码
GPIO_InitTypeDef GPIO_InitStructure; //用来配置USART对应引脚的结构体
USART_InitTypeDef USART_InitStructure; //用来配置USART的结构体
NVIC_InitTypeDef NVIC_InitStructure; //用来配置USART中断的结构体
//开启串口A的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//开启串口对应端口组的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//配置USART的输出引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //串口1的输出引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速率
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化
//配置USART的输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //输入引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置浮空输入模式
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化端口
//配置串口
USART_InitStructure.USART_BaudRate = 115200; //设置波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置串口传输的字长
USART_InitStructure.USART_StopBits = USART_StopBits_1; //设置停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //设置奇偶校验位
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //设置输出和输入模式
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控制
USART_Init(USART1, &USART_InitStructure); //根据参数初始化USART
//配置USART的中断
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //设置串口中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道使能
NVIC_Init(&NVIC_InitStructure); //初始化
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //接收寄存器非空中断使能
USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //发送完成中断使能
USART_Cmd(USART1, ENABLE); //使能串口
串口中断函数
不管产生哪种串口中断都会进入到中断函数,所以需要在里面判断是哪种中断
然后需要清除中断标志
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断是否是RXNE中断
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除RXNE中断标志位
//用户代码
}
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //判断是否是TC中断
{
USART_ClearITPendingBit(USART1, USART_IT_TXE); //清除TC中断标志位
//用户代码
}
}
版权声明:本文为haiou_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。