STM32F4之USART初始化代碼


usart.c


初始化需要延時一下,否則第一個字符發送容易出錯

#include "./usart/bsp_usart.h"

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


/*
************************************************************
*	函數名稱:	Usart1_Init
*
*	函數功能:	串口1初始化
*
*	入口參數:	baud:設定的波特率
*
*	返回參數:	無
*
*	說明:		TX-PA9		RX-PA10
************************************************************
*/
void Usart1_Init(unsigned int baud)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
		
	RCC_AHB1PeriphClockCmd(USART1_RX_GPIO_CLK|USART1_TX_GPIO_CLK,ENABLE);
	RCC_APB2PeriphClockCmd(USART1_CLK, ENABLE);		/* 使能 USART 時鐘 */
  
	GPIO_PinAFConfig(USART1_TX_GPIO_PORT,USART1_TX_SOURCE,USART1_TX_AF);
	GPIO_PinAFConfig(USART1_RX_GPIO_PORT,USART1_RX_SOURCE,USART1_RX_AF);
	
	/* GPIO初始化 */
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;		/* 配置Tx引腳爲複用功能  */
	GPIO_InitStructure.GPIO_Pin = USART1_TX_PIN|USART1_RX_PIN;  
	GPIO_Init(GPIOA, &GPIO_InitStructure);

 
  

	/* 配置串USART1 模式 */
	USART_InitStructure.USART_BaudRate = baud;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;	/* 字長(數據位+校驗位):8 */
	USART_InitStructure.USART_StopBits = USART_StopBits_1;	/* 停止位:1個停止位 */
	USART_InitStructure.USART_Parity = USART_Parity_No;	/* 校驗位選擇:不使用校驗 */
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	/* 硬件流控制:不使用硬件流 */
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	/* USART模式控制:同時使能接收和發送 */
	USART_Init(USART1, &USART_InitStructure);	/* 完成USART初始化配置 */

	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);		/* 使能串口接收中斷 */
	
	USART_Cmd(USART1, ENABLE);		/* 使能串口 */

	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
}

/*
************************************************************
*	函數名稱:	Usart1_Init
*
*	函數功能:	串口1初始化
*
*	入口參數:	baud:設定的波特率
*
*	返回參數:	無
*
*	說明:		TX-PA2		RX-PA13
************************************************************
*/
void Usart2_Init(unsigned int baud)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
		
	RCC_AHB1PeriphClockCmd(USART2_RX_GPIO_CLK|USART2_TX_GPIO_CLK,ENABLE);
	RCC_APB1PeriphClockCmd(USART2_CLK, ENABLE);		/* 使能 USART 時鐘 */
  
	GPIO_PinAFConfig(USART2_TX_GPIO_PORT,USART2_TX_SOURCE,USART2_TX_AF);
	GPIO_PinAFConfig(USART2_RX_GPIO_PORT,USART2_RX_SOURCE,USART2_RX_AF);
	
	/* GPIO初始化 */
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;		/* 配置Tx引腳爲複用功能  */
	GPIO_InitStructure.GPIO_Pin = USART2_TX_PIN|USART2_RX_PIN;  
	GPIO_Init(GPIOA, &GPIO_InitStructure);

 
  

	/* 配置串USART1 模式 */
	USART_InitStructure.USART_BaudRate = baud;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;	/* 字長(數據位+校驗位):8 */
	USART_InitStructure.USART_StopBits = USART_StopBits_1;	/* 停止位:1個停止位 */
	USART_InitStructure.USART_Parity = USART_Parity_No;	/* 校驗位選擇:不使用校驗 */
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	/* 硬件流控制:不使用硬件流 */
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	/* USART模式控制:同時使能接收和發送 */
	USART_Init(USART2, &USART_InitStructure);	/* 完成USART初始化配置 */

	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);		/* 使能串口接收中斷 */
	
	USART_Cmd(USART2, ENABLE);		/* 使能串口 */

	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

}


/*
************************************************************
*	函數名稱:	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);
	vsnprintf((char *)UsartPrintfBuf, sizeof(UsartPrintfBuf), fmt, ap);							//格式化
	va_end(ap);
	
	while(*pStr != 0)
	{
		USART_SendData(USARTx, *pStr++);
		while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
	}

}

/*
************************************************************
*	函數名稱:	USART1_IRQHandler
*
*	函數功能:	串口1收發中斷
*
*	入口參數:	無
*
*	返回參數:	無
*
*	說明:		
************************************************************
*/
void USART1_IRQHandler(void)
{

	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷
	{
		USART_ClearFlag(USART1, USART_FLAG_RXNE);
	}

}


usart.h


#ifndef __DEBUG_USART_H
#define	__DEBUG_USART_H

#include "stm32f4xx.h"
#include <stdio.h>


//USART1引腳定義
/*******************************************************/
#define USART_DEBUG						   USART1
#define USART1_CLK                         RCC_APB2Periph_USART1

#define USART1_RX_GPIO_PORT                GPIOA
#define USART1_RX_GPIO_CLK                 RCC_AHB1Periph_GPIOA
#define USART1_RX_PIN                      GPIO_Pin_10
#define USART1_RX_AF                       GPIO_AF_USART1
#define USART1_RX_SOURCE                   GPIO_PinSource10

#define USART1_TX_GPIO_PORT                GPIOA
#define USART1_TX_GPIO_CLK                 RCC_AHB1Periph_GPIOA
#define USART1_TX_PIN                      GPIO_Pin_9
#define USART1_TX_AF                       GPIO_AF_USART1
#define USART1_TX_SOURCE                   GPIO_PinSource9

/************************************************************/

//USART1引腳定義
/*******************************************************/
#define USART2_CLK                         RCC_APB1Periph_USART2

#define USART2_RX_GPIO_PORT                GPIOA
#define USART2_RX_GPIO_CLK                 RCC_AHB1Periph_GPIOA
#define USART2_RX_PIN                      GPIO_Pin_3
#define USART2_RX_AF                       GPIO_AF_USART2
#define USART2_RX_SOURCE                   GPIO_PinSource3

#define USART2_TX_GPIO_PORT                GPIOA
#define USART2_TX_GPIO_CLK                 RCC_AHB1Periph_GPIOA
#define USART2_TX_PIN                      GPIO_Pin_2
#define USART2_TX_AF                       GPIO_AF_USART2
#define USART2_TX_SOURCE                   GPIO_PinSource2

/************************************************************/

void Usart1_Init(unsigned int baud);
void Usart2_Init(unsigned int baud);
void Usart_SendString(USART_TypeDef *USARTx, unsigned char *str, unsigned short len);
void UsartPrintf(USART_TypeDef *USARTx, char *fmt,...);


#endif

2020.3.2補充

	
	/* CPU的小缺陷:串口配置好,如果直接Send,則第1個字節發送不出去
		如下語句解決第1個字節無法正確發送出去的問題 
		初始化函數末尾加入此條函數  			*/
	USART_ClearFlag(USART1, USART_FLAG_TC);     /* 清發送完成標誌,Transmission Complete flag */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章