介绍的定义

串行通信、并行通信、全双工、半双工、单工、同步、异步、比特率、码元、波特率、TTL、RS232、DB9接口、DTE、DCE、协议层、USART、UART、CH340G芯片、USB。

通信基础

根据数据传送的方式,通讯可分为串行通讯与并行通讯。

串行通信:同一时刻只能传输一个数据位的数据。串行通讯可以节省数据线的硬件成本。

并行通信:可以同时传输多个数据位的数据。因为一次可传输多个数据位的数据 ,在数据传输速率相同的情况下,并行通讯传输的数据量要大得多。使用很多数据线进行传输。

根据数据通讯的方向,通讯又分为全双工、半双工及单工通讯,它们主要以信道的方向来区分。

全双工:在同一时刻,两个设备之间可以同时收发数据。

半双工:两个设备之间可以收发数据,但不能在同一时刻进行。

单工:在任何时刻都只能进行一个方向的通讯,即一个固定为发送设备,另一个固定为接收设备。

根据通讯的数据同步方式,又分为同步和异步两种,可以根据通讯过程中是否有使用时钟信号进行简单的区分。

同步通讯:收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据。通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。在同步通讯中,数据信号所传输的内容绝大部分就是有效数据,同步通讯的效率更高。同步通讯双方的时钟允许误差较小。

异步通讯:不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,有时还需要双方约定数据的传输速率,以便更好地同步。异步通讯中会包含帧的各种标识符,异步通讯双方的时钟允许误差较大。

通讯速率:衡量通讯性能,常以比特率(Bitrate)来表示,即每秒钟传输的二进制位数,单位为比特每秒(bit/s)。

“波特率” (Baudrate):表示每秒钟传输了多少个码元。

码元:一个码元就是一个脉冲信号,一个脉冲信号有可能携带1bit数据,也有可能携带2bit数据、4bit数据。把振幅分成四种,低(00)、中(01)、高(10)、很高(11),发一个脉冲信号,携带2bit的数据。一个码元能携带1bit数据,那么比特率 = 波特率;一个码元能携带2bit数据,那么比特率 = 2倍的波特率。

根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准。

RS232标准:规定了信号的用途、通讯接口以及信号的电平标准。

两个通讯设备的“DB9 接口”之间通过串口信号线建立起连接, 串口信号线中使用“RS-232 标准”传输数据信号。由于 RS-232 电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的 “TTL 标准”的电平信号。

DB9接口如下图;DTE:数据终端设备(计算机、路由);DCE:数据通讯设备(调制解调器、猫)。通常DTE引出公头,DCE引出母头。DB9接口里面连的有TXD、RXD信号线,串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口

TTL标准:控制器一般使用 TTL 电平标准,所以常常会使用 MA3232 芯片对 TTL 及 RS-232 电平的信号进行互相转换。

协议层:规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据。

USART:通用同步异步收发器,串行通信设备,可与外部设备进行全双工数据交换。串行通信一般是以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。

UART:去掉了同步通信功能,只有异步通信。平时用的串口通信基本都是 UART。

CH340G 芯片:USB 总线的转接芯片,实现 USB 转 USART、USB 转 lrDA 红外或者 USB 转打印机接口,这里使用其 USB 转 USART 功能,原理图如下。其中的USB-MINI就是我们的USB。

用下面这个线就能把stm32和电脑连起来了。

串口中断接收回显实验

main.c

实现开发板与电脑通信,在开发板上电时通过 USART 发送一串字符串给电脑,然后开发板进入中断接收等待状态,如果电脑有发送数据过来,开发板就会产生中断,中断服务函数接收数据,并马上把数据返回发送给电脑。

main里面调用 USART_Config 函数完成 USART 初始化配置,包括 GPIO 配置, USART 配置,接收中断使能,然后什么都不做,等待 USART 接收中断的产生,并在中断服务函数把数据回传。

#include "stm32f10x.h"
#include "bsp_usart.h"/*** @brief  主函数* @param  无* @retval 无*/
int main(void)
{   /*初始化USART 配置模式为 115200 8-N-1,中断接收*/USART_Config();/* 发送一个字符串 */Usart_SendString( DEBUG_USARTx,"这是一个串口中断接收回显实验\n");while(1){   }
}

usart.c

下面的NVIC_Configuration函数进行中断控制器 NVIC 的配置,配置 USART 作为中断源。

static void NVIC_Configuration(void)

下面的USART_Config函数进行USART 初始化配置,主要是设置GPIO_InitStructure和USART_InitStructure这两个结构体变量。

void USART_Config(void)
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

下面这两个函数进行字符的发送。

void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)

USART_Config函数整个流程大致是:

使能 RX 和 TX 引脚 GPIO 时钟和 USART 时钟; 初始化 GPIO,并将 GPIO 复用到 USART 上; 配置 USART 参数; 配置中断控制器并使能 USART 接收中断; 使能 USART;

最后在 USART 接收中断服务函数实现数据接收和发送。

#include "bsp_usart.h"/*** @brief  配置嵌套向量中断控制器NVIC* @param  无* @retval 无*/
static void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;/* 嵌套向量中断控制器组选择 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/* 配置USART为中断源 */NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;/* 抢断优先级*/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/* 子优先级 */NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/* 使能中断 */NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/* 初始化配置NVIC */NVIC_Init(&NVIC_InitStructure);
}/*** @brief  USART GPIO 配置,工作参数配置* @param  无* @retval 无*/
void USART_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 打开串口GPIO的时钟DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);// 打开串口外设的时钟DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);// 将USART Tx的GPIO配置为推挽复用模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);// 将USART Rx的GPIO配置为浮空输入模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);// 配置串口的工作参数// 配置波特率USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;// 配置 针数据字长USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 配置停止位USART_InitStructure.USART_StopBits = USART_StopBits_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_Init(DEBUG_USARTx, &USART_InitStructure);// 串口中断优先级配置NVIC_Configuration();// 使能串口接收中断USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);    // 使能串口USART_Cmd(DEBUG_USARTx, ENABLE);
}/*****************  发送一个字节 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{/* 发送一个字节数据到USART */USART_SendData(pUSARTx,ch);/* 等待发送数据寄存器为空 */while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}/****************** 发送8位的数组 ************************/
void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array, uint16_t num)
{uint8_t i;for(i=0; i<num; i++){/* 发送一个字节数据到USART */Usart_SendByte(pUSARTx,array[i]); }/* 等待发送完成 */while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);
}/*****************  发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{unsigned int k=0;do {Usart_SendByte( pUSARTx, *(str + k) );k++;} while(*(str + k)!='\0');/* 等待发送完成 */while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET){}
}/*****************  发送一个16位数 **********************/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
{uint8_t temp_h, temp_l;/* 取出高八位 */temp_h = (ch&0XFF00)>>8;/* 取出低八位 */temp_l = ch&0XFF;/* 发送高八位 */USART_SendData(pUSARTx,temp_h);   while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);/* 发送低八位 */USART_SendData(pUSARTx,temp_l);  while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{/* 发送一个字节数据到串口 */USART_SendData(DEBUG_USARTx, (uint8_t) ch);/* 等待发送完毕 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);      return (ch);
}///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{/* 等待串口输入数据 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(DEBUG_USARTx);
}

usart.h

这里面是GPIO 和 USART 的宏定义,此开发版USART引脚和TX、RX连接关系如下。这里使用 USART1,设定波特率为 115200,选定 USART 的 GPIO 为 PA9 和 PA10。

#ifndef __USART_H
#define __USART_H#include "stm32f10x.h"
#include <stdio.h>/** * 串口宏定义,不同的串口挂载的总线和IO不一样,移植时需要修改这几个宏* 1-修改总线时钟的宏,uart1挂载到apb2总线,其他uart挂载到apb1总线* 2-修改GPIO的宏*/// 串口1-USART1
#define  DEBUG_USARTx                   USART1
#define  DEBUG_USART_CLK                RCC_APB2Periph_USART1
#define  DEBUG_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd#define  DEBUG_USART_TX_GPIO_PORT       GPIOA
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_9
#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_10#define  DEBUG_USART_IRQ                USART1_IRQn
#define  DEBUG_USART_IRQHandler         USART1_IRQHandler// 串口2-USART2
//#define  DEBUG_USARTx                   USART2
//#define  DEBUG_USART_CLK                RCC_APB1Periph_USART2
//#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
//#define  DEBUG_USART_BAUDRATE           115200 USART GPIO 引脚宏定义
//#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
//#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
//
//#define  DEBUG_USART_TX_GPIO_PORT       GPIOA
//#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_2
//#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
//#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_3//#define  DEBUG_USART_IRQ                USART2_IRQn
//#define  DEBUG_USART_IRQHandler         USART2_IRQHandler// 串口3-USART3
//#define  DEBUG_USARTx                   USART3
//#define  DEBUG_USART_CLK                RCC_APB1Periph_USART3
//#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
//#define  DEBUG_USART_BAUDRATE           115200 USART GPIO 引脚宏定义
//#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOB)
//#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
//
//#define  DEBUG_USART_TX_GPIO_PORT       GPIOB
//#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_10
//#define  DEBUG_USART_RX_GPIO_PORT       GPIOB
//#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_11//#define  DEBUG_USART_IRQ                USART3_IRQn
//#define  DEBUG_USART_IRQHandler         USART3_IRQHandler// 串口4-UART4
//#define  DEBUG_USARTx                   UART4
//#define  DEBUG_USART_CLK                RCC_APB1Periph_UART4
//#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
//#define  DEBUG_USART_BAUDRATE           115200 USART GPIO 引脚宏定义
//#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOC)
//#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
//
//#define  DEBUG_USART_TX_GPIO_PORT       GPIOC
//#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_10
//#define  DEBUG_USART_RX_GPIO_PORT       GPIOC
//#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_11//#define  DEBUG_USART_IRQ                UART4_IRQn
//#define  DEBUG_USART_IRQHandler         UART4_IRQHandler// 串口5-UART5
//#define  DEBUG_USARTx                   UART5
//#define  DEBUG_USART_CLK                RCC_APB1Periph_UART5
//#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
//#define  DEBUG_USART_BAUDRATE           115200 USART GPIO 引脚宏定义
//#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD)
//#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
//
//#define  DEBUG_USART_TX_GPIO_PORT       GPIOC
//#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_12
//#define  DEBUG_USART_RX_GPIO_PORT       GPIOD
//#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_2//#define  DEBUG_USART_IRQ                UART5_IRQn
//#define  DEBUG_USART_IRQHandler         UART5_IRQHandlervoid USART_Config(void);
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch);
void Usart_SendString( USART_TypeDef * pUSARTx, char *str);
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch);#endif /* __USART_H */

中断部分

由于在usart.c的USART_Config函数中使能了 USART 接收中断,当 USART 接收到数据就会执行 USART_IRQHandler 函数。

#include "stm32f10x_it.h"
#include "bsp_usart.h"
// 串口中断服务函数
void DEBUG_USART_IRQHandler(void)
{uint8_t ucTemp;if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET){      ucTemp = USART_ReceiveData(DEBUG_USARTx);USART_SendData(DEBUG_USARTx,ucTemp);    }
}

串口控制点灯

main.c

这个实验不用接收中断,而用查询标志位的方法,就是main里面用了switch去判断,而不是用中断来判断。

结果就是输入个2,小灯发出个绿光。

#include "stm32f10x.h"
#include "./led/bsp_led.h"
#include "./usart/bsp_usart.h" static void Show_Message(void);/*** @brief  主函数* @param  无* @retval 无*/
int main(void)
{   char ch;/* 初始化RGB彩灯 */LED_GPIO_Config();/* 初始化USART 配置模式为 115200 8-N-1 */USART_Config();/* 打印指令输入提示信息 */Show_Message();while(1){    /* 获取字符指令 */ch=getchar();printf("接收到字符:%c\n",ch);/* 根据字符指令控制RGB彩灯颜色 */switch(ch){case '1':LED_RED;break;case '2':LED_GREEN;break;case '3':LED_BLUE;break;case '4':LED_YELLOW;break;case '5':LED_PURPLE;break;case '6':LED_CYAN;break;case '7':LED_WHITE;break;case '8':LED_RGBOFF;break;default:/* 如果不是指定指令字符,打印提示信息 */Show_Message();break;      }   }
}/*** @brief  打印指令输入提示信息* @param  无* @retval 无*/
static void Show_Message(void)
{printf("\r\n   这是一个通过串口通信指令控制RGB彩灯实验 \n");printf("使用  USART  参数为:%d 8-N-1 \n",DEBUG_USART_BAUDRATE);printf("开发板接到指令后控制RGB彩灯颜色,指令对应如下:\n");printf("   指令   ------ 彩灯颜色 \n");printf("     1    ------    红 \n");printf("     2    ------    绿 \n");printf("     3    ------    蓝 \n");printf("     4    ------    黄 \n");printf("     5    ------    紫 \n");printf("     6    ------    青 \n");printf("     7    ------    白 \n");printf("     8    ------    灭 \n");
}/*********************************************END OF FILE**********************/

usart.c

USART_Config进行USART初始化配置。和上一个实验相似,不过没用接收中断。

整个实验流程大致是:初始化配置 RGB 彩色灯 GPIO;使能 RX 和 TX 引脚 GPIO 时钟和 USART 时钟;初始化 GPIO,并将 GPIO 复用到 USART 上;配置 USART 参数; 使能 USART; 获取指令输入,根据指令控制 RGB 彩色灯。

#include "bsp_usart.h"/*** @brief  USART GPIO 配置,工作参数配置* @param  无* @retval 无*/
void USART_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 打开串口GPIO的时钟DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);// 打开串口外设的时钟DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);// 将USART Tx的GPIO配置为推挽复用模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);// 将USART Rx的GPIO配置为浮空输入模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);// 配置串口的工作参数// 配置波特率USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;// 配置 针数据字长USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 配置停止位USART_InitStructure.USART_StopBits = USART_StopBits_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_Init(DEBUG_USARTx, &USART_InitStructure);    // 使能串口USART_Cmd(DEBUG_USARTx, ENABLE);
}/*****************  发送一个字符 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{/* 发送一个字节数据到USART */USART_SendData(pUSARTx,ch);/* 等待发送数据寄存器为空 */while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}/*****************  发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{unsigned int k=0;do {Usart_SendByte( pUSARTx, *(str + k) );k++;} while(*(str + k)!='\0');/* 等待发送完成 */while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET){}
}/*****************  发送一个16位数 **********************/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
{uint8_t temp_h, temp_l;/* 取出高八位 */temp_h = (ch&0XFF00)>>8;/* 取出低八位 */temp_l = ch&0XFF;/* 发送高八位 */USART_SendData(pUSARTx,temp_h);   while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);/* 发送低八位 */USART_SendData(pUSARTx,temp_l);  while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{/* 发送一个字节数据到串口 */USART_SendData(DEBUG_USARTx, (uint8_t) ch);/* 等待发送完毕 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);      return (ch);
}///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{/* 等待串口输入数据 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(DEBUG_USARTx);
}

usart.h

进行GPIO 和 USART 宏定义。

#ifndef __USART_H
#define __USART_H#include "stm32f10x.h"
#include <stdio.h>/** * 串口宏定义,不同的串口挂载的总线不一样,移植时需要修改这几个宏*/
#define  DEBUG_USARTx                   USART1
#define  DEBUG_USART_CLK                RCC_APB2Periph_USART1
#define  DEBUG_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd#define  DEBUG_USART_TX_GPIO_PORT         GPIOA
#define  DEBUG_USART_TX_GPIO_PIN          GPIO_Pin_9
#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_10#define  DEBUG_USART_IRQ                USART1_IRQn
#define  DEBUG_USART_IRQHandler         USART1_IRQHandlervoid USART_Config(void);
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch);
void Usart_SendString( USART_TypeDef * pUSARTx, char *str);
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch);#endif /* __USART_H */

stm32 USART相关推荐

  1. stm32 USART接收总线空闲中断--USART_IT_IDLE

    stm32 USART接收总线空闲中断--USART_IT_IDLE 版权声明:转载请注明作者和链接 https://blog.csdn.net/Hola_ya/article/details/815 ...

  2. stm32 usart的BRR寄存器的配置,程序是CMSIS中的,分析它是怎么实现的?(自己设置好波特率,库文件会根据波特率计算BRR的值,和以前STM8不一样,需要自己根据波特率计算BRR值再设置)

    stm32 usart的BRR寄存器的配置 stm32 专栏收录该内容 23 篇文章0 订阅 订阅专栏 程序是CMSIS中的,分析它是怎么实现的? 波特率由整数和分数两部分组成. RCC_GetClo ...

  3. ChibiOS系列:五、将STM32 USART与ChibiOS串行驱动程序配合使用

    本文翻译自:http://www.playembedded.org/blog/stm32-usart-chibios-serial/ 将STM32 USART与ChibiOS串行驱动程序配合使用 发表 ...

  4. STM32—USART串口发送+接收

    STM32-USART串口发送+接收 本文来自于<STM32--江科大>的笔记整理. 文章目录 STM32-USART串口发送+接收 10.3 串口发送 串口调试助手 10.3.1 数据模 ...

  5. STM32 USART使用奇偶校验位

    STM32 USART 无校验位时,数据位常用8位 当使用就校验位时,数据位应设置为9位. 奇偶校验位也包含在数据位中. 详见参考手册:

  6. STM32 USART串口DMA 接收和发送的源码详解!

    硬件平台:STM32F103ZET6: 开发环境:KEIL 4: 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信 ...

  7. STM32——USART串口

    文章目录 一.通信接口 二.串口通信 三.硬件电路 四.电平标准 五.串口参数及时序 六.STM32的USART外设简介 七.USART框图 八.USART基本结构 九.数据帧 十.起始位侦测和采样位 ...

  8. 浅谈STM32 USART串口中断配置函数USART_ITConfig()的编程思路

    void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) 函数参数列表中,USAR ...

  9. STM32 USART串口通讯初试【查询方式】

    目录 1 USART介绍 1.1 串口的基本概念 1.2 串口的工作方式 1.3 USART介绍 2 STM32CubeMX及Keil的使用 2.1 stm32cubeMX创建项目 2.2 修改代码 ...

最新文章

  1. 比亚迪f3android系统,比亚迪F3发动机防盗系统设定
  2. Linux下时间戳的换算方法
  3. Win7访问局域网内共享文件夹
  4. VS Resharper快捷键没了处理办法
  5. oracle group by ,having ,order by
  6. Spark History Server配置及其启动
  7. Python界面程序实例:按钮漂移,用Python小套路来撩女神
  8. 干掉13个区块链最常见的Bug!
  9. MySQL实现把两行两列数据合并为一行一列
  10. vlan internal allocation policy ascending解释
  11. FPGA实现按键检测消抖程序
  12. 从十亿光年到0.1飞米
  13. 计算机系统结构课后习题答案
  14. Unity 亮晶晶✨的粒子特效
  15. 如何在Fragment碎片中展示数据
  16. ckeditor 工具栏配置
  17. Singleton bean creation not allowed while singletons of this factory are in destruction (Do not requ
  18. 算法——最优解之动态规划
  19. wince任务管理器下载地址
  20. 凭什么是你从新星计划里面脱颖而出?答:凭这五点

热门文章

  1. JAVA基础之自定义容器实现
  2. okhttp_utils的使用以及与服务端springboot交互中遇到的问题
  3. python-视频分帧多帧合成视频
  4. redhat linux 6.5 vnc,redhat 6.5 YUM安装kvm 并用VNC远程管理
  5. 软考网络管理员存储容量计算相关问题
  6. 35-46集 中心极限定理、置信区间
  7. vite + vue2 + eslint 项目配置
  8. 关于java_关于Java基础
  9. html 按钮光束,图文详解,原来3dmax光束特效的制作这么简单!
  10. cad统计多条线段总长度插件_超级实用CAD技巧应用汇总!技巧大全、插件合集、快捷键合集等...