在这个实验中, 我们使用按钮来控制灯的亮灭,
但是其中加入了消抖处理
什么是抖动?
如果你再之前的实验中仔细观察过了按下按钮的情况, 你就会发现,
有的时候按下按钮灯闪动了几下 – 跳变
这个就是我们说的按键抖动,
通常是因为人按下的时候的各种不精确导致按钮在极短时间内两端的电平多次变化
而消除这种不确定的变化,
让我们的灯开关更加完美的方式就是消抖
消抖的通常手段
用来消抖的通常最好的方式就是等着, 也就是说,
你每次按下按钮, 按下和抬起两个过程是发生抖动的时候,
一般我们关注的是按下的过程
在你按下按钮的这个过程中抖动发生, 我们不想要这个抖动,
想要直接跳过这个抖动的过程去获得之后按钮被按下这个确定的状态
于是我们用上的手段是等待 , 等待这个抖动的过程过去,
这个抖动的时间通常很短, 凭借经验值我们使用 10ms 的等待让抖动消失
看到这里, 我默认你们前面的实验都好好自己去做了,
在这里我不会再费口舌去解释一大堆东西, 直接开始配置吧!
Step 1 - CubeMX 配置
Step 2 - 写代码
编写回调函数
在这里我们有两个中断回调等待我们去写一个是定时器 ...
这个实验我们还是做小灯闪烁(间隔 1s), 但是我们不用
HAL_Delay(), 而是使用定时器中断
这里默认你已经看过了前面的实验篇或者会配置 CubeMX 的 cmake 工程,
基础的配置, 比如初始化 PC13 等等这些我不再重复,
这里只提到有关定时器的新的部分
Step 1 - 启用TIM3
为什么用TIM3?, 因为他是一个通用时钟(我们只要用到这个就行了),
这个在我的原理篇中有讲每个时钟分别是什么类型
勾选上 Internal Clock
这个表示使用内部时钟信号(你在时钟树上看到的那个 APB2
Timer clocks), 不是使用内部时钟(Systick)
我们 为了间隔 1s, 需要将 PSC 配置为 7199; ARR 配置为 9999;
Counter mode 配置为 up; auto-reload preload 配置为 Enable
给 TIM3 启用中断, 来到 NVIC(中断控制器), 选择启用
Step 2 - 写代码
调用使能定时器中断的函数 HAL_TIM_Base_Start_IT();
我们需要在 main 函数里面 ...
定时器的具象化理解
定时器(Timer, TIM)
你正在写作业, 并且设定了25min 的番茄钟. 那么番茄钟🍅就会每 25min
叫你一下, 番茄钟就是一个定时器
这种定时完成任务的方式, 就利用了定时器(Timer, TIM)
但是在单片机中, 定时器的功能远比定期执行任务更多,
这里只以定时器中断这一功能作为切入点, 带你了解定时器以及它的相关参数,
如果想知道它的其他功能, 比如 PWM 波生成, 可以课外了解或者以后会讲
SysTick 和 TIM的区别
你可能记得, 我们在之前点灯的时候用到过了 HAL_Delay()
这个函数用来延时, 它的逻辑是进入这个函数之后让整个 CPU 死等, 直到结束,
这就是我们说的阻塞式等待, 它也会用到定时器, 叫做
SysTick
在这里我们必须分清楚系统定时器 SysTick
和外设定时器 TIM
有什么区别了
最明显的区别是, 他们的位置不一样: SysTick
是内核定时器, 它处在内核中, TIM 是外设定时器,
他处在独立的外部设备中, 所以我们需要一个 GPIO 口来利用它
TIM
我们现在知道了中断是什么, 它 ...
从 STM32 的
__weak 说起:弱符号、回调函数与虚函数
读 STM32 HAL 库的源码时,你会发现一个奇怪的关键字 __weak
比如处理 GPIO 外部中断的这段代码:
1234567891011121314void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin){ if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); HAL_GPIO_EXTI_Callback(GPIO_Pin); // 调用回调 }}__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ UNUSED(GPIO_Pin); /* NOTE: 这个函数不应被修改;需要时,请在用户文件里实现 HAL_GPIO_EXTI_Callback */}
HAL_GPIO_EXTI_Callback 是个空函数,前面挂着
__weak,注释还说”别改我,要用就去别处重写”。这到底是 ...
现在我们来看看在现实中我们如何具体的利用中断
我们的计划是这样的, 使用按钮来控制 LED 的亮还是灭
一开始默认是灯灭, 按钮被按下, 灯亮, 按钮再次被按下, 灯灭
这个与实验一相衔接, 你可以直接在实验一的工程上进行配置,
也可以再新开一个工程, 不过要注意将小灯等东西给配置好
接下来我在实验一的基础上开始继续讲解
Step 0 - 接线
将按钮的左右两边分别连接在 PA1 和 GND 上
Step 1 - 配置中断引脚
在芯片图中我们选择一个引脚, 这里以 PA1 为例, 将它配置为
GPIO_EXIT1
然后我们来到 GPIO
配置界面
来到 GPIO 配置界面, 选择我们的 PA1 口, 模式选择 External
Interrupt Mode with Falling edge trigger
detection, 同时将 GPIO 配置成上拉
这里解释一下 Falling edge和 Rising edge
都是什么意思
翻译成中文就是 上升沿 - Rising edge, 下降沿
- Falling edge
上升沿就是电平从低到高, 上升了,
就是 ...
中断的具象理解
在日常生活中, 中断其实十分常见, 一个很形象的例子是: 你在打电脑,
然后你的朋友突然来敲门(一个事件), 你放下电脑转身去开门, 这就是中断,
你朋友的到访打断了你正在做的事情,
这就是中断的具象理解.
其实在单片机的世界中也是这样的, 我们在执行主程序的时候,
如果有一个中断程序发生了,
那么它会打断我们主程序的执行, 让 MCU
先去处理这个中断任务, 处理完成之后再回过头来继续执行主程序
中断也有优先级
还是上面这个例子, 你在打电脑, 然后你的朋友来敲门,
但是同一时间, 你把蜜雪冰城不小心倒在了电脑上.
你顾不得朋友正在敲门了, 你必须马上把电脑擦干净.
也就是说奶茶抢占了你的给朋友开门,
因为他的优先级更高
在单片机中也是同样的, 你可以添加多个中断,
中断的发生按照他们的优先级进行排序,
优先级越高的中断它越先被执行, 因为它抢占了别人
嵌套 刚刚说的是同一时间发生的事,
如果低优先级的中断先发生了,
并且正在执行,
这时有另一个更高优先级的中断后发生了,
这个更高优先级的中断会打断低优先级的中断,
也就是说低优先级的中断会被挂起,
于是处理器会先执行 ...
CubeMX + CLion 从零配置教程
适用平台:macOS 和 Windows
适用对象:已用 STM32CubeMX 生成 CMake
工程,想用 CLion 编译、烧录、调试 STM32F103(Blue
Pill)的人 支持调试器:ST-Link / J-Link / DAPLink
工具链:ARM GNU Toolchain(arm-none-eabi-gcc)+ Ninja +
OpenOCD + CLion 自带 CMake
本教程从「CubeMX 已经把工程导出成 CMake 之后」讲起。CubeMX 那边记得在
Project Manager → Toolchain/IDE 选
CMake,这样才能用 CLion 打开
本篇教程为了确保逻辑严谨与 Claude opus 4.8 联合编写
目录
整体流程概览
安装电脑端必备工具
macOS
Windows
验证安装
在 CLion 里配置工程
配置 OpenOCD
烧录与调试
硬件接线与点灯
常见问题排查
附录:上传 GitHub
时提交什么、忽略什么
一、整体流程概览
整条链路是这样的:
1234 ...
Maximum output speed:
指的是引脚输出驱动器的翻转速率(slew
rate),也就是引脚电平在高低之间切换时,边沿能跳得多快(上升/下降时间多短),而不是指你能多快地去翻转这个引脚
打个最贴切的比方——把它想成拧水龙头:
你多久开关一次水龙头
这是你程序里翻转引脚的频率(闪灯快慢),由你的代码决定,跟这个设置无关
你是猛地一拧还是慢慢拧 这才是 Maximum output
speed 管的东西
不论你是猛拧还是慢拧,最后流出来的水是一样多的(电平照样到 3.3V 或 0V)
区别在于: 猛地一拧,水管会”哐”地震一下; 慢慢拧,水流则平稳没声音
电路里也是一模一样的道理,
如果边沿跳得太猛,会产生电磁干扰和信号上的振铃/过冲
在下面这张图中,
两条波形开关的次数完全一样(频率相同),唯一的区别就是每次跳变的陡峭程度,
看图就很清楚了
那为什么不一律选高速,跳得越快越好?
因为陡峭的边沿有缺点:
跳得越陡(速度高):好处是能输出很快的信号(比如高速
SPI、高频时钟);坏处是电磁干扰(EMI)更大、更费电,而且容易在信号上产生过冲和振铃
跳得越缓(速度低 ...
Gitkraken
最新版v9、v10全平台Pro版激活教程
一、 免责声明
所有内容资源均来源于网络,仅供交流学习与研究使用,版权归属原版权方所有,版权争议与本人无关,用户本人下载后不能用作商业或非法用途,否则后果均由用户承担责任;
如果您访问和下载此文件,表示您同意只将此软件用于参考、学习而非其他用途,否则一切后果请您自行承担,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
如果您喜欢该软件,请支持正版软件,购买注册,得到更好的正版服务。
二、软件安装
此工具支持破解 Gitkraken V8.2.0 ~
V10.x(最新版),直接从官网下载最新的安装包即可,如后续破解工具失效,可先回退到旧版进行激活
(亲测 v9.x~v10.5.0 都可用)
官网下载地址:Gitkraken
2.1 MacOS用户
下载安装包,(解压)并安装
如果是从官网下载的最新安装包,后缀为
.dmg,下载完直接双击运行,会提示拖动到
Applications
中,然后就会在启动台(开始菜单)看到图标。
如果你下载的稍旧点的版本(后缀为
.zip),在”访达”页面解压完后双 ...
Topsis法的具象理解
Topsis 法是从现有评价目标中,
构建出最优目标和最劣目标,
计算各个评价与最优目标和最劣目标的距离,
得出其与理想化目标的相对接近程度并排序
示范: 我们有一个这样的案例
我们需要找到 - 最优方案:
是每个指标实际出现的最大值 - 最差方案:
是每个指标实际出现的最小值
然后我们通过计算各个不同方案与最优目标和最劣目标的距离,
再按照相对接近程度进行排序
评价结果的最优解必须是最接近最优解的同时最远离最劣解的方案
进行的流程
第一步:
原始矩阵正向化
什么是正向化为什么需要正向化? 不同的指标的”最好”是不一样的,
比如下面这个例子
极大型指标 - 师资,
师资我们希望越大越好
极小型指标 - 学费,
学费我们希望越低越好
中间型指标 - 班级人数, 我们希望40
人最好
区间型指标 - 年均气温, 希望在16 - 18
度之间最好
那么根据下面的公式确定数据的类型并且对它进行正向化
正向化后得到矩阵如下:
第二步:
正向化矩阵标准化 - 消除量纲
我们一定要根据正向化矩阵来进行标准化,
不能用原始矩阵
公式如下:
标准化之后 ...
