STM32串口编程
参考官方文档
串口常用的相关寄存器
USART_SR 状态寄存器
USART_DR数据寄存器
USART_BRR波特率寄存器
串口波特率配置
波特率计算公式
fPCLKx:串口的时钟,从手册中Memory map和Clock tree可得知,
fpclkx分为:fpclk1用于AHB1中USART2、USART3、USART4、USART5 ,fpclk2 用于AHB2中USART1
Baud Rate:需要设定的波特率
USARTDIV:一个无符号浮点数值
举例:
最大fPCLK2 = 72M Baud Rate = 115200
USARTDIV = 72000000/(16*115200)=39.0625
查看手册
DIV_Mantissa=16*0.0625≈1=0x01
DIV_Fraction=39=0x27
因此我们就可以设置USART1->BRR = 0x0271,也就是我们配置了此时的串口波特率为115200
串口编程常用库函数
详细信息查看官方库函数stm32f10x_usart.h 和 stm32f10x_usart.c文件
/*串口初始化:波特率,数据字长,奇偶校验等等*/
void USART_Init();
/*使能串口 */
void USART_Cmd();
/*使能相关中断 */
void USART_ITConfig();
/*发送数据到串口,DR寄存器*/
void USART_SendData();
/*接受数据,从DR读取接受到的数据 */
uint16_t USART_ReceiveData();
/*获取状态标志位 */
FlagStatus USART_GetFlagStatus();
/*清除状态标志位*/
void USART_ClearFlag();
/*获取中断状态标志位*/
ITStatus USART_GetITStatus();
/*清除中断状态标志位*/
void USART_ClearITPendingBit();
实例编程
void Demo_USART1_Init(void)
{
/*GPIO_InitStrue通用IO口相关参数配置*/
GPIO_InitTypeDef GPIO_InitStrue;
/*USART_InitStrue串口参数相关配置*/
USART_InitTypeDef USART_InitStrue;
/*NVIC_InitStrue中断优先级相关参数配置*/
NVIC_InitTypeDef NVIC_InitStrue;
/*使能RCC_APB2Periph_GPIOA时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
/*使能RCC_APB2Periph_USART1时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
/*配置GPIO_Pin_9参数*/
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
/*初始化GPIO_Pin_9*/
GPIO_Init(GPIOA,&GPIO_InitStrue);
/*配置GPIO_Pin_10参数*/
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
/*初始化GPIO_Pin_10*/
GPIO_Init(GPIOA,&GPIO_InitStrue);
/*配置串口参数:波特率,数据字长,奇偶校验*/
USART_InitStrue.USART_BaudRate=115200;/*使用库函数的好处就是不用程序员亲自计算BRR寄存器设置*/
USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
USART_InitStrue.USART_Parity=USART_Parity_No;
USART_InitStrue.USART_StopBits=USART_StopBits_1;
USART_InitStrue.USART_WordLength=USART_WordLength_8b;
/*初始化串口*/
USART_Init(USART1,&USART_InitStrue);
/*使能串口1USART1中断*/
USART_Cmd(USART1,ENABLE);
/*如果想要开启中断,则开启接收接收中断*/
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
/*配置中断优先级参数*/
NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
/*初始化中断响应优先级*/
NVIC_Init(&NVIC_InitStrue);
}
/*实现中断函数*/
void USART1_IRQHandler(void)
{
u8 rec_data;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
rec_data= USART_ReceiveData(USART1);
USART_SendData(USART1,rec_data);
}
}
int main(void)
{
/*必须在配置中断之前初始化中断优先级分组*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Demo_USART1_Init();
while(1);
}
STM32串口编程
参考官方文档
串口常用的相关寄存器
USART_SR 状态寄存器
USART_DR数据寄存器
USART_BRR波特率寄存器
串口波特率配置
波特率计算公式
fPCLKx:串口的时钟,从手册中Memory map和Clock tree可得知,
fpclkx分为:fpclk1用于AHB1中USART2、USART3、USART4、USART5 ,fpclk2 用于AHB2中USART1
Baud Rate:需要设定的波特率
USARTDIV:一个无符号浮点数值
举例:
最大fPCLK2 = 72M Baud Rate = 115200
USARTDIV = 72000000/(16*115200)=39.0625
查看手册
DIV_Mantissa=16*0.0625≈1=0x01
DIV_Fraction=39=0x27
因此我们就可以设置USART1->BRR = 0x0271,也就是我们配置了此时的串口波特率为115200
串口编程常用库函数
详细信息查看官方库函数stm32f10x_usart.h 和 stm32f10x_usart.c文件
/*串口初始化:波特率,数据字长,奇偶校验等等*/
void USART_Init();
/*使能串口 */
void USART_Cmd();
/*使能相关中断 */
void USART_ITConfig();
/*发送数据到串口,DR寄存器*/
void USART_SendData();
/*接受数据,从DR读取接受到的数据 */
uint16_t USART_ReceiveData();
/*获取状态标志位 */
FlagStatus USART_GetFlagStatus();
/*清除状态标志位*/
void USART_ClearFlag();
/*获取中断状态标志位*/
ITStatus USART_GetITStatus();
/*清除中断状态标志位*/
void USART_ClearITPendingBit();
实例编程
void Demo_USART1_Init(void)
{
/*GPIO_InitStrue通用IO口相关参数配置*/
GPIO_InitTypeDef GPIO_InitStrue;
/*USART_InitStrue串口参数相关配置*/
USART_InitTypeDef USART_InitStrue;
/*NVIC_InitStrue中断优先级相关参数配置*/
NVIC_InitTypeDef NVIC_InitStrue;
/*使能RCC_APB2Periph_GPIOA时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
/*使能RCC_APB2Periph_USART1时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
/*配置GPIO_Pin_9参数*/
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
/*初始化GPIO_Pin_9*/
GPIO_Init(GPIOA,&GPIO_InitStrue);
/*配置GPIO_Pin_10参数*/
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
/*初始化GPIO_Pin_10*/
GPIO_Init(GPIOA,&GPIO_InitStrue);
/*配置串口参数:波特率,数据字长,奇偶校验*/
USART_InitStrue.USART_BaudRate=115200;/*使用库函数的好处就是不用程序员亲自计算BRR寄存器设置*/
USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
USART_InitStrue.USART_Parity=USART_Parity_No;
USART_InitStrue.USART_StopBits=USART_StopBits_1;
USART_InitStrue.USART_WordLength=USART_WordLength_8b;
/*初始化串口*/
USART_Init(USART1,&USART_InitStrue);
/*使能串口1USART1中断*/
USART_Cmd(USART1,ENABLE);
/*如果想要开启中断,则开启接收接收中断*/
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
/*配置中断优先级参数*/
NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
/*初始化中断响应优先级*/
NVIC_Init(&NVIC_InitStrue);
}
/*实现中断函数*/
void USART1_IRQHandler(void)
{
u8 rec_data;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
rec_data= USART_ReceiveData(USART1);
USART_SendData(USART1,rec_data);
}
}
int main(void)
{
/*必须在配置中断之前初始化中断优先级分组*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Demo_USART1_Init();
while(1);
}
举报