设计需求:正点原子407芯片+USB接口。
1、USB基础知识
1.1USB发展历程
1.2 USB接口类型
USB的接口类型,根据接口形状不同,主要可以分为三大类:
1、TYPE类型
2、Mini类型
3、Micro类型
其中每一种大类中,又都可以分为两类A类和B类(如Type A、Type B)
TYPE类型
Micro系列
1.3 USB1.x/2.0接口的引脚定义及颜色
以嘉立创商城的商品编号为C456015,商品名称为AF 180°ZJB13.7的TYPE2.0为例。

bilibili:第199讲 提高篇-USB(下)_哔哩哔哩_bilibili
1.4 硬件设计思路
USB+磁珠的设计:满足EMC的需求,在电源端和地各连接一个磁珠,减少设备的噪声和USB电缆对主机的干扰
1、能有效地抑制USB线中的高频噪声和干扰信号,从而提高信号的清晰度和传输效率。它就像是一个小小的“过滤器”,能让信号传输更加纯净、稳定。
2、磁珠主要作用是抑制高频干扰,如果电路中两只磁珠的谐振频率为100MHz。那么在USB2.0的480Mbs通信时,这两只磁珠已经不再适用了。磁珠不是加了一定好,磁珠要根据抑制的频率选择,其谐振频率一定要高于至少5倍工作频率,在这个基础上再看阻抗等参数。
3、USB信号线需要共模电感/共模电容来滤除共模噪声,磁珠对共模噪声效果不大。
1.5 CH340G为USB转不同通讯的串口芯片
1.5.1 USB转UART
1.5.2 USB转RS232
MAX232是一种把电脑的串行口RS232信号电平(-10 ,+10v)转换为单片机所用到的TTL信号点平(0 ,+5)的芯片
1.5.3 USB转RS485
【往期直播】第三期 第2次直播 串口CH340G模块电路设计 完成实物焊接调试 51单片机下载程序调试 微信小程序蓝牙通信调试_哔哩哔哩_bilibili
1.5.4 USB电路设计(TTL)
GYJ-0016_USB-TTL通信模组 一款非常简单的USB转UART接口电路设计支持单片机下载程序及串口通讯 最高支持115200波特率_哔哩哔哩_bilibili
DTR#和RTS#是串行通信中的控制信号,用于管理和协调数据传输。
DTR#(Data Terminal Ready)是输出信号,表示数据终端(如计算机或单片机)已经准备好进行通信。在CH340G中,DTR#是输出引脚,通常连接到对端的DSR(Data Set Ready)输入引脚。在RS232标准中,低电平表示设备已上电并处于工作状态。
RTS#(Request to Send)是终端机的输出引脚,而CTS#(Clear to Send)是终端机的输入引脚。RTS#和CTS#用于实现硬件握手,以防止慢速终端接收数据时接收缓冲区溢出。当RTS#有效(高电平)时,表示本设备有数据要发送,并连接到对端的CTS#。当对端设备处理完缓冲区中的数据后,会在其RTS#引脚上发出有效信号,发送到本机的CTS#,本机检测到后开始发送数据。如果对端缓冲区已满,对端的RTS#引脚将变为无效(低电平),本机检测到后会暂停数据发送,直到对端RTS#再次有效。
1.5.5 电路设计
1.5.5.1 RS232电路设计(一)
VCC提供3.3V或5V供电。
四个电容产生+10V和-10V的电源,为RS232提供串口高低电平的需要。
1.5.5.2 RS232电路设计(二)
1.5.6.1 RS485电路设计(一)
发送数据过程
发送数据,用的是单片机的TX引脚,也就是说,在TX引脚上表现数据。要发送数据0x32,写成二进制就是0x00110010,TXD引脚上就会依次的用高低电平体现1和0。
当TX发送0时,三极管不导通,DE接高电平,进入发送模式,485芯片会把DI上的电平反应到AB引脚上输出,因为DI已经接地,所以AB引脚会传输0。所以,当TXD发送0时,AB引脚发送0。
当TX发送1时,三极管导通,RE接低电平,进入接收模式,485芯片的AB引脚进入高阻状态,因为R3把A拉高,R2把B拉低,所以,AB传输的是1。所以,当TXD发送1时,AB引脚发送1。
一句话:TXD发1,AB就发1;TXD发0,AB就发0。
接收数据过程
接收数据,用的是单片机引脚RX,在RXD引脚上表现数据。在接收数据的过程中,TX引脚是一直保持高电平的,当TXD是高电平时,RE是低电平,正好变成了接收状态,然后485芯片的RO引脚(也就是接RX的引脚)就会接收AB传输过来的数据。
1.5.6.2 RS485电路设计(二)
1.6计算机和MCU通信的方法
1.只有串口接口的台式机(很老)
交叉串口线>>>MAX232芯片>>>MCU(单片机)
2.既有串口接口又有USB接口的电脑(台式机)
(1)电脑串口接口>>>交叉串口线>>>MAX232芯片>>>MCU(单片机)
(2)电脑USB接口>>>USB转串口线>>>MAX232芯片>>>MCU(单片机)
(3)电脑USB接口>>>USB2.0数据线>>>PL2303或CH340>>>MCU(单片机)
3.只有USB接口的电脑(笔记本)
(1)电脑USB接口>>>USB转串口线>>>MAX232芯片>>>MCU(单片机)
(2)电脑USB接口>>>USB2.0数据线>>>PL2303或CH340>>>MCU(单片机)
1.7 407芯片I/0口的使用
立创商城找编号: C5269943的STM32F407VET6TR
确定需要USART的RX和TX口进行通讯。比如说,STM32的串口1的引脚对应的I/O位PA9、PA10。而PA9、PA10默认的功能都是GPIO,所以说当PA9、PA10引脚作为串口1使用的时候就是端口复用。
要将 I/O 配制成所需功能,请按照以下步骤操作:
1. 系统功能
将 I/O 连接到 AF0,然后根据所用功能进行配置:
— JTAG/SWD:在各器件复位后,会将这些引脚指定为专用引脚,可供片上调试模块立即使用(不受 GPIO 控制器控制)。
— RTC_REFIN:此引脚应配置为输入浮空模式。
— MCO1 和 MCO2:这些引脚必须配置为复用功能模式。
注意: 可禁止部分或全部 JTAG/SWD 引脚,以释放相关联的引脚供 GPIO 使用。
2. GPIO
在 GPIOx_MODER 寄存器中将所需 I/O 配置为输出或输入。
3. 外设复用功能
对于 ADC 和 DAC,在 GPIOx_MODER 寄存器中将所需 I/O 配置为模拟通道。
对于其它外设:
— 在 GPIOx_MODER 寄存器中将所需 I/O 配置为复用功能
— 通过 GPIOx_OTYPER、GPIOx_PUPDR 和 GPIOx_OSPEEDER 寄存器,分别选择类型、上拉/下拉以及输出速度。
— 在 GPIOx_AFRL 或 GPIOx_AFRH 寄存器中,将 I/O 连接到所需 AFx
4. EVENTOUT
配置用于输出 Cortex™-M4F EVENTOUT 信号的 I/O 引脚(通过将其连接到 AF15)
注意: EVENTOUT 不会映射到以下 I/O 引脚: PC13 、 PC14 、 PC15 、 PH0 、 PH1 和 PI8 。有关系统和外设的复用功能 I/O 引脚映射的详细信息,请参见数据手册中的“复用功能映射”表。
USART1_TX(AF7)-PB6,USART3_RX(AF7)-PB7
USART2_TX(AF7)-PD5,USART2_RX(AF7)-PD6
USART3_TX(AF7)-PC10,USART3_RX(AF7)-PC11
USART6_TX(AF8)-PC6,USART6_RX(AF8)-PC7
端口复用初始化步骤
接下来看一下端口复用初始化过程的步骤,拿串口1为例:
1、GPIO端口时钟使能。要使用到端口复用,首先是要使能端口的时钟了;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
2、复用的外设时钟使能。比如要将PA9、PA10引脚复用成串口,必须也要使能串口时钟;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
3、端口模式配置。在I/O复用位内置外设功能引脚的时候,必须设置GPIO端口的模式。**至于在复用功能下,GPIO的模式怎么设置,可以查看手册《STM32F4中文参考手册》。这里拿USART1为例,进行配置,要配置全双工的串口1,TX引脚需要推挽复用输出,RX引脚需要浮空输入或者上拉输入;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9//复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 PA.10 浮空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
void Serial_Init(void)
{
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //开启USART1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA9引脚初始化为复用推挽输出
/*USART初始化*/
USART_InitTypeDef USART_InitStructure; //定义结构体变量
USART_InitStructure.USART_BaudRate = 9600; //波特率
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制,不需要
USART_InitStructure.USART_Mode = USART_Mode_Tx; //模式,选择为发送模式
USART_InitStructure.USART_Parity = USART_Parity_No; //奇偶校验,不需要
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位,选择1位
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长,选择8位
USART_Init(USART1, &USART_InitStructure); //将结构体变量交给USART_Init,配置USART1
/*USART使能*/
USART_Cmd(USART1, ENABLE); //使能USART1,串口开始运行
}