单片机学习小组
直播中

回头太晚

9年用户 840经验值
擅长:可编程逻辑 电源/新能源
私信 关注

如何用使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形

什么是串口协议?串口协议与RS232电平与TTL电平的区别在哪?
如何用使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形?

回帖(1)

赵娜

2022-2-24 15:22:37
一、题目要求


二、 串口协议和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的软件仿真逻辑分析仪功能观察管脚的时序波形,在实验也遇到了很多的问题,但是经过网上查找资料,以及同学的帮助,完成了这次实验,还是挺有收获的,明白了要将理论运用到实践,这样也提高了我们的动手能力,也让我们学到更多的新知识。
举报

更多回帖

×
20
完善资料,
赚取积分