STM32
直播中

刘刚

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

stm32f103单片机串口初始化的过程是怎样的?

STM32f103单片机串口初始化的过程是怎样的?

回帖(1)

蔡明灼

2021-12-6 14:23:46
这篇文章是本人从小白到熟悉这个单片机的过程,本在使用过程中主要是针对的64为单片机,但是其它引脚位数的单片机应该也是比较实用,由于篇幅较长,


废话不多说,开始单片机学习之旅吧!(本文章比较适用于对硬件知识有一定基础,如果有51系列单片机开发或者学习经验者。)


最开始笔者是从串口初始化开始,串口是个很好用的东西。不光可以用来通信而且还可以用来调试调试程序。下面这段程序是对串口1-3的初始化函数。这三段函数基本上没有什么区别只是引脚不同,所以后面的程序没加注释。


/*
******串口1初始化*****************************************
*        函数名称:Usart1_Init
*
*        函数功能:        串口1初始化
*
*        入口参数:        baud:设定波特率
*
*        返回参数:        无
*
*        说明:                TX-PA9                RX-PA10
************************************************************
*/
void Usart1_Init(unsigned int baud)
{

        GPIO_InitTypeDef gpioInitStruct;
        USART_InitTypeDef usartInitStruct;
        NVIC_InitTypeDef nvicInitStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);                                //打开GPIOA时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);                                //打开USART1的时钟
       
        //PA9        TXD
        gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;                                        //设置为复用模式
        gpioInitStruct.GPIO_Pin = GPIO_Pin_9;                                                //初始化Pin9
        gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;                                        //承载的最大频率
        GPIO_Init(GPIOA, &gpioInitStruct);                                                                                                //初始化GPIOA
       
        //PA10        RXD
        gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;                                //设置为浮空模式
        gpioInitStruct.GPIO_Pin = GPIO_Pin_10;                                                //初始化Pin10
        gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;                                        //承载的最大频率
        GPIO_Init(GPIOA, &gpioInitStruct);                                                                                                //初始化GPIOA
       
        usartInitStruct.USART_BaudRate = baud;   //设置串口波特率
        usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;        //无硬件流控制
        usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                        //接收和发送
        usartInitStruct.USART_Parity = USART_Parity_No;                                        //无校验
        usartInitStruct.USART_StopBits = USART_StopBits_1;                                //1位停止位
        usartInitStruct.USART_WordLength = USART_WordLength_8b;                                //8位数据位
        USART_Init(USART1, &usartInitStruct);                                                                                //初始化串口1
       
        USART_Cmd(USART1, ENABLE);                                                                                                                //使能串口
       
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                                        //使能接收中断
       
        nvicInitStruct.NVIC_IRQChannel = USART1_IRQn;                                        //usart1中断号
        nvicInitStruct.NVIC_IRQChannelCmd = ENABLE;                                        //中断通道使能
        nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0;                                //抢占中断优先级(值越小优先级越高)
        nvicInitStruct.NVIC_IRQChannelSubPriority = 1;                                        //子中断优先级(值越小优先级越高)
        NVIC_Init(&nvicInitStruct);                                                                                                                //初始化NVIC
}

/*
******串口2初始化*****************************************
*        函数名称:Usart2_Init
*
*        函数功能:        串口2初始化
*
*        入口参数:        baud:设定波特率
*
*        返回参数:        无
*
*        说明:                TX-PA2                RX-PA3
************************************************************
*/

void Usart2_Init(unsigned int baud)
{

        GPIO_InitTypeDef gpioInitStruct;
        USART_InitTypeDef usartInitStruct;
        NVIC_InitTypeDef nvicInitStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
       
        //PA2        TXD
        gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
        gpioInitStruct.GPIO_Pin = GPIO_Pin_2;
        gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &gpioInitStruct);
       
        //PA3        RXD
        gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        gpioInitStruct.GPIO_Pin = GPIO_Pin_3;
        gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &gpioInitStruct);
       
        usartInitStruct.USART_BaudRate = baud;
        usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;       
        usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                       
        usartInitStruct.USART_Parity = USART_Parity_No;                                       
        usartInitStruct.USART_StopBits = USART_StopBits_1;                               
        usartInitStruct.USART_WordLength = USART_WordLength_8b;                               
        USART_Init(USART2, &usartInitStruct);
        USART_Cmd(USART2, ENABLE);                                                                                                       
       
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);                                                                       
        nvicInitStruct.NVIC_IRQChannel = USART2_IRQn;
        nvicInitStruct.NVIC_IRQChannelCmd = ENABLE;
        nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0;
        nvicInitStruct.NVIC_IRQChannelSubPriority = 0;
        NVIC_Init(&nvicInitStruct);

}

/*
******串口3初始化*****************************************
*        函数名称:Usart3_Init
*
*        函数功能:        串口3初始化
*
*        入口参数:        baud:设定波特率
*
*        返回参数:        无
*
*        说明:                TX-PB10                RX-PB11
************************************************************
*/

void Usart3_Init(unsigned int baud)
{

        GPIO_InitTypeDef gpioInitStruct;
        USART_InitTypeDef usartInitStruct;
        NVIC_InitTypeDef nvicInitStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
       
        //USART3_TX   GPIOB.10
        gpioInitStruct.GPIO_Pin = GPIO_Pin_10;                                
        gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;                       
  GPIO_Init(GPIOB, &gpioInitStruct);                                       
   
        //USART3_RX          GPIOB.11
  gpioInitStruct.GPIO_Pin = GPIO_Pin_11;                               
  gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;               
  GPIO_Init(GPIOB, &gpioInitStruct);                                       
       
        usartInitStruct.USART_BaudRate = baud;
        usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;       
        usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                       
        usartInitStruct.USART_Parity = USART_Parity_No;                                       
        usartInitStruct.USART_StopBits = USART_StopBits_1;                       
        usartInitStruct.USART_WordLength = USART_WordLength_8b;                               
        USART_Init(USART3, &usartInitStruct);
       
        USART_Cmd(USART3, ENABLE);                                                                                                               
       
        USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);                                               
       
        nvicInitStruct.NVIC_IRQChannel = USART3_IRQn;
        nvicInitStruct.NVIC_IRQChannelCmd = ENABLE;
        nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0;
        nvicInitStruct.NVIC_IRQChannelSubPriority = 0;
        NVIC_Init(&nvicInitStruct);

}
/*
*********串口打印函数******************
*函数名称:UsartPrintf
*参数:        *USARTx:选择打印的端口
*                                fmt:需要打印的数据
*
*说明:
****************************
*/
void USART_Printf(USART_TypeDef *USARTx, char *fmt,...)
{

        unsigned char UsartPrintfBuf[296];
        va_list ap;
        unsigned char *pStr = UsartPrintfBuf; //指针pStr指向数组
       
        va_start(ap, fmt);
        vsprintf((char *)UsartPrintfBuf, fmt, ap);                               
        va_end(ap);
       
        while(*pStr != 0)
        {
                USART_SendData(USARTx, *pStr++);
                while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
        }

}       
由于串口是异步通信方式,所以接收数据需要通过中断来接受。程序如下。



void USART1_IRQHandler(void)
{        
    if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)  //判断是否发生中断
    {
      USART_ClearITPendingBit(USART1,USART_IT_RXNE);  //清除当前中断标志位

        …………………………
        ………………………… //中断处理函数
      
    }
}


void USART2_IRQHandler(void)
{        
    if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)  //判断是否发生中断
    {
      USART_ClearITPendingBit(USART2,USART_IT_RXNE);  //清除当前中断标志位

        …………………………
        ………………………… //中断处理函数
      
    }
}

void USART3_IRQHandler(void)
{        
    if(USART_GetITStatus(USART3,USART_IT_RXNE) != RESET)  //判断是否发生中断
    {
      USART_ClearITPendingBit(USART3,USART_IT_RXNE);  //清除当前中断标志位

        …………………………
        ………………………… //中断处理函数
      
    }
}
中断处理函数需要根据自己的功能来实现,到此整个串口初始化已经完成。
举报

更多回帖

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