avatar
文章
54
标签
19
分类
8
Home
Archives
Tags
Categories
Photo
Link
Message
About
LogoCCの日记
搜索
Home
Archives
Tags
Categories
Photo
Link
Message
About

CCの日记

I²C
发表于2026-10-09|嵌入式
I²C(Inter-Integrated Circuit,读作“I-squared-C”)是一种同步、半双工、多主多从的串行通信总线。它由飞利浦(现NXP)在1980年代发明,核心设计目的是用最少的引脚连接低速外设——是需要两根线,就能挂载几十个设备。 物理层:两根线搞定一切I²C只使用两根信号线,都是开漏输出,必须外接上拉电阻: SCL(Serial Clock):时钟线,由主机产生,用于同步数据传输。 SDA(Serial Data):数据线,双向传输,承载地址、数据、ACK等信息。 开漏 + 上拉是关键设计:任何设备都可以将线拉低,但是有释放后由上拉电阻恢复高电平。这天然实现了线与逻辑,避免了多个设备同时驱动导致短路,也是多种仲裁的无力基础。 上拉电阻的取值需要权衡:阻值小则上升沿快、速率高、但功耗大;阻值大则省电,但边沿变缓。常见值在2.2k𝛺~10k𝛺之间,高速模式下会更小。 协议层:主机驱动的回答I²C是主机主导的协议:主机产生时钟并发起所有传输,从机只能被动响应。每次通信都遵循固定帧格式: 起始条件(Start):SCL为高时,SDA由高拉低。这是通信开始...
CAN通信
发表于2026-10-09|嵌入式
CAN是一种多主异步串行通信协议,核心设计目标是让网络上的多个节点在严苛环境下也能可靠通信。它的精妙之处在于,用“显性/隐性”电平配合独特的无损仲裁机制,解决了多节点同时发送时的冲突问题。 核心机制:显性与仲裁要理解CAN,先要理解它的物理层逻辑: 显性:逻辑0,被主动驱动到电压。显性位”覆盖“隐性位。 隐性:逻辑1,通过电阻拉回。总线空闲时就是隐性状态。 无损仲裁正是基于这个特性:但当多个节点同时发送时,它们逐位比较标识符(ID)。只要某个节点发送隐性位却从总线上读到显性位,它就明白自己ID的优先级较低,立即退出仲裁,转为接收模式。意味着ID数值越小,优先级越高,仲裁过程不会破环任何数据。 数据帧结构一个标准的CAN数据帧(以jydmCAN为例)由以下部分组成: 帧起始:1位显性位,通知总线传输开始。 仲裁场:包含11位标识符(标准格式)或29位(扩展格式),决定优先级,也用于接收方过滤报文。 控制场:包含DLC(数据长度码),指明数据场有几个字节(经典CAN为0-8字节)。 数据场:实际负载,经典CAN最多8字节。 CRC场:15位校验序列,用于检错。 ACK...
串口通信
发表于2026-10-09|嵌入式
UART(通用异步收发传输器)是一种异步串行通讯协议,它不需要共享时钟信号,仅通过两根数据线(TX\RX)即可实现全双工通信。理解UART的核心,在于理解它如何通过”数据帧“的格式来在无时钟的情况下保持收发双方的同步。 核心原理:无时钟如何同步?UART是异步通信,意味着发送方和接收方没有共享的时钟线。为了让接收方能正确解读数据,UART通过特定的数据帧格式来实现同步: 起始位:数据在空闲时保持高水平。当发送方拉低电平一个波特率周期时,接收方检测到这个下降沿,就知道一阵数据开始了,并以此校准自己的采样时钟。 数据位:紧接着起始位之后发送,通常是5-8位。UART协议约定最低有效位先发送。 校验位(可选):用于简单的错误检测。可以是偶校验(使数据位中的“1”的总数为偶数)或奇校验。 停止位:发送方将数据线拉高1或2个周期,标志一帧数据结束。高电平的停止位也为接收方提供了必要的缓冲时间,以处理时钟可能存在的微小误差。 关键参数要成功通信,双方必须事先约定好以下参数,否则会乱码: 波特率:衡量传输速率的指标,表示每秒传输的符号数。常见的波特率有9600、115200等。收发双方波...
通用输入输出
发表于2026-08-28
输出模式 模式名称 内部原理 电平控制能力 典型应用场景 推挽输出 内部由PMOS+NMOS组成,既能主动拉高,也能主动拉低 输出高电平为VDD,低电平为VSS,驱动能力强 SPI的SCLK、MOSI、UART的TX、PWM调光、LED驱动 开漏输出 内部只有NMOS,只能主动拉低,无法主动输出高电平 输出高电平必须依赖外部上拉电阻 I2C的SCL和SDA(强制要求)、总线电平匹配(如3.3V转5V) 关闭输出 引脚呈高阻态 不驱动总线相当于断开连接 仅在释放总线或作为输入时使用 关键规则(必记):SPI时钟必须用推挽(保证高速上升沿);I2C时钟必须用开漏+外部上拉电阻(保证多主机“线与”逻辑,否则会短路)。 输入模式 模式名称 内部连接 电平状态(无外部信号时) 典型应用场景 浮空输入 既不上拉也不下拉 不确定 必须由外部信号强驱动 上拉输入 内部接一个弱上拉电阻 默认高电平 按键检测 下拉输入 内部接一个弱下拉电阻约40k𝛺 默认低电平 检测高电平有效的脉冲信号 模拟输入 断开数字电路,直接连接ADC/DA...
HAL库常用
发表于2026-04-21|嵌入式
HAL库常用一、GPIO通用12345678910111213// 1. 写引脚:置1/0 HAL_GPIO_WritePin(GPIOx,GPIO_Pin,GPIO_PIN_SET); //置高 HAL_GPIO_WritePin(GPIOx,GPIO_Pin,GPIO_PIN_RESET); //置低// 2. 读取引脚电平 GPIO_PinState state = HAL_GPIO_ReadPin(GPIOx,GPIO_Pin);// 3. 反转电平 HAL_GPIO_TogglePin(GPIOx,GPIO_Pin);// 4. 毫秒延时 HAL_Delay(ms); 二、UART串口1. 阻塞收发12345//发送数据HAL_UART_Transmit(&huart1,dart,len,100);//接收数据HAL_UART_Receive(&huart1,data,len,100); 2. 中断收发12// 开启接收中断HAL_UART_Receive_IT(&huart1,&rxBuffer,1); 3...
使用vscode及其插件来开发单片机
发表于2026-01-21
VSCode所需要的插件包括 C/C++ C++ Extension Pack Cortex-ebug Embedded IDE Memory View peripheral View RTOS View Debug-tracker-vscode CMake Cmake Tool
2026/1/4随笔
发表于2026-01-04
气温终于降了.转眼工作已经快4年,保持学习还是很困难的。我发现一开始无论多有趣的工作,一旦持续一段时间,创新性就大打折扣,于是我的工作欲望也随之下降了。但是牛马的工作大多都是没有创新的。
常见面试问题
发表于2025-07-23|web
自适应布局中的 rem 是什么原理?rem(root em)是css中一种相对长度单位,其核心原理是相对于跟元素(html)的字体大小进行缩放。 核心原理rem的基准是根元素HTML的font-size属性: 123html{ font-size:16px;} 动态计算所有使用rem的元素尺寸都会根据字体大小动态计算: 123.demo{ width:10rem; // 160px} 自适应关键通过JS或媒体查询动态修改根字体大小,页面所有rem单位元素都会等比例缩放: 123//根据视口宽度动态设置根元素字体大小document.documentElement.style.fontSize = window.innerWidth /100 + 'px' 工作流程1. 设计稿基准假设设计稿宽度750px,约定1rem = 设计稿100px 2. 设计根字体123// 视口宽度375px的设备上:const rootFontSize = window.innerWidth / 7.5; // ...
C语言内存管理
发表于2025-03-12|嵌入式
C语言为内存的分配管理提供了以下几个函数。这些函数可以在<stdlib.h>头文件中找到。 序号 函数和描述 1 void *calloc(int num, int size);该函数分配一个带有 function allocates an array of num 个元素的数组,每个元素的大小为 size 字节。 2 void free(void *address);该函数释放 address 所指向的h内存块。 3 void *malloc(int num);该函数分配一个 num 字节的数组,并把它们进行初始化。 4 void *realloc(void *address, int newsize);该函数重新分配内存,把内存扩展到 newsize。 1. 动态分配内存编程时,如果我们预先知道数组的大小,那么定义数组时就比较容易。例如,一个存储人名的数组,他最多容纳100个字符,所以您可以定义数组: char name[100] 但是,如果我们预先不知道需要存储的文本长度,例如您想存储有关一个主题的详细描述。在这里,我们需要定义一个指...
C中的存储类
发表于2025-03-12|嵌入式
C语言存储类存储类定义C程序中变量/函数的范围(可见性)和生命周期。这些说明符放在它们所修饰的类型前之前。 1. auto 存储类auto存储类是所有局部变量默认的存储类。 1234{ int mount; auto int month;} auto只能用在函数内,即auto只能修饰局部变量。 2. register 存储类register存储类用于定义存储在寄存器中而不是arm中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个字节),且不能对它应用一元的 ‘&’ 运算符(因为它没有内存位置)。 1234{ register int miles;} 3. static 存储类static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。 static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。 在 C...
123…6
avatar
cailinjun
行到水穷处,坐看云起时
文章
54
标签
19
分类
8
Follow Me
公告
This is my Blog
最新文章
flutter的渲染机制2026-10-26
pm22026-10-16
任务声明文件2026-10-16
指针介绍和常见用法2026-10-10
FreeRTOS常用API2026-10-09
分类
  • Flutter1
  • STM32学习笔记2
  • git1
  • hexo1
  • javascript1
  • web3
  • 前端10
  • 嵌入式15
标签
vue FreeRTOS 一些常用但是不清楚的知识点 中断 单片机开发 GPIO C 微信小程序 css、js、html flutter hexo react 通信方式 软件设计模式 STM32 ant design pro 存储方式 c pm2
归档
  • 十月 2026 13
  • 八月 2026 1
  • 四月 2026 1
  • 一月 2026 2
  • 七月 2025 1
  • 三月 2025 6
  • 二月 2025 3
  • 十二月 2024 1
网站信息
文章数目 :
54
本站访客数 :
本站总浏览量 :
最后更新时间 :
© 2023 - 2026 By cailinjun
豫ICP备2023040361号 豫公网安备41159002000146
搜索
数据加载中