1. 程式人生 > >STM32 USART1 USART2 UART3配置 接收函式和傳送函式

STM32 USART1 USART2 UART3配置 接收函式和傳送函式

    STM32F10x系列,串列埠1、串列埠2、串列埠3配置以及中斷函式、接收資料和傳送資料函式

uart.c

//硬體驅動
#include "usart.h"
#include "delay.h"

//C庫
#include <stdarg.h>
#include <string.h>


/*
************************************************************
*	函式名稱:	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);
	
	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 = 2;					//子中斷優先順序(值越小優先順序越高)
	NVIC_Init(&nvicInitStruct);														//初始化NVIC

}

/*
************************************************************
*	函式名稱:	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;				//1位停止位
	usartInitStruct.USART_WordLength = USART_WordLength_8b;				//8位資料位
	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);

}


/*
************************************************************
*	函式名稱:	Usart3_Init
*
*	函式功能:	串列埠2初始化
*
*	入口引數:	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);
	
	//USART1_TX   GPIOB.10
        gpioInitStruct.GPIO_Pin = GPIO_Pin_10; 				        //PB.10
        gpioInitStruct.GPIOSpeed = GPIO_Speed_50MHz;
        gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;			        //複用推輓輸出
        GPIO_Init(GPIOB, &gpioInitStruct);					//初始化GPIOB.10
   
        //USART1_RX	  GPIOB.11初始化
        gpioInitStruct.GPIO_Pin = GPIO_Pin_11;				        //PB.11
        gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;		        //浮空輸入
        GPIO_Init(GPIOB, &gpioInitStruct);					//初始化GPIOB.11 
	
	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(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);

}

/*
************************************************************
*	函式名稱:	Usart_SendString
*
*	函式功能:	串列埠資料傳送
*
*	入口引數:	USARTx:串列埠組
*				str:要傳送的資料
*				len:資料長度
*
*	返回引數:	無
*
*	說明:		
************************************************************
*/

void Usart_SendString(USART_TypeDef *USARTx, unsigned char *str, unsigned short len)
{

	unsigned short count = 0;
	
	for(; count < len; count++)
	{
		USART_SendData(USARTx, *str++);						//傳送資料
		while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);		//等待發送完成
	}

}

/*
************************************************************
*	函式名稱:	UsartPrintf
*
*	函式功能:	格式化列印
*
*	入口引數:	USARTx:串列埠組
*				fmt:不定長參
*
*	返回引數:	無
*
*	說明:		
************************************************************
*/
void UsartPrintf(USART_TypeDef *USARTx, char *fmt,...)
{

	unsigned char UsartPrintfBuf[296];
	va_list ap;
	unsigned char *pStr = UsartPrintfBuf;
	
	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);
	}

}

extern unsigned char usart1Buf[64];
extern unsigned char usart1Len;
/*
************************************************************
*	函式名稱:	USART1_IRQHandler
*
*	函式功能:	串列埠1收發中斷
*
*	入口引數:	無
*
*	返回引數:	無
*
*	說明:		
************************************************************
*/
void USART1_IRQHandler(void)
{

	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)	//接收中斷
	{
		if(usart1Len >= 64)									//防止資料過多,導致記憶體溢位
			usart1Len = 0;
		usart1Buf[usart1Len++] = USART1->DR;
		
		USART_ClearFlag(USART1, USART_FLAG_RXNE);
	}

}

extern char usart2Buf[64];
extern char usart2Len;
/*
************************************************************
*	函式名稱:	USART2_IRQHandler
*
*	函式功能:	串列埠2收發中斷
*
*	入口引數:	無
*
*	返回引數:	無
*
*	說明:		
************************************************************
*/
void USART2_IRQHandler(void)
{

	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)	//接收中斷
	{
		if(usart2Len >= 64)									//防止資料過多,導致記憶體溢位
			usart2Len = 0;
		usart2Buf[usart2Len++] = USART2->DR;
		
		USART_ClearFlag(USART2, USART_FLAG_RXNE);
	}
}



extern char usart3Buf[64];
extern char usart3Len;
/*
************************************************************
*	函式名稱:	USART3_IRQHandler
*
*	函式功能:	串列埠3收發中斷
*
*	入口引數:	無
*
*	返回引數:	無
*
*	說明:		
************************************************************
*/
void USART3_IRQHandler(void)
{

	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)	//接收中斷
	{
		if(usart3Len >= 64)									//防止資料過多,導致記憶體溢位
			usart3Len = 0;
		usart3Buf[usart3Len++] = USART3->DR;
		
		USART_ClearFlag(USART3, USART_FLAG_RXNE);
	}
}