野火F1开发板STM32-USART使用

简介: 野火F1开发板STM32-USART使用

野火F1开发板STM32-USART使用

硬件平台

  1. 野火STM32F103ZET6 霸道V2开发板
  2. 正点原子F1开发板
  3. STM32蓝色板
    在这里插入图片描述

软件平台

  1. Keil MDK 5.31
  2. 串口调试助手

    串口配置步骤

  3. 使能RX和TX引脚GPIO时钟和USART时钟;
  4. 初始化 GPIO,并将GPIO复用到USART.上;
  5. 配置 USART参数;
  6. 配置中断控制器并使能USART接收中断;
  7. 使 能USART;
  8. 在USART接收中断服务函数实现数据接收和发送。

    工程模板结构

    在这里插入图片描述
    文件夹 STExtend外设扩展文件,USER用户自定义函数库
    工程文件下载链接https://download.csdn.net/download/weixin_43599390/12909901
    //bsp_xx.h板载第三方库文件
    #include "stm32f10x.h"
    #include "bsp_led.h"  
    #include "bsp_key.h" 
    #include "bsp_beep.h"
    #include "bsp_exit.h"
    #include "timer.h"
    #include "bsp_ili9341_lcd.h"
    #include "bsp_SysTick.h"
    #include "bsp_usart.h"
    #include <stdio.h>
    #include "bsp_test.h"
    #include "STM32F103xxxx_USART.H"
    

STM32F103ZET6 串口引脚列表

在这里插入图片描述

STM32F103xxxx_USART.C

//==================================================================================================                                  // 包含全局头文件
#include"STM32F103xxxx_USART.H"                     // 包含内设头文件 USART-USART通信总线

//--------------------------------------------------------------------------------------------------
//  宏自定义声明    |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//--------------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------------
//  定义引用变量    |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//--------------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------------
//  硬件端口定义    |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//--------------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------------
//  引用函数声明    |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//--------------------------------------------------------------------------------------------------
void USART_Configure(void);
void USART_SendChar(USART_TypeDef* USARTx, unsigned char Char);
unsigned char USART_ReceiveChar(USART_TypeDef* USARTx);
void USART_SendString(USART_TypeDef* USARTx, unsigned char *String);
void USART_SendArray(USART_TypeDef* USARTx, unsigned char *Array, unsigned char Count);
void USART_SendLine(USART_TypeDef* USARTx);
void USART_SendNumber_SignedInteger(USART_TypeDef* USARTx, signed short int Number, unsigned char Count);
void USART_SendNumber_UnsignedInteger(USART_TypeDef* USARTx, unsigned short int Number, unsigned char Count);
void USART_SendNumber_Float(USART_TypeDef* USARTx, float Number, unsigned char Count1, unsigned char Count2);

//==================================================================================================
//  函数功能: USART 发送字节
//  函数标记: 内设驱动函数
//  函数说明: 本函数没有考虑发送9位数据可能性
//--------------------------------------------------------------------------------------------------
//  输入参量: USARTx - 通道号  取值范围 - USARTx1/USARTx2/USARTx3/UARTx4/UARTx5
//            Byte - 字节  取值范文 - ASCII字符
//  输出参量: 无
//--------------------------------------------------------------------------------------------------
//  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//==================================================================================================
void USART_SendChar(USART_TypeDef* USARTx, unsigned char Char)
{
   
   
    while((USARTx -> SR & 0x40) == 0);              // 等待上次发送完成   
    USARTx -> DR = Char;                            // 装载本次发送数据    
}

//==================================================================================================
//  函数功能: USART 接收字符
//  函数标记: 内设驱动函数
//  函数说明: 
//--------------------------------------------------------------------------------------------------
//  输入参量: USARTx - 通道号  取值范围 - USARTx1/USARTx2/USARTx3/UARTx4/UARTx5
//  输出参量: Char - 待接收字节  取值范围 - ASCII字符
//--------------------------------------------------------------------------------------------------
//  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//==================================================================================================
unsigned char USART_ReceiveChar(USART_TypeDef* USARTx)
{
   
   
    return USARTx->DR;
}

//==================================================================================================
//  函数功能: USART 发送字符串
//  函数标记: 内设驱动函数
//  函数说明: 无
//--------------------------------------------------------------------------------------------------
//  输入参量: USARTx - 通道号  取值范围 - USARTx1/USARTx2/USARTx3/UARTx4/UARTx5
//            String - 待发送字符串指针  取值范文 - ASCII字符串
//  输出参量: 无
//--------------------------------------------------------------------------------------------------
//  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//==================================================================================================
void USART_SendString(USART_TypeDef* USARTx,unsigned char *String)
{
   
   
    while(*String != '\0')                          // \0 表示字符串结束标志,通过检测是否字符串末尾
    {
   
   
        USART_SendChar(USARTx, *String);
        String++;
    }
}

//==================================================================================================
//  函数功能: USART 发送数组
//  函数标记: 内设驱动函数
//  函数说明: 无
//--------------------------------------------------------------------------------------------------
//  输入参量: USARTx - 通道号  取值范围 - USARTx1/USARTx2/USARTx3/UARTx4/UARTx5
//            Array - 待发送数组的指针  取值范围 - 指针类型
//            Count - 待发送数组的数量  取值范围 - 0~255
//  输出参量: 无
//--------------------------------------------------------------------------------------------------
//  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//==================================================================================================
void USART_SendArray(USART_TypeDef* USARTx, unsigned char *Array, unsigned char Count)
{
   
   
    unsigned char i = 0;                            // 定义局部变量 用于函数循环
    for(i=0; i<Count; i++)
    {
   
   
        USART_SendChar(USARTx, Array[i]);    
    }
}

//==================================================================================================
//  函数功能: USART 发送回车换行
//  函数标记: 内设驱动函数
//  函数说明: 无
//--------------------------------------------------------------------------------------------------
//  输入参量: USARTx - 通道号  取值范围 - USARTx1/USARTx2/USARTx3/UARTx4/UARTx5
//  输出参量: 无
//--------------------------------------------------------------------------------------------------
//  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//==================================================================================================
void USART_SendLine(USART_TypeDef* USARTx)
{
   
   
    USART_SendChar(USARTx, 0x0D);                   // 换行
    USART_SendChar(USARTx, 0x0A);                   // 回车
}

//==================================================================================================
//  函数功能: USART 发送有符号整型数字
//  函数标记: 内设驱动函数
//  函数说明: 无
//--------------------------------------------------------------------------------------------------
//  输入参量: USARTx - 通道号  取值范围 - USARTx1/USARTx2/USARTx3/UARTx4/UARTx5
//            Number - 待发送整数  取值范围 - 整型类型 -99999~+99999
//            Count - 显示的位数  取值范围 - 1~5
//  输出参量: 无
//--------------------------------------------------------------------------------------------------
//  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//==================================================================================================
void USART_SendNumber_SignedInteger(USART_TypeDef* USARTx, signed short int Number, unsigned char Count)
{
   
   
    unsigned char NumberArray[5] = {
   
   0};             // 定义局部数组,用于数据存储

    // 判断 整型数字正负
    if(Number<0)
    {
   
   
        Number = 0 - Number;                        // 负数转整数
        USART_SendChar(USARTx,'-');
    }
    else
    {
   
   
        USART_SendChar(USARTx,'+');
    }

    // 计算各位数值的字符
    if(Count>4) NumberArray[0]=(Number/10000) % 10 + 0x30; 
    if(Count>3) NumberArray[1]=(Number/1000 ) % 10 + 0x30; 
    if(Count>2) NumberArray[2]=(Number/100  ) % 10 + 0x30; 
    if(Count>1) NumberArray[3]=(Number/10   ) % 10 + 0x30; 
    if(Count>0) NumberArray[4]=(Number/1    ) % 10 + 0x30; 

    // 发送串口数据
    USART_SendArray(USARTx,&NumberArray[5-Count],Count);
}

//==================================================================================================
//  函数功能: USART 发送无符号整型数字
//  函数标记: 内设驱动函数
//  函数说明: 无
//--------------------------------------------------------------------------------------------------
//  输入参量: USARTx - 通道号  取值范围 - USARTx1/USARTx2/USARTx3/UARTx4/UARTx5
//            Number - 待发送整数  取值范围 - 整型类型 0~99999
//            Count - 显示的位数  取值范围 - 1~5
//  输出参量: 无
//--------------------------------------------------------------------------------------------------
//  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//==================================================================================================
void USART_SendNumber_UnsignedInteger(USART_TypeDef* USARTx, unsigned short int Number, unsigned char Count)
{
   
   
    unsigned char NumberArray[5] = {
   
   0};             // 定义局部数组,用于数据存储

    // 断言检查参数


    // 执行相关操作
    // 计算各位数值的字符
    if(Count>4) NumberArray[0]=(Number/10000) % 10 + 0x30;
    if(Count>3) NumberArray[1]=(Number/1000 ) % 10 + 0x30;
    if(Count>2) NumberArray[2]=(Number/100  ) % 10 + 0x30;
    if(Count>1) NumberArray[3]=(Number/10   ) % 10 + 0x30;
    if(Count>0) NumberArray[4]=(Number/1    ) % 10 + 0x30;

    // 发送串口数据
    USART_SendArray(USARTx,&NumberArray[5-Count],Count);
}

//==================================================================================================
//  函数功能: USART 发送数字 浮点类型
//  函数标记: 内设驱动函数
//  函数说明: 本函数打印浮点数字与实际输入数字存在偏差
//--------------------------------------------------------------------------------------------------
//  输入参量: USARTx - 通道号  取值范围 - USARTx1/USARTx2/USARTx3/UARTx4/UARTx5
//            Number - 待发送浮点型数字  取值范围 - -99999.99999~99999.99999
//            Count1 - 整数显示位数  取值范围 - 0~5
//            Count2 - 小数显示位数  取值范围 - 0~5
//  输出参量: 无
//--------------------------------------------------------------------------------------------------
//  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//==================================================================================================
void USART_SendNumber_Float(USART_TypeDef* USARTx, float Number, unsigned char Count1, unsigned char Count2)
{
   
   
    unsigned char Number_Integer_Array[5];          // 定义局部数组 用于存储整数位各位数据
    unsigned char Number_Decimal_Array[5];          // 定义局部数组 用于存储小数位各位数据

    unsigned long int  Number_Integer = 0;          // 定义局部变量 表示浮点数的整数部分
    unsigned long int  Number_Decimal = 0;          // 定义局部变量 表示浮点数的小数部分

    // 判断 浮点数字正负
    if(Number < 0)
    {
   
   
        Number = 0 - Number;
        USART_SendChar(USARTx, '-');
    }
    else
    {
   
   
        USART_SendChar(USARTx, '+');
    }

    // 限制 发送位数
    // 由于由于float型的有效十进制数值最多为7位,即整数位 + 小数位 数量一定小于等于7
    while((Count1 + Count2 > 7 ))
    {
   
   
        if((Count1 > 5) && (Count1 != 0))
        {
   
   
            --Count1;
        }
        else
        {
   
   
            --Count2;
        }
    }

    // 分离 整数位与小数位
    // 取整数部分
    Number_Integer = (unsigned long int)(Number);  
    // 取小数部分 1e5科学计数法表示10000
    Number_Decimal = (unsigned long int)((Number - Number_Integer + 0.000005) * 1e5);

    // 计算各位数值的字符
    if(Count1>4) Number_Integer_Array[0]=(Number_Integer/10000) % 10 + 0x30; 
    if(Count1>3) Number_Integer_Array[1]=(Number_Integer/1000 ) % 10 + 0x30; 
    if(Count1>2) Number_Integer_Array[2]=(Number_Integer/100  ) % 10 + 0x30; 
    if(Count1>1) Number_Integer_Array[3]=(Number_Integer/10   ) % 10 + 0x30; 
    if(Count1>0) Number_Integer_Array[4]=(Number_Integer/1    ) % 10 + 0x30; 

    if(Count2>0) Number_Decimal_Array[0]=(Number_Decimal/10000) % 10 + 0x30; 
    if(Count2>1) Number_Decimal_Array[1]=(Number_Decimal/1000 ) % 10 + 0x30; 
    if(Count2>2) Number_Decimal_Array[2]=(Number_Decimal/100  ) % 10 + 0x30; 
    if(Count2>3) Number_Decimal_Array[3]=(Number_Decimal/10   ) % 10 + 0x30; 
    if(Count2>4) Number_Decimal_Array[4]=(Number_Decimal/1    ) % 10 + 0x30; 

    USART_SendArray(USARTx, &Number_Integer_Array[5-Count1], Count1);       // 显示整数位
    USART_SendChar(USARTx, '.');
    USART_SendArray(USARTx, &Number_Decimal_Array[0],        Count2);       // 显示小数位
}

//==================================================================================================
//  函数功能: USART 发送数字 二进制数字
//  函数标记: 内设驱动函数
//  函数说明: 无
//--------------------------------------------------------------------------------------------------
//  输入参量: USARTx - 通道号  取值范围 - USARTx1/USARTx2/USARTx3/UARTx4/UARTx5
//            Number - 待发送有符号长整型数字  取值范围 - -99999.99999~99999.99999
//            Count - 整数显示位数  取值范围 - 0~5
//  输出参量: 无
//--------------------------------------------------------------------------------------------------
//  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//==================================================================================================
void USART_SendNumber_Binary(USART_TypeDef* USARTx,int Number,unsigned char Count)
{
   
   
    unsigned char i = 0;

    for(i=Count; i>0; i--)
    {
   
   
        if(Number & ( 1 << (Count-1) ))
        {
   
   
            USART_SendChar(USARTx,'1');
        }
        else
        {
   
   
            USART_SendChar(USARTx,'0');
        }
        Number <<= 1;
    }
}

//==================================================================================================
//  函数功能: USART 预配置
//  函数标记: 内设驱动函数
//  函数说明: 无
//--------------------------------------------------------------------------------------------------
//  输入参量: 无
//  输出参量: 无
//--------------------------------------------------------------------------------------------------
//  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9
//==================================================================================================
void USART_Configure(void)
{
   
   

    USART_InitTypeDef USART_InitStructure_USARTx1; 
    //----------------------------------------------------------------------------------------------
    // 配置 USARTx1 功能
    //----------------------------------------------------------------------------------------------
    #if (STM32F103xxxx_USARTx1 == 1)
    {
   
   
        // 参数检查
        #if ((STM32F103xxxx_USARTx1_BAUD != 600)   \
        &&   (STM32F103xxxx_USARTx1_BAUD != 1200)  \
        &&   (STM32F103xxxx_USARTx1_BAUD != 2400)  \
        &&   (STM32F103xxxx_USARTx1_BAUD != 4800)  \
        &&   (STM32F103xxxx_USARTx1_BAUD != 9600)  \
        &&   (STM32F103xxxx_USARTx1_BAUD != 14400) \
        &&   (STM32F103xxxx_USARTx1_BAUD != 19200) \
        &&   (STM32F103xxxx_USARTx1_BAUD != 38400) \
        &&   (STM32F103xxxx_USARTx1_BAUD != 115200))
        {
   
   
            #error "There are errors in the STM32F103xxxx_USARTx1_BAUD"
        }
        #endif  // #if ((STM32F103xxxx_USARTx1_BAUD != 600)   \
                   &&   (STM32F103xxxx_USARTx1_BAUD != 1200)  \
                   &&   (STM32F103xxxx_USARTx1_BAUD != 2400)  \
                   &&   (STM32F103xxxx_USARTx1_BAUD != 4800)  \
                   &&   (STM32F103xxxx_USARTx1_BAUD != 9600)  \
                   &&   (STM32F103xxxx_USARTx1_BAUD != 14400) \
                   &&   (STM32F103xxxx_USARTx1_BAUD != 19200) \
                   &&   (STM32F103xxxx_USARTx1_BAUD != 38400) \
                   &&   (STM32F103xxxx_USARTx1_BAUD != 115200))

        #if ((STM32F103xxxx_USARTx1_PORT_A09A10 + STM32F103xxxx_USARTx1_PORT_B06B07) != 1)
        {
   
   
            #error "There are errors in the STM32F103xxxx_USARTx1_PORT"
        }
        #endif  // #if ((STM32F103xxxx_USARTx1_PORT_A09A10 + STM32F103xxxx_USARTx1_PORT_B06B07) != 1)

        // 配置GPIO引脚映射功能
        #if (STM32F103xxxx_USARTx1_PORT_A09A10 == 1)                // 不映射
        {
   
   
        }
        #endif  // #if (STM32F103xxxx_USARTx1_PORT_A09A10 == 1)
        #if (STM32F103xxxx_USARTx1_PORT_B06B07 == 1)                // 完全映射
        {
   
   
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
            GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
        }
        #endif  // #if (STM32F103xxxx_USARTx1_PORT_B06B07 == 1)

        // 配置GPIO TXD引脚
        #if (STM32F103xxxx_USARTx1_PORT_A09A10 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_USARTx1_TxD;                    // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);               // 使能GPIOA模块时钟

            GPIO_InitStructure_USARTx1_TxD.GPIO_Pin   = GPIO_Pin_9;             // 设置GPIO引脚号
            GPIO_InitStructure_USARTx1_TxD.GPIO_Speed = GPIO_Speed_50MHz;       // 设置GPIO引脚速率
            GPIO_InitStructure_USARTx1_TxD.GPIO_Mode  = GPIO_Mode_AF_PP;        // 设置GPIO引脚输出类型 推挽输出类型
            GPIO_Init(GPIOA, &GPIO_InitStructure_USARTx1_TxD);                  // 初始化结构体
        }
        #endif  // #if (STM32F103xxxx_USARTx1_PORT_A09A10 == 1)

        #if (STM32F103xxxx_USARTx1_PORT_B06B07 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_USARTx1_TxD;                    // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);               // 使能GPIOB模块时钟

            GPIO_InitStructure_USARTx1_TxD.GPIO_Pin   = GPIO_Pin_6;             // 设置GPIO引脚号
            GPIO_InitStructure_USARTx1_TxD.GPIO_Speed = GPIO_Speed_50MHz;       // 设置GPIO引脚速率
            GPIO_InitStructure_USARTx1_TxD.GPIO_Mode  = GPIO_Mode_AF_PP;        // 设置GPIO引脚输出类型 推挽输出类型
            GPIO_Init(GPIOB, &GPIO_InitStructure_USARTx1_TxD);                  // 初始化结构体
        }
        #endif  // #if (STM32F103xxxx_USARTx1_PORT_B06B07 == 1) 

        // 配置GPIO RXD引脚
        #if (STM32F103xxxx_USARTx1_PORT_A09A10 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_USARTx1_RxD;                    // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);               // 使能GPIOA模块时钟

            GPIO_InitStructure_USARTx1_RxD.GPIO_Pin   = GPIO_Pin_10;            // 设置GPIO引脚号
            GPIO_InitStructure_USARTx1_RxD.GPIO_Speed = GPIO_Speed_50MHz;       // 设置GPIO引脚速率
            GPIO_InitStructure_USARTx1_RxD.GPIO_Mode  = GPIO_Mode_IN_FLOATING;  // 设置GPIO引脚输出类型 浮空输入类型
            GPIO_Init(GPIOA, &GPIO_InitStructure_USARTx1_RxD);                  // 初始化结构体
        }
        #endif  // #if (STM32F103xxxx_USARTx1_PORT_A09A10 == 1)

        #if (STM32F103xxxx_USARTx1_PORT_B06B07 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_USARTx1_RxD;                    // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);               // 使能GPIOB模块时钟

            GPIO_InitStructure_USARTx1_RxD.GPIO_Pin   = GPIO_Pin_7;             // 设置GPIO引脚号
            GPIO_InitStructure_USARTx1_RxD.GPIO_Speed = GPIO_Speed_50MHz;       // 设置GPIO引脚速率
            GPIO_InitStructure_USARTx1_RxD.GPIO_Mode  = GPIO_Mode_IN_FLOATING;  // 设置GPIO引脚输出类型 浮空输入类型
            GPIO_Init(GPIOB, &GPIO_InitStructure_USARTx1_RxD);                  // 初始化结构体
        }
        #endif  // #if (STM32F103xxxx_USARTx1_PORT_B06B07 == 1) 

        // 配置 USARTx1 功能
       // USART_InitTypeDef USART_InitStructure_USARTx1;                                          // 定义结构体变量

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);                                  // 使能USART1模块时钟

        USART_DeInit(USART1);

        USART_InitStructure_USARTx1.USART_BaudRate   = STM32F103xxxx_USARTx1_BAUD;              // 设置USART波特率
        USART_InitStructure_USARTx1.USART_WordLength = USART_WordLength_8b;                     // 设置USART数据位长度 8位数据位
        USART_InitStructure_USARTx1.USART_StopBits   = USART_StopBits_1;                        // 设置USART停止位长度 1位停止位
        USART_InitStructure_USARTx1.USART_Parity     = USART_Parity_No;                         // 设置USART校验位长度 无校验
        USART_InitStructure_USARTx1.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 设置USART硬件数据流控制
        USART_InitStructure_USARTx1.USART_Mode       = USART_Mode_Rx | USART_Mode_Tx;           // 设置USART模式 发送模式+接收模式
        USART_Init(USART1, &USART_InitStructure_USARTx1);                                       // 初始化结构体
        USART_Cmd(USART1, ENABLE);                                                              // 使能USART1模块运行

        // 配置 USARTx1 中断操作
        #if (STM32F103xxxx_USARTx1_ITEN_RXNE == 1)
        {
   
   
            USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);      // 启用USARTx1接受中断
        }
        #endif  // #if (STM32F103xxxx_USARTx1_ITEN_RXNE == 1)

        #if (STM32F103xxxx_USARTx1_ITEN_IDLE == 1)              
        {
   
   
            USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);      // 启用USARTx1空闲中断
        }
        #endif  // #if (STM32F103xxxx_USARTx1_ITEN_IDLE == 1)

        #if (STM32F103xxxx_USARTx1_ITEN_TC == 1)
        {
   
   
            USART_ITConfig(USART1, USART_IT_TC, ENABLE);        // 启用USARTx1发送完成中断
        }
        #endif  // #if (STM32F103xxxx_USARTx1_ITEN_TC == 1)

        // 配置 USARTx1 DMA操作
        #if (STM32F103xxxx_USARTx1_DMA_TX == 1)
        {
   
   
            USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);      // 启用USARTx1 DMA发送
        }
        #endif  // #if (STM32F103xxxx_USARTx1_DMA_TX == 1)

        #if (STM32F103xxxx_USARTx1_DMA_RX == 1)
        {
   
   
            USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);      // 启用USARTx1 DMA接收
        }
        #endif  // #if (STM32F103xxxx_USARTx1_DMA_RX == 1)
    }
    #endif  // #if (STM32F103xxxx_USARTx1 == 1)

    //----------------------------------------------------------------------------------------------
    // 配置 USARTx2 功能
    //----------------------------------------------------------------------------------------------
    #if (STM32F103xxxx_USARTx2 == 1)
    {
   
   
        // 参数检查
        #if ((STM32F103xxxx_USARTx2_BAUD != 600)   \
        &&   (STM32F103xxxx_USARTx2_BAUD != 1200)  \
        &&   (STM32F103xxxx_USARTx2_BAUD != 2400)  \
        &&   (STM32F103xxxx_USARTx2_BAUD != 4800)  \
        &&   (STM32F103xxxx_USARTx2_BAUD != 9600)  \
        &&   (STM32F103xxxx_USARTx2_BAUD != 14400) \
        &&   (STM32F103xxxx_USARTx2_BAUD != 19200) \
        &&   (STM32F103xxxx_USARTx2_BAUD != 38400) \
        &&   (STM32F103xxxx_USARTx2_BAUD != 115200))
        {
   
   
            #error "There are errors in the STM32F103xxxx_USARTx2_BAUD"
        }
        #endif  // #if ((STM32F103xxxx_USARTx2_BAUD != 600)   \
                   &&   (STM32F103xxxx_USARTx2_BAUD != 1200)  \
                   &&   (STM32F103xxxx_USARTx2_BAUD != 2400)  \
                   &&   (STM32F103xxxx_USARTx2_BAUD != 4800)  \
                   &&   (STM32F103xxxx_USARTx2_BAUD != 9600)  \
                   &&   (STM32F103xxxx_USARTx2_BAUD != 14400) \
                   &&   (STM32F103xxxx_USARTx2_BAUD != 19200) \
                   &&   (STM32F103xxxx_USARTx2_BAUD != 38400) \
                   &&   (STM32F103xxxx_USARTx2_BAUD != 115200))

        #if ((STM32F103xxxx_USARTx2_PORT_A02A03 + STM32F103C8T6_USARTx2_PORT_D06D07) != 1)
        {
   
   
            #error "There are errors in the STM32F103xxxx_USARTx2_PORT"
        }
        #endif  // #if ((STM32F103xxxx_USARTx2_PORT_A02A03 + STM32F103C8T6_USARTx2_PORT_D06D07) != 1)

        // 配置GPIO引脚映射功能
        #if (STM32F103xxxx_USARTx2_PORT_A02A03 == 1)                // 不映射
        {
   
   
        }
        #endif  // #if (STM32F103xxxx_USARTx2_PORT_A02A03 == 1)
        #if (STM32F103C8T6_USARTx2_PORT_D06D07 == 1)                // 完全映射
        {
   
   
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
            GPIO_PinRemapConfig(GPIO_FullRemap_USART2, ENABLE);  
        }
        #endif  // #if (STM32F103C8T6_USARTx2_PORT_D06D07 == 1)

        // 配置GPIO TXD引脚
        #if (STM32F103xxxx_USARTx2_PORT_A02A03 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_USARTx2_TxD;                    // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);                // 使能GPIOA模块时钟

            GPIO_InitStructure_USARTx2_TxD.GPIO_Pin   = GPIO_Pin_2;             // 设置GPIO引脚号
            GPIO_InitStructure_USARTx2_TxD.GPIO_Speed = GPIO_Speed_50MHz;       // 设置GPIO引脚速率
            GPIO_InitStructure_USARTx2_TxD.GPIO_Mode  = GPIO_Mode_AF_PP;        // 设置GPIO引脚输出类型 推挽输出类型
            GPIO_Init(GPIOA, &GPIO_InitStructure_USARTx2_TxD);                  // 初始化结构体
        }
        #endif  // #if (STM32F103xxxx_USARTx2_PORT_A02A03 == 1)

        #if (STM32F103C8T6_USARTx2_PORT_D06D07 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_USARTx2_TxD;                    // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);                // 使能GPIOD模块时钟

            GPIO_InitStructure_USARTx2_TxD.GPIO_Pin   = GPIO_Pin_6;             // 设置GPIO引脚号
            GPIO_InitStructure_USARTx2_TxD.GPIO_Speed = GPIO_Speed_50MHz;       // 设置GPIO引脚速率
            GPIO_InitStructure_USARTx2_TxD.GPIO_Mode  = GPIO_Mode_AF_PP;        // 设置GPIO引脚输出类型 推挽输出类型
            GPIO_Init(GPIOD, &GPIO_InitStructure_USARTx2_TxD);                  // 初始化结构体
        }
        #endif  // #if (STM32F103C8T6_USARTx2_PORT_D06D07 == 1) 

        // 配置GPIO RXD引脚
        #if (STM32F103xxxx_USARTx2_PORT_A02A03 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_USARTx2_RxD;                    // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);                // 使能GPIOA模块时钟

            GPIO_InitStructure_USARTx2_RxD.GPIO_Pin   = GPIO_Pin_3;             // 设置GPIO引脚号
            GPIO_InitStructure_USARTx2_RxD.GPIO_Speed = GPIO_Speed_50MHz;       // 设置GPIO引脚速率
            GPIO_InitStructure_USARTx2_RxD.GPIO_Mode  = GPIO_Mode_IN_FLOATING;  // 设置GPIO引脚输出类型 浮空输入类型
            GPIO_Init(GPIOA, &GPIO_InitStructure_USARTx2_RxD);                  // 初始化结构体
        }
        #endif  // #if (STM32F103xxxx_USARTx2_PORT_A02A03 == 1)

        #if (STM32F103C8T6_USARTx2_PORT_D06D07 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_USARTx2_RxD;                    // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);                // 使能GPIOD模块时钟

            GPIO_InitStructure_USARTx2_RxD.GPIO_Pin   = GPIO_Pin_7;             // 设置GPIO引脚号
            GPIO_InitStructure_USARTx2_RxD.GPIO_Speed = GPIO_Speed_50MHz;       // 设置GPIO引脚速率
            GPIO_InitStructure_USARTx2_RxD.GPIO_Mode  = GPIO_Mode_IN_FLOATING;  // 设置GPIO引脚输出类型 浮空输入类型
            GPIO_Init(GPIOD, &GPIO_InitStructure_USARTx2_RxD);                  // 初始化结构体
        }
        #endif  // #if (STM32F103C8T6_USARTx2_PORT_D06D07 == 1) 

        // 配置 USARTx2 功能
        USART_InitTypeDef USART_InitStructure_USARTx2;                                          // 定义结构体变量

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);                                  // 使能USART2模块时钟

        USART_DeInit(USART2);

        USART_InitStructure_USARTx2.USART_BaudRate   = STM32F103xxxx_USARTx2_BAUD;              // 设置USART波特率
        USART_InitStructure_USARTx2.USART_WordLength = USART_WordLength_8b;                     // 设置USART数据位长度 8位数据位
        USART_InitStructure_USARTx2.USART_StopBits   = USART_StopBits_1;                        // 设置USART停止位长度 1位停止位
        USART_InitStructure_USARTx2.USART_Parity     = USART_Parity_No;                         // 设置USART校验位长度 无校验
        USART_InitStructure_USARTx2.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 设置USART硬件数据流控制
        USART_InitStructure_USARTx2.USART_Mode       = USART_Mode_Rx | USART_Mode_Tx;           // 设置USART模式 发送模式+接收模式
        USART_Init(USART2, &USART_InitStructure_USARTx2);                                       // 初始化结构体
        USART_Cmd(USART2, ENABLE);                                                              // 使能USART2模块运行

        // 配置 USARTx2 中断操作
        #if (STM32F103xxxx_USARTx2_ITEN_RXNE == 1)
        {
   
   
            USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);      // 启用USARTx2接受中断
        }
        #endif  // #if (STM32F103xxxx_USARTx2_ITEN_RXNE == 1)

        #if (STM32F103xxxx_USARTx2_ITEN_IDLE == 1)              
        {
   
   
            USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);      // 启用USARTx2空闲中断
        }
        #endif  // #if (STM32F103xxxx_USARTx2_ITEN_IDLE == 1)

        #if (STM32F103xxxx_USARTx2_ITEN_TC == 1)
        {
   
   
            USART_ITConfig(USART2, USART_IT_TC, ENABLE);        // 启用USARTx2发送完成中断
        }
        #endif  // #if (STM32F103xxxx_USARTx2_ITEN_TC == 1)

        // 配置 USARTx2 DMA操作
        #if (STM32F103xxxx_USARTx2_DMA_TX == 1)
        {
   
   
            USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);      // 启用USARTx2 DMA发送
        }
        #endif  // #if (STM32F103xxxx_USARTx2_DMA_TX == 1)

        #if (STM32F103xxxx_USARTx2_DMA_RX == 1)
        {
   
   
            USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);      // 启用USARTx2 DMA接收
        }
        #endif  // #if (STM32F103xxxx_USARTx2_DMA_RX == 1)
    }
    #endif  // #if (STM32F103xxxx_USARTx1 == 1)

    //----------------------------------------------------------------------------------------------
    // 配置 USARTx3 功能
    //----------------------------------------------------------------------------------------------
    #if (STM32F103xxxx_USARTx3 == 1)  
    {
   
   
        // 参数检查
        #if ((STM32F103xxxx_USARTx3_BAUD != 600)   \
        &&   (STM32F103xxxx_USARTx3_BAUD != 1200)  \
        &&   (STM32F103xxxx_USARTx3_BAUD != 2400)  \
        &&   (STM32F103xxxx_USARTx3_BAUD != 4800)  \
        &&   (STM32F103xxxx_USARTx3_BAUD != 9600)  \
        &&   (STM32F103xxxx_USARTx3_BAUD != 14400) \
        &&   (STM32F103xxxx_USARTx3_BAUD != 19200) \
        &&   (STM32F103xxxx_USARTx3_BAUD != 38400) \
        &&   (STM32F103xxxx_USARTx3_BAUD != 115200))
        {
   
   
            #error "There are errors in the STM32F103xxxx_USARTx3_BAUD"
        }
        #endif  // #if ((STM32F103xxxx_USARTx3_BAUD != 600)   \
                   &&   (STM32F103xxxx_USARTx3_BAUD != 1200)  \
                   &&   (STM32F103xxxx_USARTx3_BAUD != 2400)  \
                   &&   (STM32F103xxxx_USARTx3_BAUD != 4800)  \
                   &&   (STM32F103xxxx_USARTx3_BAUD != 9600)  \
                   &&   (STM32F103xxxx_USARTx3_BAUD != 14400) \
                   &&   (STM32F103xxxx_USARTx3_BAUD != 19200) \
                   &&   (STM32F103xxxx_USARTx3_BAUD != 38400) \
                   &&   (STM32F103xxxx_USARTx3_BAUD != 115200))

        #if ((STM32F103xxxx_USARTx3_PORT_B10B11 + STM32F103xxxx_USARTx3_PORT_C10C11 + STM32F103xxxx_USARTx3_PORT_D08D09) != 1)
        {
   
   
            #error "There are errors in the STM32F103xxxx_USARTx3_PORT"
        }
        #endif  // #if ((STM32F103xxxx_USARTx3_PORT_B10B11 + STM32F103xxxx_USARTx3_PORT_C10C11 + STM32F103xxxx_USARTx3_PORT_D08D09) != 1)

        // 配置GPIO引脚映射功能
        #if (STM32F103xxxx_USARTx3_PORT_B10B11 == 1)                // 不映射
        {
   
   
        }
        #endif  // #if (STM32F103xxxx_USARTx3_PORT_B10B11 == 1)
        #if (STM32F103xxxx_USARTx3_PORT_C10C11 == 1)                // 部分映射
        {
   
   
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
            GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE); 
        }
        #endif  // #if (STM32F103xxxx_USARTx3_PORT_C10C11 == 1)
        #if (STM32F103xxxx_USARTx3_PORT_D08D09 == 1)                // 完全映射
        {
   
   
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
            GPIO_PinRemapConfig(GPIO_FullRemap_USART3, ENABLE);  
        }
        #endif  // #if (STM32F103xxxx_USARTx3_PORT_D08D09 == 1)

        // 配置GPIO TXD引脚
        #if (STM32F103xxxx_USARTx3_PORT_B10B11 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_USARTx3_TXD;                    // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);               // 使能GPIOB模块时钟

            GPIO_InitStructure_USARTx3_TXD.GPIO_Pin   = GPIO_Pin_10;            // 设置GPIO引脚号
            GPIO_InitStructure_USARTx3_TXD.GPIO_Speed = GPIO_Speed_50MHz;       // 设置GPIO引脚速率
            GPIO_InitStructure_USARTx3_TXD.GPIO_Mode  = GPIO_Mode_AF_PP;        // 设置GPIO引脚输出类型 推挽输出类型
            GPIO_Init(GPIOB, &GPIO_InitStructure_USARTx3_TXD);                  // 初始化结构体
        }
        #endif  // #if (STM32F103xxxx_USARTx3_PORT_B10B11 == 1)
        #if (STM32F103xxxx_USARTx3_PORT_C10C11 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_USARTx3_TXD;                    // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);               // 使能GPIOC模块时钟

            GPIO_InitStructure_USARTx3_TXD.GPIO_Pin   = GPIO_Pin_10;            // 设置GPIO引脚号
            GPIO_InitStructure_USARTx3_TXD.GPIO_Speed = GPIO_Speed_50MHz;       // 设置GPIO引脚速率
            GPIO_InitStructure_USARTx3_TXD.GPIO_Mode  = GPIO_Mode_AF_PP;        // 设置GPIO引脚输出类型 推挽输出类型
            GPIO_Init(GPIOC, &GPIO_InitStructure_USARTx3_TXD);                  // 初始化结构体
        }
        #endif  // #if (STM32F103xxxx_USARTx3_PORT_C10C11 == 1)
        #if (STM32F103xxxx_USARTx3_PORT_D08D09 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_USARTx3_TXD;                    // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);               // 使能GPIOD模块时钟

            GPIO_InitStructure_USARTx3_TXD.GPIO_Pin   = GPIO_Pin_8;             // 设置GPIO引脚号
            GPIO_InitStructure_USARTx3_TXD.GPIO_Speed = GPIO_Speed_50MHz;       // 设置GPIO引脚速率
            GPIO_InitStructure_USARTx3_TXD.GPIO_Mode  = GPIO_Mode_AF_PP;        // 设置GPIO引脚输出类型 推挽输出类型
            GPIO_Init(GPIOD, &GPIO_InitStructure_USARTx3_TXD);                  // 初始化结构体
        }
        #endif  // #if (STM32F103xxxx_USARTx3_PORT_D08D09 == 1)

        // 配置GPIO RXD引脚
        #if (STM32F103xxxx_USARTx3_PORT_B10B11 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_USARTx3_RXD;                    // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);               // 使能GPIOB模块时钟

            GPIO_InitStructure_USARTx3_RXD.GPIO_Pin   = GPIO_Pin_11;            // 设置GPIO引脚号
            GPIO_InitStructure_USARTx3_RXD.GPIO_Speed = GPIO_Speed_50MHz;       // 设置GPIO引脚速率
            GPIO_InitStructure_USARTx3_RXD.GPIO_Mode  = GPIO_Mode_IN_FLOATING;  // 设置GPIO引脚输出类型 浮空输入类型
            GPIO_Init(GPIOB, &GPIO_InitStructure_USARTx3_RXD);                  // 初始化结构体
        }
        #endif  // #if (STM32F103xxxx_USARTx3_PORT_B10B11 == 1)
        #if (STM32F103xxxx_USARTx3_PORT_C10C11 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_USARTx3_RXD;                    // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);               // 使能GPIOC模块时钟

            GPIO_InitStructure_USARTx3_RXD.GPIO_Pin   = GPIO_Pin_11;            // 设置GPIO引脚号
            GPIO_InitStructure_USARTx3_RXD.GPIO_Speed = GPIO_Speed_50MHz;       // 设置GPIO引脚速率
            GPIO_InitStructure_USARTx3_RXD.GPIO_Mode  = GPIO_Mode_IN_FLOATING;  // 设置GPIO引脚输出类型 浮空输入类型
            GPIO_Init(GPIOC, &GPIO_InitStructure_USARTx3_RXD);                  // 初始化结构体
        }
        #endif  // #if (STM32F103xxxx_USARTx3_PORT_C10C11 == 1)
        #if (STM32F103xxxx_USARTx3_PORT_D08D09 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_USARTx3_RXD;                    // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);               // 使能GPIOD模块时钟

            GPIO_InitStructure_USARTx3_RXD.GPIO_Pin   = GPIO_Pin_9;             // 设置GPIO引脚号
            GPIO_InitStructure_USARTx3_RXD.GPIO_Speed = GPIO_Speed_50MHz;       // 设置GPIO引脚速率
            GPIO_InitStructure_USARTx3_RXD.GPIO_Mode  = GPIO_Mode_IN_FLOATING;  // 设置GPIO引脚输出类型 浮空输入类型
            GPIO_Init(GPIOD, &GPIO_InitStructure_USARTx3_RXD);                  // 初始化结构体
        }
        #endif  // #if (STM32F103xxxx_USARTx3_PORT_D08D09 == 1)

        // 配置 USARTx3 功能
        USART_InitTypeDef USART_InitStructure_USARTx3;                                          // 定义结构体变量

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);                                  // 使能USART3模块时钟

        USART_DeInit(USART3);

        USART_InitStructure_USARTx3.USART_BaudRate   = STM32F103xxxx_USARTx3_BAUD;              // 设置USART波特率
        USART_InitStructure_USARTx3.USART_WordLength = USART_WordLength_8b;                     // 设置USART数据位长度 8位数据位
        USART_InitStructure_USARTx3.USART_StopBits   = USART_StopBits_1;                        // 设置USART停止位长度 1位停止位
        USART_InitStructure_USARTx3.USART_Parity     = USART_Parity_No;                         // 设置USART校验位长度 无校验
        USART_InitStructure_USARTx3.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 设置USART硬件数据流控制
        USART_InitStructure_USARTx3.USART_Mode       = USART_Mode_Rx | USART_Mode_Tx;           // 设置USART模式 发送模式+接收模式
        USART_Init(USART3, &USART_InitStructure_USARTx3);                                       // 初始化结构体
        USART_Cmd(USART3, ENABLE);                                                              // 使能USART3模块运行

        // 配置 USARTx3 中断操作
        #if (STM32F103xxxx_USARTx3_ITEN_RXNE == 1)
        {
   
   
            USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);      // 启用USARTx3接受中断
        }
        #endif  // #if (STM32F103xxxx_USARTx3_ITEN_RXNE == 1)

        #if (STM32F103xxxx_USARTx3_ITEN_IDLE == 1)              
        {
   
   
            USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);      // 启用USARTx3空闲中断
        }
        #endif  // #if (STM32F103xxxx_USARTx3_ITEN_IDLE == 1)

        #if (STM32F103xxxx_USARTx3_ITEN_TC == 1)
        {
   
   
            USART_ITConfig(USART3, USART_IT_TC, ENABLE);        // 启用USARTx3发送完成中断
        }
        #endif  // #if (STM32F103xxxx_USARTx3_ITEN_TC == 1)

        // 配置 USARTx3 DMA操作
        #if (STM32F103xxxx_USARTx3_DMA_TX == 1)
        {
   
   
            USART_DMACmd(USART3, USART_DMAReq_Tx, ENABLE);      // 启用USARTx3 DMA发送
        }
        #endif  // #if (STM32F103xxxx_USARTx3_DMA_TX == 1)

        #if (STM32F103xxxx_USARTx3_DMA_RX == 1)
        {
   
   
            USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);      // 启用USARTx3 DMA接收
        }
        #endif  // #if (STM32F103xxxx_USARTx3_DMA_RX == 1)
    }
    #endif  // #if (STM32F103xxxx_USARTx3 == 1)

    //----------------------------------------------------------------------------------------------
    // 配置 UARTx4 功能
    //----------------------------------------------------------------------------------------------
    #if (STM32F103xxxx_UARTx4 == 1)    
    {
   
   
        // 参数检查
        #if ((STM32F103xxxx_UARTx4_BAUD != 600)   \
        &&   (STM32F103xxxx_UARTx4_BAUD != 1200)  \
        &&   (STM32F103xxxx_UARTx4_BAUD != 2400)  \
        &&   (STM32F103xxxx_UARTx4_BAUD != 4800)  \
        &&   (STM32F103xxxx_UARTx4_BAUD != 9600)  \
        &&   (STM32F103xxxx_UARTx4_BAUD != 14400) \
        &&   (STM32F103xxxx_UARTx4_BAUD != 19200) \
        &&   (STM32F103xxxx_UARTx4_BAUD != 38400) \
        &&   (STM32F103xxxx_UARTx4_BAUD != 115200))
        {
   
   
            #error "There are errors in the STM32F103xxxx_UARTx4_BAUD"
        }
        #endif  // #if ((STM32F103xxxx_UARTx4_BAUD != 600)   \
                   &&   (STM32F103xxxx_UARTx4_BAUD != 1200)  \
                   &&   (STM32F103xxxx_UARTx4_BAUD != 2400)  \
                   &&   (STM32F103xxxx_UARTx4_BAUD != 4800)  \
                   &&   (STM32F103xxxx_UARTx4_BAUD != 9600)  \
                   &&   (STM32F103xxxx_UARTx4_BAUD != 14400) \
                   &&   (STM32F103xxxx_UARTx4_BAUD != 19200) \
                   &&   (STM32F103xxxx_UARTx4_BAUD != 38400) \
                   &&   (STM32F103xxxx_UARTx4_BAUD != 115200))

        #if (STM32F103xxxx_UARTx4_PORT_C10C11 != 1)
        {
   
   
            #error "There are errors in the STM32F103xxxx_UARTx4_PORT"
        }
        #endif  // #if (STM32F103xxxx_UARTx4_PORT_C10C11 != 1)

        // 配置GPIO引脚映射功能
        #if (STM32F103xxxx_UARTx4_PORT_C10C11 == 1)                 // 不映射
        {
   
   

        }
        #endif  // #if (STM32F103xxxx_UARTx4_PORT_C10C11 == 1)

        // 配置GPIO TXD引脚
        #if (STM32F103xxxx_UARTx4_PORT_C10C11 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_UARTx4_TXD;                     // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);               // 使能GPIOC模块时钟

            GPIO_InitStructure_UARTx4_TXD.GPIO_Pin   = GPIO_Pin_10;             // 设置GPIO引脚号
            GPIO_InitStructure_UARTx4_TXD.GPIO_Speed = GPIO_Speed_50MHz;        // 设置GPIO引脚速率
            GPIO_InitStructure_UARTx4_TXD.GPIO_Mode  = GPIO_Mode_AF_PP;         // 设置GPIO引脚输出类型 推挽输出类型
            GPIO_Init(GPIOC, &GPIO_InitStructure_UARTx4_TXD);                   // 初始化结构体
        }
        #endif  // #if (STM32F103xxxx_UARTx4_PORT_C10C11 == 1)

        // 配置GPIO RXD引脚
        #if (STM32F103xxxx_UARTx4_PORT_C10C11 == 1)
        {
   
   
            GPIO_InitTypeDef GPIO_InitStructure_UARTx4_TXD;                     // 定义结构体变量

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);               // 使能GPIOC模块时钟

            GPIO_InitStructure_UARTx4_TXD.GPIO_Pin   = GPIO_Pin_11;             // 设置GPIO引脚号
            GPIO_InitStructure_UARTx4_TXD.GPIO_Speed = GPIO_Speed_50MHz;        // 设置GPIO引脚速率
            GPIO_InitStructure_UARTx4_TXD.GPIO_Mode  = GPIO_Mode_IN_FLOATING;   // 设置GPIO引脚输出类型 浮空输入类型
            GPIO_Init(GPIOC, &GPIO_InitStructure_UARTx4_TXD);                   // 初始化结构体
        }
        #endif  // #if (STM32F103xxxx_UARTx4_PORT_C10C11 == 1)

        // 配置 UARTx4 功能
        USART_InitTypeDef USART_InitStructure_UARTx4;                                           // 定义结构体变量

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);                                   // 使能UART4模块时钟

        USART_DeInit(UART4);

        USART_InitStructure_UARTx4.USART_BaudRate   = STM32F103xxxx_UARTx4_BAUD;                // 设置USART波特率
        USART_InitStructure_UARTx4.USART_WordLength = USART_WordLength_8b;                      // 设置USART数据位长度 8位数据位
        USART_InitStructure_UARTx4.USART_StopBits   = USART_StopBits_1;                         // 设置USART停止位长度 1位停止位
        USART_InitStructure_UARTx4.USART_Parity     = USART_Parity_No;                          // 设置USART校验位长度 无校验
        USART_InitStructure_UARTx4.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  // 设置USART硬件数据流控制
        USART_InitStructure_UARTx4.USART_Mode       = USART_Mode_Rx | USART_Mode_Tx;            // 设置USART模式 发送模式+接收模式
        USART_Init(UART4, &USART_InitStructure_UARTx4);                                         // 初始化结构体
        USART_Cmd(UART4, ENABLE);                                                               // 使能UART4模块运行

        // 配置 UARTx4 中断操作
        #if (STM32F103xxxx_UARTx4_ITEN_RXNE == 1)
        {
   
   
            USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);       // 启用UARTx4接受中断
        }
        #endif  // #if (STM32F103xxxx_UARTx4_ITEN_RXNE == 1)

        #if (STM32F103xxxx_UARTx4_ITEN_IDLE == 1)
        {
   
   
            USART_ITConfig(UART4, USART_IT_IDLE, ENABLE);       // 启用UARTx4空闲中断
        }
        #endif  // #if (STM32F103xxxx_UARTx4_ITEN_IDLE == 1)

        #if (STM32F103xxxx_UARTx4_ITEN_TC == 1)
        {
   
   
            USART_ITConfig(UART4, USART_IT_TC, ENABLE);         // 启用UARTx4发送完成中断
        }
        #endif  // #if (STM32F103xxxx_UARTx4_ITEN_TC == 1)

        // 配置 UARTx4 DMA操作
        #if (STM32F103xxxx_UARTx4_DMA_TX == 1)
        {
   
   
            USART_DMACmd(UART4, USART_DMAReq_Tx, ENABLE);       // 启用UARTx4 DMA发送
        }
        #endif  // #if (STM32F103xxxx_UARTx4_DMA_TX == 1)

        #if (STM32F103xxxx_UARTx4_DMA_RX == 1)
        {
   
   
            USART_DMACmd(UART4, USART_DMAReq_Rx, ENABLE);       // 启用UARTx4 DMA接收
        }
        #endif  // #if (STM32F103xxxx_UARTx4_DMA_RX == 1)
    }
    #endif  // #if (STM32F103xxxx_UARTx4 == 1)
}

STM32F103xxxx_USART.H

//==================================================================================================
//  文件名称: STM32F103xxxx_USART.H
//  文件功能: USART-USART通信总线
//  文件说明: 无
//==================================================================================================

#ifndef __STM32F103xxxx_USART_H__
#define __STM32F103xxxx_USART_H__

//--------------------------------------------------------------------------------------------------
//  包含的头文件    |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//--------------------------------------------------------------------------------------------------
#include "stm32f10x_usart.h"

//--------------------------------------------------------------------------------------------------
// 宏自定义声明     |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//--------------------------------------------------------------------------------------------------
//  兼容STM32系列单片机 GPIO端口宏定义
#define USARTx1                             USART1
#define USARTx2                             USART2
#define USARTx3                             USART3
#define UARTx4                              UART4
#define UARTx5                              UART5

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#define STM32F103xxxx_USARTx1                       1       // USARTx1 开关开启  取值范围 - 0为禁用 1为启用  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx1_BAUD                  115200  // USARTx1 波特率  取值范围 - 600/1200/2400/4800/9600/19200/38400/115200
#define STM32F103xxxx_USARTx1_PORT_A09A10           1       // USARTx1 引脚设置 PA9 - TxD PA10 - RxD  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx1_PORT_B06B07           0       // USARTx1 引脚设置 PB6 - TxD PB7 - RxD  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx1_ITEN_RXNE             0       // USARTx1 接受中断操作使能  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx1_ITEN_IDLE             0       // USARTx1 空闲中断操作使能  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx1_ITEN_TC               0       // USARTx1 发送完成中断操作使能  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx1_DMA_TX                0       // USARTx1 DMA发送 开关  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx1_DMA_RX                0       // USARTx1 DMA接受 开关  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx1_DMA_TX_CUNT           1024    // USARTx1 DMA发送 字节数量
#define STM32F103xxxx_USARTx1_DMA_RX_CUNT           1024    // USARTx1 DMA接受 字节数量
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#define STM32F103xxxx_USARTx2                       0       // USARTx2 开关开启  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx2_BAUD                  9600    // USARTx2 波特率  取值范围 - 600/1200/2400/4800/9600/19200/38400/115200
#define STM32F103xxxx_USARTx2_PORT_A02A03           1       // USARTx2 引脚设置 PA2 - TxD PA3 - RxD  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx2_PORT_D05D06           0       // USARTx2 引脚设置 PD5 - TxD PD6 - RxD  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx2_ITEN_RXNE             0       // USARTx2 接受中断操作使能  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx2_ITEN_IDLE             0       // USARTx2 空闲中断操作使能  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx2_ITEN_TC               0       // USARTx2 发送完成中断操作使能  取值范围 - 0为禁用 1为启用
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#define STM32F103xxxx_USARTx3                       0       // USARTx3 开关开启  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx3_BAUD                  115200  // USARTx3 波特率  取值范围 - 600/1200/2400/4800/9600/19200/38400/115200
#define STM32F103xxxx_USARTx3_PORT_B10B11           1       // USARTx3 引脚设置 PB10 - TxD PB11 - RxD  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx3_PORT_C10C11           0       // USARTx3 引脚设置 PC10 - TxD PC11 - RxD  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx3_PORT_D08D09           0       // USARTx3 引脚设置 PD8 - TxD PD9 - RxD  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx3_ITEN_RXNE             0       // USARTx3 接受中断操作使能  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx3_ITEN_IDLE             0       // USARTx3 空闲中断操作使能  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx3_ITEN_TC               0       // USARTx3 发送完成中断操作使能  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_USARTx3_DMA_TX                0       // USARTx3 DMA发送 开关开启  取值范围 - 0为禁用 1为使能
#define STM32F103xxxx_USARTx3_DMA_RX                0       // USARTx3 DMA接受 开关开启  取值范围 - 0为禁用 1为使能
#define STM32F103xxxx_USARTx3_DMA_TX_COUNT          1024    // USARTx3 DMA发送 字节数量
#define STM32F103xxxx_USARTx3_DMA_RX_COUNT          1024    // USARTx3 DMA接受 字节数量
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#define STM32F103xxxx_UARTx4                        0       // UARTx4 开关开启  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_UARTx4_BAUD                   115200  // UARTx4 波特率  取值范围 - 600/1200/2400/4800/9600/19200/38400/115200
#define STM32F103xxxx_UARTx4_PORT_C10C11            1       // UARTx4 引脚设置 PC10 - TxD PC11 - RxD  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_UARTx4_ITEN_RXNE              1       // UARTx4 接受中断操作使能  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_UARTx4_ITEN_IDLE              0       // UARTx4 空闲中断操作使能  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_UARTx4_ITEN_TC                0       // UARTx4 发送完成中断操作使能  取值范围 - 0为禁用 1为启用
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#define STM32F103xxxx_UARTx5                        0       // UARTx5 开关开启  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_UARTx5_BAUD                   115200  // UARTx5 波特率  取值范围 - 600/1200/2400/4800/9600/19200/38400/115200
#define STM32F103xxxx_UARTx5_PORT_C12D02            1       // UARTx5 引脚设置 PC10 - TxD PC11 - RxD  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_UARTx5_ITEN_RXNE              1       // UARTx5 接受中断操作使能  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_UARTx5_ITEN_IDLE              0       // UARTx5 空闲中断操作使能  取值范围 - 0为禁用 1为启用
#define STM32F103xxxx_UARTx5_ITEN_TC                0       // UARTx5 发送完成中断操作使能  取值范围 - 0为禁用 1为启用

//--------------------------------------------------------------------------------------------------
//  数据变量定义    |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//--------------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------------
//  函数调用声明    |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
//--------------------------------------------------------------------------------------------------
//  USART 预配置
void USART_Configure(void);

//  USART 发送字符、字符串
void USART_SendChar(USART_TypeDef* USARTx, unsigned char Char);
void USART_SendString(USART_TypeDef* USARTx, unsigned char *String);

//  USART 接受字符
unsigned char USART_ReceiveChar(USART_TypeDef* USARTx);

//  USART 发送数组 
void USART_SendArray(USART_TypeDef* USARTx, unsigned char *Array, unsigned char Count);

//  USART 发送回车换行
void USART_SendLine(USART_TypeDef* USARTx);

//  USART 发送数字 
void USART_SendNumber_SignedInteger(USART_TypeDef* USARTx, signed short int Number, unsigned char Count);
void USART_SendNumber_UnsignedInteger(USART_TypeDef* USARTx, unsigned short int Number, unsigned char Count);
void USART_SendNumber_Float(USART_TypeDef* USARTx, float Number, unsigned char Count1, unsigned char Count2);
void USART_SendNumber_Binary(USART_TypeDef* USARTx, int Number, unsigned char Count);

#endif // #ifndef __STM32F103xxxx_USART_H__

BSP_TEST.C

#include "bsp_test.h"

/**
  * @brief  TFT_LCD_TEST LCD测试函数
  * @param  none
  * @retval 无
 */

void  TFT_LCD_TEST(void)
{
   
   


    LCD_SetFont(&Font8x16);
    LCD_SetColors(RED,WHITE);

  ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);    /* 清屏,显示全黑 */
    /********显示字符串示例*******/
  ILI9341_DispStringLine_EN(LINE(0),"dele 3.2 inch LCD:");
  ILI9341_DispStringLine_EN(LINE(1),"Image resolution:240x320");
  ILI9341_DispStringLine_EN(LINE(2),"ILI9341 TFT_LCD_TEST driver ");
  ILI9341_DispStringLine_EN(LINE(3),"www.delehub.top By wangzixuan");
  ILI9341_DispStringLine_EN(LINE(4),"2020-10-02 17:15 TFT_LCD_TEST");

  LCD_SetFont(&Font8x16);
  /* 画圆 */

  LCD_ClearLine(LINE(5));    /* 清除单行文字 */
    LCD_SetTextColor(GREEN);

  ILI9341_DispStringLine_EN(LINE(5),"TFT_LCD_DrawCir_TEST :");

    LCD_SetTextColor(RED);
  ILI9341_DrawCircle(100,200,20,1);

    LCD_SetTextColor(GREEN);
  ILI9341_DrawCircle(100,200,40,0);

    LCD_SetTextColor(BLUE);
    ILI9341_DrawCircle(100,180,60,0);

  Delay(0xFFFFFF);

  ILI9341_Clear(0,16*8,LCD_X_LENGTH,LCD_Y_LENGTH-16*8);    /* 清屏,显示全黑 */

}

void Usart_test(void)
{
   
   
  USART_SendString(USART1 , "2020-10-02 18:00 USART1 Test");
  USART_SendLine(USART1);
  USART_SendNumber_SignedInteger(USART1,1234,4);
  USART_SendLine(USART1);
  USART_SendNumber_UnsignedInteger(USART1,12445,5);
  USART_SendLine(USART1);
  USART_SendNumber_Float(USART1,1234.89,7,8);
  USART_SendLine(USART1);
  USART_SendString(USART1 , "www.delehub.top  By wang zi xuan ");
  USART_SendLine(USART1);

}
/**
  * @brief  简单延时函数
  * @param  nCount :延时计数值
  * @retval 无
  */    
static void Delay ( __IO uint32_t nCount )
{
   
   
  for ( ; nCount != 0; nCount -- );

}

MAIN.C

/**
  ******************************************************************************
  * @file    main.c
  * 实验平台:野火 F103-霸道 STM32 开发板 
  ******************************************************************************
  * 第三方库文件导入  START THE FILE
  ******************************************************************************
  */ 

#include "stm32f10x.h"
#include "bsp_led.h"  
#include "bsp_key.h" 
#include "bsp_beep.h"
#include "bsp_exit.h"
#include "timer.h"
#include "bsp_ili9341_lcd.h"
#include "bsp_SysTick.h"
#include "bsp_usart.h"
#include <stdio.h>
#include "bsp_test.h"
#include "STM32F103xxxx_USART.H"  
/******************************************************************************
END THE FILE
  * 第三方库文件导入*********************************************************/ 

void HardWare_Iint(void)
{
   
   
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  LED_Iint();
  Key_Iint();
  Beep_Init();
  //TIM4_Int_Init(9999,7199);
  ILI9341_Init();
  USART_Configure();

}
/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */ 
int main(void)
{
   
       
    /* 硬件端口初始化 */
    HardWare_Iint();
      ILI9341_GramScan ( 6 );
      while(1)
      {
   
   
        TFT_LCD_TEST();
        Usart_test();
     } 
}

串口助手打印效果

在这里插入图片描述

TFT_LCD 测试效果

在这里插入图片描述

目录
相关文章
野火STM32F1开发板 IIC 0.96OLED 波形显示
野火STM32F1开发板 IIC 0.96OLED 波形显示
110 0
|
C语言
野火F1开发板STM32案例-MultiButton移植
野火F1开发板STM32案例-MultiButton移植
189 0
|
芯片
野火F1开发板STM32案例 0.96 oled综合库使用
野火F1开发板STM32案例 0.96 oled综合库使用
218 0
|
6月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
488 2
|
5月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
818 0
|
7月前
|
传感器
STM32标准库ADC和DMA知识点总结-1
STM32标准库ADC和DMA知识点总结
|
6月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
540 4
|
6月前
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
814 2
|
6月前
|
存储 数据采集 数据安全/隐私保护
使用STM32F103读取TF卡并模拟U盘:使用标准库实现
通过以上步骤,你可以实现用STM32F103将TF卡内容变成U盘进行读取。这种功能在数据采集、便携式存储设备等应用中非常有用。如果你有更多的需求,可以进一步扩展此项目,例如添加文件管理功能、加密存储等。希望这篇博客能帮到你,如果有任何问题,欢迎在评论区留言讨论!
276 1