一、题目要求
二、 串口协议和RS—232标准,RS232电平与TTL电平的区别,以及"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。
1、串口协议
什么是串口协议?
串口协议又指串口通信,串口通信指串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。
设备之间的通信方式一般分为串行通信和并行通信。
按照通信方式,分为:同步通信和异步通信。
按照数据的传输方向,串口通信分为:单工、半双工、全双工。
常见串口通信接口:
(一)STM32串口通信
STM32的串口通信接口有两种,分别是:UART(通用异步收发器)和USART(通用同步异步收发器),对于大容量STM32F10x系列芯片,分别有3个USART和2个UART。
UART有4个pin(VCC, GND, RX, TX), 用的TTL电平, 低电平为0(0V),高电平为1(3.3V或以上)。如下图:
UART引脚连接方法:
芯片1的RxD连接芯片2的TXD,芯片2的RXD连接芯片1的TXD,GND接GND,然后这两个芯片之间就可以进行TTL电平通信了。
(二)RS-232
RS-232是PC机与通信工业中应用最广泛的一种串行接口。RS-232被定义为一种在低速率串行通讯中增加通讯距离的单端标准。RS-232采取不平衡传输方式,即所谓单端通讯。
虽然PC机和芯片都有TXD和RXD引脚,但是通常PC机(或上位机)通常使用的都是RS232接口(通常为DB9封装),因此不能直接交叉连接。因此,要想使得芯片与PC机的RS232接口直接通信,需要也将芯片的输入输出端口也电平转换成rs232类型,再交叉连接。
芯片串口和rs232的电平标准:Rs232的电平标准:+15/+13 V表示0,-15/-13表示1;单片机的电平标准(TTL电平):+5V表示1,0V表示0。
连接方式:在单片机串口与上位机给出的rs232口之间,通过电平转换电路,实现TTL电平与RS232电平之间的转换。
RS232接口:
通信过程中只有两个脚参与通信,所以在电路连接时,我们只需要连接三个脚即可。2脚:电脑的输入RXD,3脚:电脑的输出TXD 通过2 ,3 脚就可以实现全双工(可同时收发)的串行异步通信,5脚:接地。
PC串口与单片机串口连接方式:
其中,DB91是在电脑上的 DB92是在单片机实验板上焊接着的。如果电脑没有rs232口,只有USB口,可以用串口转接线转出串口,在电脑上位机上需要安装驱动程序。
(三)TTL电平与RS—232电平的区别
TTL电平标准:输出 L: 《0.8V ; H:》2.4V;输入 L: 《1.2V ; H:》2.0V。TTL器件输出低电平要小于0.8V,高电平要大于2.4V。输入,低于1.2V就认为是0,高于2.0就认为是1。于是TTL电平的输入低电平的噪声容限就只有(0.8-0)/2=0.4V,高电平的噪声容限为(5-2.4)/2=1.3V。
。比TTL有更高的噪声容限。
RS232标准:逻辑1的电平为-3~-15V,逻辑0的电平为+3~+15V,注意电平的定义反相了一次。
TTL232:晶体管-晶体管逻辑集成电路。
RS232:数据终端设备( DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准。
TTL:是以某个固定的速率去传输的,但是可以传输多个bit比特位。
RS232:以固定的某个速率(1200bps,9600bps,115200bps等),一次只能只传输一个bit比特位。
(四)USB/TTL转232(以CH340为例)
USB转串口模块可以使用5V、3V3电压供电,需要将跳线帽进行安装。可以对USB转串口模块进行测试,将USB的电压引脚用跳帽接上,然后将RXD和TXD两个引脚用跳帽或者杜邦线接上。然后打开串口终端,点击“手动发送”或者“自动发送”,如果在接收区可以接收到数据,说明USB转串口模块工作正常,否则需要检查接线是否正确、电路板元器件是否损坏。
VCC接线是为了单片机供电,USB转串口的RXD引脚与单片机的TXD引脚相连,USB转串口的TXD引脚与单片机的RXD引脚相连,两者的GND引脚直接相连,如下图:
2、stm32的USART的串口通信(查询方式)
(一)内容
完成一个STM32的USART串口通讯程序(查询方式即可,暂不要求采用中断方式),要求:
1)设置波特率为115200,1位停止位,无校验位;
2)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。
3)在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。 请用此功能观察串口输出波形,并分析其波形反映的时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。
(二)安装CH340驱动
安装已完成
在电脑设备管理器处查看有无com端口出现,有即可证明成功。
(三)代码建立工程
只需要修改下usart.c和test.c文件即可。
在SYSTEM组下双击usart.c,其中的uart_init函数,代码如下:
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("rn Hello Windows! rnrn");
for(t=0;t
{ USART1->DR=USART_RX_BUF[t]; while((USART1->SR&0X40)==0);//等待发送结束 } printf("rnrn");//插入换行 USART_RX_STA=0; }else { times++; if(times%200==0)printf("Hello Windows!rn"); delay_ms(10); } } }
编译成功后烧录:
(四)串口助手观察输出
打开XCOM串口助手,弹出界面点击打开串口,即可以接收到C8T6发送的数据Hello Windows!
3、KEIL观察串口输出的波形
在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。 用此功能观察串口输出波形,并分析其波形反映的时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。
我们可以看出PA9、PA10波形是一条直线,没有变化。
三、stm32CubeMX+Keil使用HAL库点灯,并使用逻辑分析仪观察周期
1、stm32CubeMX点亮LED灯
(一)内容
安装 stm32CubeMX,配合Keil,分别尝试使用寄存器地址方式(汇编或C,不限) 和HAL库这两种方式,完成下列任务: 1、重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯的周期闪烁。 2、在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。 请用此功能观察3个GPIO端口的输出波形,并分析其波形反映的时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。
(二)准备工作
安装完成之后,点击help,下载依赖包
选择自己的芯片,选上前面的复选框就可以下载了,前面是绿色就代表已经下载好了。
包下载好之后就可以了,后面回到home界面,创建新项目。在part name那输入自己的芯片,这里以STMC8T6举例,然后在中间回出现一列信息,点击之后再点击start project就行了。
点击System Core,进入里面的SYS,在debug那里选择Serial Wire。
接下来就是配置时钟了,进入上面的rcc,有两个时钟,一个是hse和lse,我们要用是GPIO接口,而这些接口都在APB2里。 接下来观察时钟架构,APB2总线的时钟由hse控制,同时在这个界面得把PLLCLK右边选上。
所以我们将hse那里设为Crystal/Ceramic Resonator就行了。
接下来就是点击相应的引脚设置输出寄存器了,就是output那一项,一共选了三个,是PA7,PB9,PC15。设置还没完,点击System core里的GPIO,把点击引脚名,把输出等级改为high,其实这里不改也没什么,只是程序运行开始时初始状态不一样,mode不用改
点击project manager,配置好自己的路径和项目名,然后IDE那项改为MDK-ARM。
进入code generate界面,选择生成初始化.c/.h文件,后面点击generate code就行了。
(三)stm32CubeMX生成代码
进入对应文件夹,再打开MDK-ARM文件夹,通过keil打开刚刚生成的项目。
通过这个目录打开main.c文件,到主函数那一部分。
将下面代码放入主函数中(替代里面的内容)。
SystemClock_Config();//系统时钟初始化 MX_GPIO_Init();//gpio初始化 while (1) { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);//PA7亮灯 HAL_Delay(500);//延时0.5s HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);//PA7熄灯 HAL_Delay(500);//延时0.5s HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯 HAL_Delay(500);//延时0.5s HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯 HAL_Delay(500);//延时0.5s
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯 HAL_Delay(500);//延时0.5s
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯 HAL_Delay(500);//延时0.5s
}
(四)编译、烧录
烧录
(五)结果
2、keil观察3个GPIO端口的输出波形
(一)仿真模式的设置
在使用仿真模式时,需要进行Debug模式设置,下图是Debug设置模式。
(二)逻辑分析仪
设置完成后,开启调试模式,打开逻辑分析仪。 直接以 PORTX 的形式输入,内容取决于代码中定义的管脚。
我们需要将Display Type处设置为Bit。 得到波形图:
四、实验总结
通过这次实验我们了解了什么是串口协议,串口协议和RS—232标准,RS232电平与TTL电平的区别。以及如何用使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,在实验也遇到了很多的问题,但是经过网上查找资料,以及同学的帮助,完成了这次实验,还是挺有收获的,明白了要将理论运用到实践,这样也提高了我们的动手能力,也让我们学到更多的新知识。
|