STM32F4学习
CANCAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。1) 多主控制。在总线空闲时,所有单元都可以发送消息(多主控制),而两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,优先级最高的单元才能继续发送消息。CAN线物理架构:
CAN信号是一个差分信号,显性电平对应逻辑 0,CAN_H 和 CAN_L 之差为 2.5V 左右。而隐性电平对应逻辑 1,CAN_H 和 CAN_L 之差为 0V。只要有一个单元输出显性电平,总线上即为显性电平,而只有所有的单元都输出隐性电平,总线上才为隐性电平。由CAN的这一特性,我们可以分析它的仲裁原理:假设单元 1 和单元 2 同时开始向总线发送数据,开始部分他们的数据格式是一样的, 故无法区分优先级,直到 T 时刻,单元 1 输出隐性电平,而单元 2 输出显性电平,此时单元 1 仲裁失利,立刻转入接收状态工作,不再与 ...
git联合创作
Vscode中下载适用于windows的git,同时加入Gitlens工具包安装时注意在这个界面选择使用visual studio code,其他全点next就可以
在cmd中键入git验证是否安装
Git配置完成后显示如此
第一次时选择初始化仓库而后显示如此
.gitignore选择git要忽略的文件(一般是.vscode和build)
终端加入git bash
配置username和useremail键入命令:设置用户名和邮箱git config —global user.name “username”git config —global user.email useremail@qq.com查看是否设置成功git config user.namegit config user.email查看全局配置git config —global -l
在设置里去掉勾选use Editor As commit input
由此我们便完成了vscode+github的基本配置,之后对同一文件不需再次配置
接下来我们学习git的提交与发布(推送)这是两个不同的步骤,提交是将程序文件保存到本地 ...
VisualTFT学习
概述:VisualTFT是一个串口屏软件,在串口屏上的每个操作均会被作为串口信息发送到串口。
基本信息格式:帧头:EE画面指令/组态控件指令:B1 01/B1 11画面ID:四位十六进制表示,例如00 0A控件ID:在同一画面上的不同控件,四位十六进制表示,例如00 01控件类型:两位十六进制表示,例如按钮控件是10,文本控件是11
帧尾:FF FC FF FF
文本控件:基本功能:密码显示:开启后输入文本将以“”显示,例如输入“123”,将显示“**”。输入方式:“用户主机输入”——文本由用户的主机输入,通过串口指令传出到串口屏,把文本显示到屏幕。 stm32的命令为lcd_text_update。“弹出系统键盘输入”——弹出系统键盘进行文本输入,键盘类型可选择小键盘和全键盘。 小键盘可以输入数字;全键盘可以输入数字、英文字母、中文。文本长度:文本输入的长度,指令的最大长度为 1024 字节(包含帧头和帧尾),一个汉字占用两个字节。数值限定:弹出系统键盘输入方式下可对输入的数值进行限定,限定输入数值的范围和精度。键入值与串口指令的关系:
按钮控件:根据按钮的触控用途可分为五种:切换画 ...
Solidworks学习
Alt+C 切换实虚线Space 快速转换视图鼠标中键 调整视角鼠标右键 鼠标笔势
设计模式学习
如何解决一个复杂的问题:分解、抽象。分解是将大问题变为小问题;抽象是将问题的共同点提炼出来,而后对不同点做不同处理。抽象比分解更好软件设计的目的是复用
1.设计原则高层模块(稳定)不能依赖于底层模块(变化),二者应该依赖于抽象(稳定)抽象(稳定)不应该依赖于实现细节(变化),实现细节(变化)应该依赖于抽象(稳定)对扩展开放,对修改封闭一个类应该仅有一个引起它变化的原因,单一职责接口应该小而完备,该private就private,不能随便public优先使用对象组合,而不是类继承面向接口(对象要声明成抽象基类),高内聚,松耦合。稳定存在于编译时,变化存在于运行时,用虚函数将编译时依赖延迟到运行时依赖变化无法消除,关键在于让变化只存在于代码的某个集中区域而不是充斥在整个代码空间
GOF-23分类:创建型、结构型、行为型组件协作模式:模板方法、策略模式、观察者模式单一职责模式:装饰模式、桥模式对象创建模式:工厂方法模式
2.模板方法(Template Method):晚绑定与松耦合晚绑定:早的东西调用晚的东西,先定义一个算法的骨架,而将步骤实现延迟到子类中
让子类变化基类的函数,使子类复用一 ...
STM32F4外设学习
定时器:0.结构体:TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; 成员变量:uint16_t TIM_Prescaler;uint16_t TIM_CounterMode;uint16_t TIM_Period;uint16_t TIM_ClockDivision;uint8_t TIM_RepetitionCounter; 针对高级定时器1.时钟使能:定时器挂载在总线之下,所以我们通过对应总线的使能函数来使能定时器例:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); APB1与TIM3可变2.初始化结构体TIM_TimeBaseInitStructure.TIM_Period = arr; 自动重载计数周期值TIM_TimeBaseInitStructure.TIM_Prescaler=psc; 分频系数TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; 计数方式TIM_TimeBase ...
Unity学习
了解帧的概念游戏的本质就是一个死循环每一次循环都会处理游戏逻辑并更新一次游戏画面之所以能看到画面在动 是因为切换画面速度达到一定速度时人眼就会认为画面是动态且流畅的一帧就是执行了一次循环Unity底层已经封装好了这个死循环我们只需要利用Unity的生命周期函数的规则来执行游戏逻辑即可
FPS(Frames Per Second)即每秒钟帧数一般我们说60帧30帧意思是1秒更新60次、30次画面1s = 1000ms60帧:1帧为 1000ms/60 ≈ 16.66ms30帧:1帧为 1000ms/30 ≈ 33.33ms
游戏卡顿的原因:跑1帧游戏逻辑的计算量过大,或者硬件性能过低,无法在一帧的时间内处理完所有游戏逻辑
生命周期函数的概念所有继承MonoBehavior的脚本 最终都会挂载到GameObject游戏对象上生命周期函数就是该脚本对象依附的GameObject对象从出生到消亡整个生命周期中会通过反射自动调用的一些特殊函数
Unity帮助我们记录了一个GameObject对象依附了哪些脚本会自动地得到这些对象,通过反射去执行一些固定名字的函数(就是生命周期函数)
生命周期函数 ...