STM32学习-Keli仿真
前言
博主最近在学习单片机技术这门课程,其中在Keli仿真过程中遇到了一些问题,因此想写一篇总结文章,回顾一遍知识,也分享给有需要的小伙伴
本文适合有一定keli基础的小伙伴,这里推荐0基础的同学可以先从B站江协科技老师的课程开始学起
准备工作
1.stm32工程模板
2.keli5
ps: stm32工程请自行准备,这里没有提供。本文使用的工程模板基于stm32F103ZET系列
开始
1.配置工作
如图,点击魔术棒
点击Debug并勾选 Use Simulator
2.常见仿真操作
波形观测
首先要介绍的就是如何观测波形变化,这个功能最经常使用,可以直观的查看IO口电平变化状态
在该代码中,我们分别初始化了GPIOB GPIOE GPIOD的5号引脚
#include "LED.h"void LED_GPIO_Init(void){
//步骤1 使能对应GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟LED0RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//开启GPIOE的时钟LED1RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//步骤2 调用GPIO初始化函数初始化对应GPIO口GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出模式GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//5引脚GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_Init(GPIOE,&GPIO_InitStructure); GPIO_Init(GPIOD,&GPIO_InitStructure);
}//步骤3 调用GPIO库函数及延时函数实现LED闪烁
void LED_Control(void){LED0=!LED0;LED1=!LED1;LED2=!LED2;SystickDelayMs(100);
}
在本文使用的项目模板当中有定时分任务功能,这里我设定A任务周期为100ms,B任务为150ms,两个任务分别对PB5、PE5两个IO端口进行电平翻转,这里不写具体代码,代码功能就是描述的这样
那么如何进行仿真并且查看IO口的电平状态呢?
如图,点击编译之后,工程输出为 0 Error, 0 Warning
在这种情况下点击红框所框选的按钮即可开始打开仿真界面
如图,三个按钮功能已经标注,需要仿真的时候点击运行按钮即可
那么掌握了仿真的运行,如何查看IO口电平变化呢?
如图,点击小红框框选的按钮,出现的大红框框选的界面就是观测IO口电平状态的界面,也就是逻辑分析页面
点击SetUP按钮进入配置页面
点击框选的按钮新增检测的IO口
如图,在新增的一栏输入 PORTB.5
其中PORT是固定项,后面跟着对应的IO口如:A,B,C等,填完端口号后跟端口序号格式为 .X
X填入要检测的对应端口序号,例如我要检测 PB5
,那么填入的数据就为 PORTB.5
,填完数据后回车就完成了端口的新增
点击新增的那行数据,在Display Type
选项中,需要选择Bit
,在下方Color选项中选择自己喜欢的颜色即可,这个颜色就是对应IO口电平变化逻辑在逻辑分析窗口中的颜色,做完这一些,添加完所有需要监测的IO端口后即可点击Close
关闭配置窗口
如图,点击运行按钮后,逻辑分析窗口就显示了对应IO端口的电平状态变化,我这里设置的黑色为PB5,红色为PE5,就像前面所说的一样,两个端口分别在A,B两个任务作用下,以不同周期进行电平的反转
如需观测静止的电平变化状态图,点击红框所示的按钮,这里显示Start是因为我已经暂停了,没有暂停的情况下显示的是Stop
鼠标单击任意一处,比如我点击的两个端口高电平状态时刻,下方会显示对应的时间,简单来说就是可以判断IO口处于高低电平的时间,同样也可以用来判断翻转周期,例如这张图中,两个端口在4.5S的时候均处于高电平状态,至于如何测算周期时间,这个就留给聪明的小伙伴们思考了,这里就不多赘述
还有就是,将鼠标移入逻辑分析界面内,滑动鼠标滚轮,即可实现界面的缩放,方便观测总体的电平状态
波形观测部分就介绍到这里,看到这里,相信大家已经学会了逻辑分析界面的基础用法,还有更多用法还请各位小伙伴自行探索
模拟输入(模拟按钮)
在这个模块当中,我会演示如何模拟一个按钮来进行对应IO端口的反转操作
这是按钮初始化的示例代码,我初始化了PE2、3、4 PA0四个个端口作为按钮输入端口,并且采用不同模式,如PA0使用下拉模式,PE2、3、4采用上拉模式,关于上拉、下拉模式这里只做简单介绍,具体还需各位小伙伴自行学习
上拉模式: 简单来说就是在按钮没有按下的时候IO口为高电平,按下后接地,IO口为低电平
下拉模式: 按钮没有按下时候IO空为低电平,按下后IO口为高电平
#include "Key.h"//初始化Key的GPIO口
void Key_GPIO_Init(void){
//开A、E口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
//初始化
GPIO_InitTypeDef GPIO_InitStructure;
//PE4/3/2上拉输入
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_Init(GPIOE,&GPIO_InitStructure);//PA0下拉输入
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}//按键读取
//Key0,1,2 未按:1,按下:0
//Key_UP 未按:0,按下:1
u8 Key_Scan(void){//按键释放标志static u8 key_release=1;if(key_release&&(1==Key_Up||0==Key0||0==Key1 ||0==Key2)){//按键消抖动SystickDelayMs(7);key_release=0;if(1==Key_Up)return Key_Up_Value;else if(0==Key0)return Key0_Value;else if(0==Key1)return Key1_Value;else if(0==Key2)return Key2_Value;
// else return 0;}else if(0==Key_Up && 1==Key0 && 1==Key1 && 1==Key2)key_release=1; return 0;
}
点击红框框选的选项
如图所示点击按钮对应的端口,这里拿GPIOA(也就是PA)端口演示
如图所示就是配置界面
点击对应端口,如在我这里配置的PA0
为按钮的端口就要点击PA.0
,需要配置的选项已经框出
如图点击红框框选的最右侧的方框,该方框代表的是0号端口电平状态,点击打勾就是输入高电平,反之就是输入低电平,从右往左分别为0、1、2、3…号引脚,由于PA0为下拉模式,所以打勾输入高电平相当于按下按钮,没有打勾输入低电平相当于释放按钮
如图,红框框选的为PE2、3、4端口初始化配置,因为他们是上拉模式,所以默认需要打勾输入高电平,也就是释放按钮的状态(没有按下),当取消打勾输入低电平,相当于按下按钮
至此,你已经学会了如何模拟按钮输入,结合逻辑分析界面,即可观察按钮按下使对应端口电平翻转的效果
结尾
恭喜大家完成了keli仿真的基础操作,非常感谢大家能看到这里,如果大家觉得本文对你们有帮助的话可不可以一键三连,谢谢大家!后续也有可能会出stm32对应的学习教程,还望大家多多支持,我们下期见!