STM32之USART初始化代码

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lzw508170827/article/details/101913806

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);
	
	UsartPrintf(USART_DEBUG,"\r\nUsart1 is ok!\r\n");
}

/*
************************************************************
*	函数名称:	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);

	UsartPrintf(USART_DEBUG,"\r\nUsart2 is ok!\r\n");
}


/*
************************************************************
*	函数名称:	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

猜你喜欢

转载自blog.csdn.net/lzw508170827/article/details/101913806