![在这里插入图片描述](https://img-blog.csdnimg.cn/2dfde6bd517c49a2b8f0e892624ac244.png
TX: 发送数据输出引脚。
RX: 接收数据输入引脚。
SW_RX: 数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引 脚。
nRTS: 请求以发送(Request To Send),n表示低电平有效。如果使能 RTS流控制,当 USART 接收器准备好接收新数据时就会将 nRTS变成低电平;当接收寄存器已满时, nRTS将被设置为高电平。该引脚只适用于硬件流控制。
nCTS: 清除以发送(Clear To Send),n 表示低电平有效。如果使能 CTS流控制,发送 器在发送下一帧数据之前会检测 nCTS引脚,如果为低电平,表示可以发送数据,如果为 高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。 SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。
一般使用 8位数据字长。
若是芯片与PC机(或上位机)相连,除了共地之外,就不能这样直接交叉连接了。
尽管PC机和芯片都有TXD和RXD引脚,但是通常PC机(或上位机)通常使用的都是RS232接口(通常为DB9封装),因此不能直接交叉连接。
RS232接口是9针(或引脚),通常是TxD和RxD经过电平转换得到的。因此,要想使得芯片与PC机的RS232接口直接通信,需要也将芯片的输入输出端口也电平转换成rs232类型,再交叉连接。
经过电平转换后,芯片串口和rs232的电平标准是不一样的:
单片机的电平标准(TTL电平):+5V表示1,0V表示0;
Rs232的电平标准:+15/+13 V表示0,-15/-13表示1。
RS-232通讯协议标准串口的设备间通讯结构图如下:
因此,单片机串口与PC串口通信遵循下面的连接方式:
在单片机串口与上位机给出的rs232口之间,通过电平转换电路,实现TTL电平与RS232电平之间的转换。
RS232接口(封装D89)
通信过程中只有两个脚参与通信,电路连接时,连接三个脚即可。
2脚:电脑的输入RXD
3脚:电脑的输出TXD 通过2 ,3 脚就可以实现全双工(可同时收发)的串行异步通信
5脚:接地
PC串口与单片机串口连接方式:
其中,DB91是在电脑上的 DB92是在单片机实验板上焊接着的
如果电脑没有rs232口,只有USB口,可以用串口转接线转出串口,在电脑上位机上需要安装驱动程序。
用串口通信比USB简单,因为串口通信没有协议,使用方便简单。
USB转串口模块可以使用5V电压供电,需要将跳帽按下图安装。
USB转串口模块可以使用3.3V电压供电,需要将跳帽按下图安装。
可以对USB转串口模块进行测试,将USB的电压引脚用跳帽接上,然后将RXD和TXD两个引脚用跳帽或者杜邦线接上。
然后打开串口终端,点击“手动发送”或者“自动发送”,如果在接收区可以接收到数据,说明USB转串口模块工作正常,否则需要检查接线是否正确、电路板元器件是否损坏。
USB转串口电路板与单片机的接线图,VCC接线是为了单片机供电,USB转串口的RXD引脚与单片机的TXD引脚相连,USB转串口的TXD引脚与单片机的RXD引脚相连,两者的GND引脚直接相连。
完成一个STM32的USART串口通讯程序(查询方式即可,暂不要求采用中断方式),要求:
(1)设置波特率为115200,1位停止位,无校验位;
(2)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。
(3)在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。 请用此功能观察串口输出波形,并分析其波形反映的时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。
STM32F103C8T6最小核心板
USB转TTL
CH340驱动(USB串口驱动)_XP_WIN7共用
串口调试助手XCOM V2.3
连接示意表
下载链接:
CH340/CH341
Windows 驱动链接:https://www.wch.cn/download/CH341SER_EXE.html/
打开网页,点击下载
下载好后,点击应用程序,再点击安装
在电脑设备管理器处查看有无com端口出现,有即可证明成功。
建立模板要用到的SYSTEM文件及启动文件,包括点灯时需要的C8T6数据手册,以及烧录用到的FlyMcu,网盘自取。
链接:https://pan.baidu.com/s/1jxbVCa_filfR9ZRlmP6SMw
提取码:k4lv
以下步骤都在keil下操作
在下载的SYSTEM组下,只需修改usart.c和编写写test.c文件即可。
在usart.c修改的代码如下
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB2ENR|=1<<14; //使能串口时钟
GPIOA->CRH&=0XFFFFF00F;//IO状态设置
GPIOA->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTR|=1<<14; //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; //1位停止,无校验位.
#if EN_USART1_RX //如果使能了接收
//使能接收中断
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
#endif
}
在test.c中修改的代码:
#include "sys.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
u16 t; u16 len; u16 times=0;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,115200); //串口初始化为115200
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3FFF;//得到此次接收到的数据长度
printf("\r\n Hello Windows! \r\n\r\n");
for(t=0;tDR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待发送结束
}
printf("\r\n\r\n");//插入换行
USART_RX_STA=0;
}else
{
times++;
if(times%200==0)printf("Hello Windows!\r\n");
delay_ms(10);
}
}
}
打开Stm32CubeMX并创建工程
选择stm32F103C8开发板,开始工程
Mode选择异步通信(Asynchronous):
勾选Enabled:
配置项目设置(名称、位置、环境):
生成项目:
uint8_t hello[20]="hello windows!\n";
void Delay_wxc( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
while (1)
{
HAL_UART_Transmit(&huart1,hello,20,100000);
Delay_wxc(3500); //这里每个人电脑不一样发送的间隔时延需要自己调整尝试
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
打开FlyMcu 选择刚刚程序编译生成的hex文件,并搜索串口并烧录
打开XCOM串口观察小助手
keil没有成功build的话,可能是代码本身问题,也可使魔法棒里的一些设置问题。烧录没成功可能是实验操作时的一些没有注意到的小问题,一步一步的找出问题,实践出真知,都能解决的。
https://blog.csdn.net/qq_43328313/article/details/106439088
https://blog.csdn.net/qq_46467126/article/details/120841504?spm=1001.2014.3001.5502