STM32单片机通信-串口通信编程实例学习(1)

    技术2022-07-10  122

     

    STM32单片机通信-串口通信学习(0)

     

    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.hstm32f10x_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); }

     

    Processed: 0.017, SQL: 9