stm32----usart

stm32----usart_第1张图片

一、usart的用处
USART在STM32中的应用最多莫过于“打印”程序信息,一般在硬件设计时都会
预留一个USART通信接口连接电脑,用于在调试程序时把一些调试信息“打印”
在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错了具体哪里出错等。

二、总体流程:
电脑->单片机:电脑通过USB转串口线(内核CH340芯片(发))——>USART(通用同步异步收发器(收))——>GPIO——>内核
单片机->电脑:内核——>GPIO——>USART(通用同步异步收发器(发))——>电脑通过USB转串口线(内核CH340芯片(收))

三、工作流程
工作流程是首先,我们来编写一个程序实现开发板与电脑通信,在开发板上电时通过USART发送一串字符串给电脑,然后开发板进入中断接收等待状态。如果电脑发送数据过来,开发板就会产生中断,我们通过中断服务函数接收数据,并马上把数据返回给电脑。

四、总体步骤
1-初始化串口需要用到的GPIO;
2-初始化串口,USART_InitTypeDef;
3-中断配置(接收中断,中断优先级);
4-使能串口;
5-编写发送和接收函数;
6-编写中断服务函数。

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

①、首先先初始化,包括GPIO(RX和TX对应的时钟、端口、引脚、速度、模式、GPIO初始化)和USART控制器 (时钟、波特率、数据帧、停止位、校验位、模式、数据流控制、USART初始化)由于初始化中想要实现CPU处于中断状态,以便随时等待接收数据,故编写初始化NVIC控制器(会在初始化调用)和中断服务函数。
②、编写字符发送函数。
③、用main实现发送的功能,并且在串口调试助手里接收检验。

五、编程时需要用到的固件库函数
USART初始化结构体:USART_InitTypeDef
同步时钟初始化结构体:USART_ClockInitTypeDef
串口初始化函数:USART_Init
中断配置函数: USART_ITConfig
串口使能函数:USART_Cmd
数据发送函数:USART_SendData
数据接收函数:USART_ReceiveData
中断状态位获取函数:USART_GetITStatus

六、USART基础知识点
1、在目前的其他工业控制使用的串口通信中,一般只使用RXD(Receive Data数据接收信号,即输入)、TXD(Transmit Data数据发送信号,即输出)及GND 3条信号线直接传输数据信号,而RTS、CTS等都被裁剪掉了。
2、串口通信的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口。在串口通信的协议层中,规定了数据包的内容,它由起始位、主体数据、校验位以及停止位组成,通信双方的数据包格式要约定一致才能正常收发数据。
3、USART1使用APB2总线时钟,最高可达72MHz,其他USART最高为36MHz。
4、通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter,USART)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于USART,还有一个UART(Universal Asynchronous Receiver and Transmitter),它是在USART基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需要不需要对外提供时钟输出,我们平时用的串口通信基本上都是UART。
5、串行通信一般是以帧格式传输数据,即一帧一帧地传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。
6、通信速率通常以比特率(Bitrate)来表示,即每秒传输的二进制位数,单位为比特每秒(bit/s)。

七、USART函数详细解释
USART初始化结构体
typedef struct
{
uint32_t USART_BaudRate; //波特率 BRR
uint16_t USART_WordLength; //字长 CR1_M
uint16_t USART_StopBits; //停止位 CR2_STOP
uint16_t USART_Parity; //校验控制 CR1_PCE、CR1_PS
uint16_t USART_Mode; //模式选择CR1_TE、CR1_RE
// 硬件流选择 CR3_CTSE、CR3_RTSE
uint16_t USART_HardwareFlowControl;
} USART_InitTypeDef;

同步时钟初始化结构体
typedef struct
{
uint16_t USART_Clock; // 同步时钟 CR2_CLKEN
uint16_t USART_CPOL; // 极性 CR2_CPOL
uint16_t USART_CPHA; // 相位 CR2_CPHA
uint16_t USART_LastBit; //最后一个位的时钟脉冲 CR2_LBC
} USART_ClockInitTypeDef;

//USART GPIO 配置,工作参数配置
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);

}

/* 打印指令输入提示信息 */
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");
}

你可能感兴趣的:(STM32教程)