单片机交流
直播中

李敏

7年用户 1357经验值
私信 关注
[问答]

求大神分享串口通信编程实例

串口常用的相关寄存器是什么?
串口编程常用库函数是什么?

回帖(1)

李婷

2021-9-27 11:49:07
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);
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分