当前位置: 首页 > news >正文

STM32学习-Keli仿真

前言

博主最近在学习单片机技术这门课程,其中在Keli仿真过程中遇到了一些问题,因此想写一篇总结文章,回顾一遍知识,也分享给有需要的小伙伴

本文适合有一定keli基础的小伙伴,这里推荐0基础的同学可以先从B站江协科技老师的课程开始学起

准备工作

1.stm32工程模板

2.keli5

ps: stm32工程请自行准备,这里没有提供。本文使用的工程模板基于stm32F103ZET系列

开始

1.配置工作

如图,点击魔术棒

image-20250919203053145

点击Debug并勾选 Use Simulator

image-20250919203138085

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

image-20250919204111594

在这种情况下点击红框所框选的按钮即可开始打开仿真界面

image-20250919204203344

如图,三个按钮功能已经标注,需要仿真的时候点击运行按钮即可

那么掌握了仿真的运行,如何查看IO口电平变化呢?

如图,点击小红框框选的按钮,出现的大红框框选的界面就是观测IO口电平状态的界面,也就是逻辑分析页面

image-20250919204639551

点击SetUP按钮进入配置页面

image-20250919204804843

点击框选的按钮新增检测的IO口

image-20250919204842817

如图,在新增的一栏输入 PORTB.5 其中PORT是固定项,后面跟着对应的IO口如:A,B,C等,填完端口号后跟端口序号格式为 .X

X填入要检测的对应端口序号,例如我要检测 PB5 ,那么填入的数据就为 PORTB.5 ,填完数据后回车就完成了端口的新增

image-20250919205346768

点击新增的那行数据,在Display Type选项中,需要选择Bit,在下方Color选项中选择自己喜欢的颜色即可,这个颜色就是对应IO口电平变化逻辑在逻辑分析窗口中的颜色,做完这一些,添加完所有需要监测的IO端口后即可点击Close关闭配置窗口

image-20250919205432740

如图,点击运行按钮后,逻辑分析窗口就显示了对应IO端口的电平状态变化,我这里设置的黑色为PB5,红色为PE5,就像前面所说的一样,两个端口分别在A,B两个任务作用下,以不同周期进行电平的反转

image-20250919205855286

如需观测静止的电平变化状态图,点击红框所示的按钮,这里显示Start是因为我已经暂停了,没有暂停的情况下显示的是Stop

image-20250919210224801

鼠标单击任意一处,比如我点击的两个端口高电平状态时刻,下方会显示对应的时间,简单来说就是可以判断IO口处于高低电平的时间,同样也可以用来判断翻转周期,例如这张图中,两个端口在4.5S的时候均处于高电平状态,至于如何测算周期时间,这个就留给聪明的小伙伴们思考了,这里就不多赘述

image-20250919210243194

还有就是,将鼠标移入逻辑分析界面内,滑动鼠标滚轮,即可实现界面的缩放,方便观测总体的电平状态

image-20250919210552175

波形观测部分就介绍到这里,看到这里,相信大家已经学会了逻辑分析界面的基础用法,还有更多用法还请各位小伙伴自行探索

模拟输入(模拟按钮)

在这个模块当中,我会演示如何模拟一个按钮来进行对应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;
}

点击红框框选的选项

image-20250919211022375

如图所示点击按钮对应的端口,这里拿GPIOA(也就是PA)端口演示

image-20250919211725281

如图所示就是配置界面

image-20250919211906301

点击对应端口,如在我这里配置的PA0为按钮的端口就要点击PA.0,需要配置的选项已经框出

image-20250919212316309

如图点击红框框选的最右侧的方框,该方框代表的是0号端口电平状态,点击打勾就是输入高电平,反之就是输入低电平,从右往左分别为0、1、2、3…号引脚,由于PA0为下拉模式,所以打勾输入高电平相当于按下按钮,没有打勾输入低电平相当于释放按钮

image-20250919213129604

如图,红框框选的为PE2、3、4端口初始化配置,因为他们是上拉模式,所以默认需要打勾输入高电平,也就是释放按钮的状态(没有按下),当取消打勾输入低电平,相当于按下按钮

image-20250919213426065

至此,你已经学会了如何模拟按钮输入,结合逻辑分析界面,即可观察按钮按下使对应端口电平翻转的效果

结尾

恭喜大家完成了keli仿真的基础操作,非常感谢大家能看到这里,如果大家觉得本文对你们有帮助的话可不可以一键三连,谢谢大家!后续也有可能会出stm32对应的学习教程,还望大家多多支持,我们下期见!

http://www.dtcms.com/a/391099.html

相关文章:

  • LeetCode hot 100 解题思路记录(一)
  • 01-搭建后端django项目
  • 深入探索卷积神经网络:从基础到高级架构(一)
  • 【大数据社科交叉方向会议】第六届大数据与社会科学国际学术会议(ICBDSS 2025)
  • 计算机网络 知识点梳理及讲解(二)物理层:编码调制、传输媒体、信道复用、宽带接入等
  • 学习嵌入式的第三十八天——ARM——概述
  • 初级会计【备考】
  • Windows系统忘记用户名密码怎么办
  • 市场部绩效考核关键指标与市场分析
  • 嵌入式 - ARM8
  • MongoDB备份数据库
  • 【OpenGL】LearnOpenGL学习笔记23 - ShadowMap、PCF
  • MongoDB文档规范
  • 让设计、办公、创作效率翻倍的技术文章大纲
  • 能不能写一个linux下类vim的编辑器
  • Linux02: 编辑器nano的常用技巧
  • UDP和TCP对比通俗讲解
  • 【ReText】1.3 Python multiprocessing 库详解
  • Liunx系统下出现“Could not resolve host: mirrorlist.centos.org; 未知的错误”地解决方案
  • CentOS Stream 9安装系统(LVM扩容案例)
  • Docusign AI 全球化:构建安全、合规的多语言协议管理
  • C# 基于halcon的视觉工作流-章37-零件测量
  • 第二部分:VTK核心类详解(第38章 vtkPointData点数据类)
  • 木卫四科技 × 一汽解放商用车开发院: 共驱商用车 AI 研发新程
  • 【C++闯关笔记】STL:stack与queue的学习和使用
  • [HCTF 2018] WarmUp
  • Vue 学习随笔系列二十六 —— 动态表头
  • BIM 可视化运维平台 + IBMS 中央集成系统一体化解决方案:构建虚实融合的智慧运营中枢
  • XSUN_DESKTOP_PET(桌面宠物)
  • 具身智能VR遥操开发记录