stm32f103系列单片机串口初始化

stm32f103系列单片机串口初始化

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

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

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

  1. /*
    ******串口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);
    	}
     
    }	

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

  2. 
    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);  //清除当前中断标志位
    
            …………………………
            ………………………… //中断处理函数
          
        } 
    }

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

  3.  

你可能感兴趣的:(stm32)