版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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