stm32 USART

介绍的定义

串行通信、并行通信、全双工、半双工、单工、同步、异步、比特率、码元、波特率、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 */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

robot 用AP连PC

1.启动机器人 2.PC找到机器人的热点&#xff0c;连接 3.看机器人分配的电脑ip 4.打开putty软件&#xff0c;下图里面是机器人的ip。然后点击open 。 5.输入机器人用户名和密码&#xff0c;现在已经登陆进去了。 6.输入ifconfig查看网络状况

robot连PCwifi、PC开Shell连robot

用网线将机器人和路由器连接&#xff0c;登录路由器管理界面&#xff0c;获取机器人 IP 地址。 打开Xshell&#xff0c;新建会话&#xff0c;主机设成机器人IP。 输入机器人用户名和密码 然后pc通过ssh连接上机器人 用ifconfig查看当前网络连接状态。有线连接是192.168.0.108&a…

ROS配置分布式通信

ROS配置分布式通信关键是&#xff0c;机器人和 PC 要处于同一网段。 虚拟机网络适配器设置成桥接。 ifconfig查看虚拟机和机器人端的网络连接状态&#xff0c;看是否处于一个网段。下面两图&#xff0c;说明机器人和 PC 都是一个网段。 互相Ping测试连通性。 修改PC端bashrc文…

ROS rqt、rviz

首先机器人端启动摄像头。 pc端用rqt_image_view就可以打开rqt工具&#xff0c;然后选择话题&#xff0c;就看到摄像头图像了。 下面是compressed话题和不是compressed话题的对比&#xff0c;这两个话题带宽有倍数级差异。 然后就可以用opencv做一些事情。下面这个其实就是机器…

nvm node 安装与配置

nvm Node Version Manager&#xff08;NVM&#xff09; 是一种用于管理多个主动节点.js版本的工具。 nvm官网下载地址 https://github.com/coreybutler/nvm-windows/releases 如果电脑上之前已经单独安装了node&#xff0c;先卸载&#xff08;可以在控制面板里面卸载&#xf…

采用推理的方法认知单词、CBOW模型

基于计数的方法&#xff0c;根据一个单词周围的单词的出现频数来表示该单词。需要生成所有单词的共现矩阵&#xff0c;再对这个矩阵进行 SVD&#xff0c;以获得密集向量&#xff0c;如果语料库处理的单词数量非常大&#xff0c;将需要大量的计算资源和时间。基于计数的方法使用…

CBOW模型正向传播、矩阵乘积层实现

把矩阵乘积称为MatMul节点&#xff1a; 下面这个图表示矩阵乘积yxW的计算图 。因为考虑了mini-batch 处理&#xff0c;假设x中保存了N个数据。此时x 、W、y 的形状分别是 ND、DH 、NH 。 下面是推反向传播的数学式&#xff1a; 用代码表述MatMul层&#xff1a;params 中保存要…

CBOW模型的数据预处理

数据预处理&#xff1a;从语料库生成上下文和目标词。如下图所示&#xff0c;contexts 的各行成为神经网络的输入&#xff0c;target 的各行成为正确解标签&#xff08;要预测出的单词&#xff09;。 之前做过一个preprocess函数&#xff0c;将文本分割为单词&#xff0c;并将分…

实现CBOW模型类

初始化&#xff1a;初始化方法的参数包括词汇个数 vocab_size 和中间层的神经元个数 hidden_size。首先生成两个权重&#xff08;W_in 和 W_out&#xff09;&#xff0c;并用一些小的随机值初始化这两个权重。设置astype(‘f’)&#xff0c;初始化将使用 32 位的浮点数。 生成…

CBOW模型的学习、Trainer类的实现

CBOW 模型的学习的实现&#xff1a;给神经网络准备好学习数据。然后求梯度&#xff0c;并逐步更新权重参数。 Trainer类&#xff1a;学习的类。 初始化&#xff1a;类的初始化程序接收神经网络&#xff08;模型&#xff09;和优化器(SGD、Momentum、AdaGrad、Adam) 学习&…

stm32 I2C、EEPROM

main.c 硬件结构如下&#xff0c;EEPROM 芯片(AT24C02)的 SCL 及 SDA 引脚连接到了 STM32 的 I2C 引脚中&#xff0c;结合上拉电阻&#xff0c;构成了 I2C 通讯总线&#xff0c;它们通过 I2C 总线交互。 EEPROM 芯片的设备地址&#xff1a;一共有 7 位&#xff0c;其中高 4 位…

stm32 I2C架构

STM32的 I2C 片上外设专门负责实现 I2C 通讯协议&#xff0c; 只要配置好该外设&#xff0c;它就会自动根据协议要求产生通讯信号&#xff0c;收发数据并缓存起来&#xff0c;CPU 只要检测该外设的状态和访问数据寄存器&#xff0c;就能完成数据收发。架构图如下所示。 通讯引脚…

多级放大电路

定义&#xff1a; 耦合方式、阻容耦合、变压器耦合、直接耦合、零点漂移、零漂 耦合方式&#xff1a;多级放大电路内部各级之间的连接方式称为耦合方式。常用的耦合方式有三种&#xff0c;阻容耦合、变压器耦合、直接耦合。 阻容耦合&#xff1a;电路的第一级与第二级之间通过…

放大电路频率响应基础概念

定义&#xff1a; 放大电路频率响应、幅频特性、相频特性、下限频率、上限频率、通频带、频率失真、波特图、高通电路、低通电路、共射截止频率、特征频率共、基截止频率。 放大电路频率响应&#xff1a;当放大电路输入不同频率的正弦波信号时&#xff0c;电路的放大倍数将有所…

skip gram模型的实现

CBOW模型的概率表示&#xff1a; P(A)&#xff1a;A发生的概率。 P(A,B)&#xff1a;事件A和事件B同时发生的概率&#xff0c;称为联合概率。 P(A|B)&#xff1a;在给定事件B的信息后&#xff0c;事件A发生的概率&#xff0c;称为后验概率。 CBOW模型&#xff1a;当给定某个…

stm32 SPI架构

STM32 芯片集成了专门用于 SPI 协议通讯的外设。 通讯引脚&#xff1a;SPI 硬件架构从 MOSI、MISO、SCK 及 NSS 线展开&#xff1b;STM32 芯片有多个 SPI 外设&#xff0c;它们的 SPI 通讯信号引出到不同的 GPIO 引脚上&#xff0c;使用时必须配置到这些指定的引脚。 SPI1是AP…

stm32 SPI、FLASH

main.c FLASH&#xff1a;掉电后数据不丢失&#xff0c;U 盘、SD 卡、SSD 固态硬盘、STM32 芯片内部用于存储程序的设备&#xff0c;都是 FLASH 类型的存储器。FLASH芯片(W25Q64)是一种使用 SPI 通讯协议的 NOR FLASH 存储器。 STM32 的 NSS 引脚是一个普通的 GPIO&#xff0c…

二分类负采样方法

多分类问题处理为二分类问题&#xff0c;需要能够正确地对正例和负例进行分类。 如果以所有的负例为对象&#xff0c;词汇量将增加许多&#xff0c;无法处理。作为一种近似方法&#xff0c;将只使用少数负例。 负采样方法&#xff1a;求正例作为目标词时的损失&#xff0c;同…

二分类改进CBOW

解决问题二&#xff1a;中间层的神经元和权重矩阵的乘积、Softmax 层的计算需要花费很多计算时间 第k个单词的 Softmax 的计算式如下&#xff0c;其中Si是第i个单词的得分。这个计算也与词汇量成正比&#xff0c;所以需要一个替代Softmax的计算。 使用 Negative Sampling (负采…

Embedding改进CBOW

假设词汇量为 100 万个时的 CBOW 模型如下&#xff0c;输入层和输出层存在 100 万个神经元。 下面两个问题导致耗时严重。 问题一、输入层的 one-hot 表示和权重矩阵的乘积。one-hot 表示占用内存过多&#xff0c;计算 one-hot 表示与权重矩阵 的乘积&#xff0c;需要花费大量…