软件延时去抖
老员工原话:
原则上能不延时就不延时,有些通讯协议可能要延时几微秒
正经项目都不延时(硬件上直接解决)
8位单片机也可以使用32位变量,这是编译器解决的事情
延时去抖显然在主循环里面会卡全部的进程,要延时就在外部中断里面延时
但显然的是,外部中断延时也会导致外部中断多次判断的时候会少判。
软件延时:机械按钮按下有一部分误差电压,大概20ms,需要去除
原理就是读到了,等20ms,再读一次,确保是按下了
一片伟大的净土
灵魂的归处,肉体的坟墓。老员工原话:
原则上能不延时就不延时,有些通讯协议可能要延时几微秒
正经项目都不延时(硬件上直接解决)
8位单片机也可以使用32位变量,这是编译器解决的事情
延时去抖显然在主循环里面会卡全部的进程,要延时就在外部中断里面延时
但显然的是,外部中断延时也会导致外部中断多次判断的时候会少判。
软件延时:机械按钮按下有一部分误差电压,大概20ms,需要去除
原理就是读到了,等20ms,再读一次,确保是按下了
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频,不分频
DIV2则为时钟主频除以2
TIM_TimeBaseStruct.TIM_Prescaler = 7199; // 预分频器(PSC)
设置每秒数几次,有具体算法
TIM_TimeBaseStruct.TIM_Period = 9999; // 自动重装载值(ARR)
定义了定时器计数器的最大值。当计数器达到这个值时,会触发一次溢出事件(或更新事件),并重新从 0 开始计数。有具体算法
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
向上计数模式:计数器从 0 开始递增,直到达到自动重装载值(ARR),然后重新从 0 开始。
tip:codebase是指当前项目里面的所有文件(有关联的)
是否要在中断里面运行代码,看具体需求(满足实时性)
如果不急就放主程序,有影响就放中断
中断不能放太多,尽量少放(要求速度快就放在中断里面)
基本没有那如果多次触发中断 放到主程序里面运行 来不及触发第二次怎么办的情况(老工程师的回答,一般有的话也不是8位机能干的了)
写函数以面向对象方法来写,比如A3start,而非startA3
switch 语句:
跳跃表(Jump Table):switch 语句通常用于多个离散的整数值判断。编译器可以生成跳跃表,通过索引直接跳转到相应的代码块,效率较高。
适用场景:
离散的整数值:当条件是多个离散的整数值时,switch 语句效率更高。
大量条件:当条件较多时,switch 语句的效率通常优于 if 语句。
常量条件:switch 语句中的条件必须是常量表达式。
在函数中如果要保持变量不变,需要static,如果没有会随着函数消失而重置
CMAKE里面设置了C99,依然可以在结构体里面定义函数不报错
估计是clang-tidy的问题,而不是配置,懒得改了
反正别用结构体,编译具体看keil5是否有误
链接:https://pan.baidu.com/s/1Ef3pw5k91FwmySTYWpF05g
提取码:laxn
张飞硬件1~20部完整版
王工说还不错
20250319:我觉得不行,估计是上面这个版本太老了