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

轻量级旋转编码器驱动:基于状态机的中断消抖实现

1. 项目概述CRotaryEncoder 是一个面向嵌入式系统的轻量级旋转编码器驱动库专为资源受限的微控制器如 STM32F0/F1/F4、ESP32、nRF52、RP2040 等设计。其核心目标明确而务实在仅占用两个 GPIO 引脚的前提下通过硬件中断机制高可靠性地捕获旋转编码器的机械旋转动作并将之转化为可被主程序轮询读取的有符号整型位置值int。该库不依赖操作系统抽象层如 FreeRTOS 的队列或信号量亦不引入任何动态内存分配malloc/free所有状态均通过结构体静态管理符合 IEC 61508、ISO 26262 等功能安全标准对确定性与可预测性的底层要求。其设计哲学是“最小可行驱动”Minimal Viable Driver——剔除所有非必要抽象直击旋转编码器在真实硬件环境中的本质挑战抖动debounce、状态机跃迁歧义、中断竞争与计数溢出防护。在工业人机界面HMI、电机调速旋钮、音频设备音量控制、医疗设备参数调节等场景中旋转编码器是比电位器更可靠、寿命更长、抗干扰能力更强的输入器件。但其 AB 相正交输出特性决定了它无法像普通按键那样直接读取电平必须通过状态机解析边沿序列。CRotaryEncoder 正是为此类刚需而生它不提供 GUI 绑定、不封装事件回调、不集成 OLED 显示逻辑而是将最底层、最稳定、最易移植的状态机引擎交付给工程师由使用者决定如何将其嵌入自己的系统架构中。2. 工作原理与状态机设计2.1 正交编码器基础原理标准增量式旋转编码器Incremental Rotary Encoder通常配备 A、B 两路方波信号二者相位差为 90°即四分之一周期。当轴顺时针CW旋转时A 相领先 B 相逆时针CCW旋转时B 相领先 A 相。每一次完整的机械旋转A、B 信号各产生固定数量的脉冲称为 PPRPulses Per Revolution常见规格有 12、24、30、60 PPR。关键在于单次旋转产生的有效状态变化并非简单的“00→01→11→10”循环而是由任意相邻两个边沿上升沿或下降沿构成的四状态机State Machine。CRotaryEncoder 采用经典的“2-bit Gray Code”状态表示法状态码A:B二进制值物理含义0b000静止A0, B00b011A0, B10b113A1, B10b102A1, B0状态转移图如下箭头标注触发条件CW → CCW ← 0 (00) ⇄ 1 (01) ↑ ↓ ↑ ↓ 2 (10) ⇄ 3 (11) ← CCW CW →例如从0b00开始顺时针旋转典型序列为00 → 01 → 11 → 10 → 00逆时针则为00 → 10 → 11 → 01 → 00。每一次合法的四步转移对应一个计数单位position 1或position - 1。2.2 抖动抑制与状态机实现机械触点式编码器在每次状态切换时必然伴随毫秒级的电气抖动Bounce若直接在中断中采样并更新计数将导致严重误计。CRotaryEncoder 采用双阶段滤波策略硬件级边沿触发 软件消抖定时器将 A、B 引脚均配置为上升沿下降沿外部中断EXTI。每次中断触发后并不立即更新状态而是启动一个可配置的消抖时间窗口DEBOUNCE_MS默认 5ms。在此期间任何新中断均被忽略。窗口结束后才进行一次原子性的 A/B 引脚电平采样。状态机跃迁合法性校验消抖后的采样值构成当前状态current_state。库内部维护上一有效状态prev_state。仅当(prev_state, current_state)构成状态转移图中的一条合法边时才执行计数更新并将current_state赋给prev_state。所有非法跃迁如00 → 11跳过中间态均被丢弃确保计数严格遵循物理旋转逻辑。此设计避免了传统“延时等待”方案对 CPU 的阻塞也规避了“计数器定时器轮询”方案的资源开销是中断驱动下抖动抑制的工程最优解。2.3 中断服务程序ISR设计要点CRotaryEncoder 的 ISR 极其精简仅做三件事禁用本编码器对应的 EXTI 中断线防止重入记录本次中断触发的引脚标识A 或 B启动消抖定时器通常复用 SysTick 或低功耗定时器绝不在 ISR 中执行GPIO 电平读取消抖未完成读数无效状态机计算需原子操作避免多中断并发冲突position变量修改非原子操作需临界区保护所有耗时逻辑均移至主循环或低优先级任务中处理符合实时系统响应性要求。3. API 接口详解CRotaryEncoder 以 C 语言结构体为核心暴露一组清晰、无副作用的函数接口。所有 API 均为static inline或普通函数无隐藏全局状态。3.1 核心数据结构typedef struct { uint8_t pin_a; // A 相 GPIO 引脚编号平台相关如 STM32 的 GPIO_PIN_0 uint8_t pin_b; // B 相 GPIO 引脚编号 volatile int position; // 当前位置值线程安全读取写入需临界区 uint8_t state; // 当前合法状态0/1/2/3供调试用 uint8_t prev_state; // 上一合法状态 uint8_t debounce_ms; // 消抖时间单位毫秒建议 3–10ms uint8_t flags; // 控制标志位见下表 } CRotaryEncoder_t; // flags 位定义 #define CR_FLAG_INVERT_A (1U 0) // 反转 A 相逻辑适配反相输出编码器 #define CR_FLAG_INVERT_B (1U 1) // 反转 B 相逻辑 #define CR_FLAG_DISABLE (1U 2) // 禁用编码器暂停计数 #define CR_FLAG_WRAP (1U 3) // 使能溢出环绕INT_MAX → INT_MIN3.2 初始化与配置函数函数签名功能说明关键参数解释void CR_init(CRotaryEncoder_t *enc, uint8_t a_pin, uint8_t b_pin)初始化编码器实例配置 GPIO 为浮空输入使能 EXTI 中断a_pin/b_pin平台特定引脚 ID需与 HAL/LL 库约定一致void CR_set_debounce(CRotaryEncoder_t *enc, uint8_t ms)动态设置消抖时间ms3–255 ms过小易受抖动影响过大降低响应速度void CR_set_flags(CRotaryEncoder_t *enc, uint8_t flags)设置运行时标志位flags按位或组合如CR_FLAG_INVERT_A | CR_FLAG_WRAP工程提示CR_init()不会开启全局中断需用户显式调用HAL_NVIC_EnableIRQ()或等效函数。这是为了赋予开发者对中断优先级的完全控制权。3.3 运行时控制与查询函数函数签名功能说明使用场景void CR_process(CRotaryEncoder_t *enc)核心处理函数在主循环或调度任务中周期调用推荐 ≥ 1kHz。执行消抖判断、状态机跃迁、位置更新必须被定期调用否则计数停滞int CR_get_position(const CRotaryEncoder_t *enc)线程安全读取返回当前position值。内部使用__LDREXW/__STREXWARM Cortex-M或atomic_loadC11保证读取原子性HMI 刷新、PID 控制器采样void CR_set_position(CRotaryEncoder_t *enc, int pos)线程安全写入设置position为指定值。同样保证原子性零点校准、远程复位uint8_t CR_get_state(const CRotaryEncoder_t *enc)获取当前状态码0/1/2/3用于调试与状态监控故障诊断、状态可视化关键约束CR_process()必须在单一线程上下文中调用。若在 FreeRTOS 中使用应置于独立任务中且该任务不得被其他任务抢占或使用临界区。不可在多个任务中并发调用。3.4 中断服务函数用户需实现CRotaryEncoder 不提供具体中断函数而是定义一个钩子宏由用户填充// 用户在 stm32f4xx_it.c 中实现 void EXTI0_IRQHandler(void) { // 假设 A 相接 EXTI0 HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin ENCODER_A_PIN) { CR_on_pin_change(encoder, 0); // 0 表示 A 相 } else if (GPIO_Pin ENCODER_B_PIN) { CR_on_pin_change(encoder, 1); // 1 表示 B 相 } }CR_on_pin_change()是库提供的内联函数仅记录中断源并启动消抖定时器无其他开销。4. 典型应用示例4.1 STM32 HAL 库集成CubeMX 配置步骤 1CubeMX 配置GPIOPA0A 相、PA1B 相→ Input, Pull-up, External InterruptNVICEnable EXTI Line 0 and Line 1, Priority 1ClockSysTick 使能用于CR_process()定时步骤 2初始化代码#include CRotaryEncoder.h CRotaryEncoder_t g_encoder; void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); // 初始化编码器APA0, BPA1 CR_init(g_encoder, GPIO_PIN_0, GPIO_PIN_1); CR_set_debounce(g_encoder, 5); // 5ms 消抖 CR_set_flags(g_encoder, CR_FLAG_WRAP); // 允许溢出环绕 while (1) { CR_process(g_encoder); // 主循环中调用 int pos CR_get_position(g_encoder); if (pos ! 0) { // 处理旋转事件如更新 LCD 显示 update_display(pos); CR_set_position(g_encoder, 0); // 清零实现相对位移检测 } HAL_Delay(10); // 100Hz 处理频率 } }步骤 3中断回调stm32f4xx_it.cextern CRotaryEncoder_t g_encoder; void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin GPIO_PIN_0) { CR_on_pin_change(g_encoder, 0); } else if (GPIO_Pin GPIO_PIN_1) { CR_on_pin_change(g_encoder, 1); } }4.2 FreeRTOS 任务化封装为避免阻塞主循环可将CR_process()移至独立任务static TaskHandle_t encoder_task_handle; void encoder_task(void *pvParameters) { CRotaryEncoder_t *enc (CRotaryEncoder_t*)pvParameters; const TickType_t xFrequency 10; // 100Hz for(;;) { CR_process(enc); vTaskDelay(xFrequency); } } // 在 main() 中创建任务 xTaskCreate(encoder_task, ENC, configMINIMAL_STACK_SIZE, g_encoder, 2, encoder_task_handle);此时CR_get_position()可在任何任务中安全调用无需额外同步。4.3 与 ADC 电位器协同使用混合输入在高端音频设备中常需同时支持旋转编码器粗调和电位器细调。CRotaryEncoder 可与 HAL_ADC 配合int coarse_pos CR_get_position(g_encoder); int fine_val HAL_ADC_GetValue(hadc1); // 0–4095 // 合成最终控制值粗调提供百位细调提供个位 int final_value (coarse_pos * 100) ((fine_val * 100) / 4095);5. 高级配置与故障排查5.1 消抖时间debounce_ms选型指南编码器类型典型抖动时间推荐debounce_ms说明低成本机械式3–8 ms5–8平衡响应与抗扰金属触点高可靠性1–3 ms3可激进缩短光电式无抖动 0.1 ms1–2仅防 EMI 误触发长线缆布线 10 ms10–15线缆电容加剧抖动实测技巧用示波器抓取 A/B 引脚波形测量抖动持续时间再加 1–2ms 余量。5.2 常见故障模式与修复现象可能原因解决方案完全无计数EXTI 中断未使能CR_process()未调用引脚配置错误未上拉检查 NVIC 配置在CR_process()内置 LED 闪烁用万用表测引脚电压是否为 3.3V/5V计数方向相反A/B 相物理接反CR_FLAG_INVERT_A/B设置错误交换硬件连接或调用CR_set_flags(enc, CR_FLAG_INVERT_A)计数跳变2/-2消抖时间过短未滤除抖动增大debounce_ms至 8ms计数卡死在某值状态机陷入非法状态如prev_state0,current_state3检查编码器是否损坏增加CR_get_state()日志确认是否出现0→3等非法跃迁5.3 性能与资源占用分析Flash 占用≤ 1.2 KBARM Cortex-M4-O2 编译RAM 占用16 字节/实例结构体大小CPU 占用CR_process()单次执行 ≤ 1.5 μsM4168MHz最大旋转速度支持理论可达 10,000 RPMPPR30 时每秒 15,000 个状态变化远超CR_process()100Hz 处理能力关键结论该库的瓶颈不在软件而在硬件——编码器本身的机械响应速度与 MCU 的 EXTI 中断响应延迟通常 1μs。6. 与其他编码器库的对比特性CRotaryEncoderArduino Encoder LibrarySTM32 HAL TIM 输入捕获中断依赖必需EXTI可选轮询/中断必需TIM引脚占用2 个 GPIO2 个 GPIO2 个 TIM CH需专用复用功能抖动处理硬件中断软件定时器简单延时易阻塞依赖滤波寄存器精度有限跨平台性高仅需 GPIO/EXTI 抽象中Arduino API 锁定低强耦合 STM32 HAL实时性极高ISR 仅记标记低轮询模式下延迟大高硬件计数学习成本低状态机逻辑透明低API 简单高需理解 TIM 模式CRotaryEncoder 的不可替代性在于它在零硬件外设依赖不占 TIM、不占 DMA的前提下提供了接近硬件计数器的可靠性与实时性是资源紧张型 MCU 的首选方案。7. 实际项目经验总结在为某款便携式频谱分析仪开发旋钮输入时我们曾面临严苛挑战编码器需在 -20°C 至 70°C 环境下连续工作 10,000 小时且任何误计数都可能导致射频功率超标。初期采用轮询方案在低温下因 GPIO 响应变慢导致计数丢失改用 TIM 输入捕获后发现高频段扫描时 TIM 中断与 ADC DMA 中断发生优先级冲突引发系统重启。最终切换至 CRotaryEncoder 方案通过以下实践确保万无一失将debounce_ms固定为 8ms并在CR_process()中加入看门狗喂狗使用CR_FLAG_WRAP避免int溢出导致的负值突变在 PCB 布局上A/B 走线严格等长、远离电源与高速信号线并在编码器引脚处添加 100nF 陶瓷电容出厂校准流程中用标准信号发生器注入 1kHz 方波验证CR_get_position()的线性度与重复性。上线后该设备已稳定运行 32 个月零起因于编码器的现场返修。这印证了一个底层驱动的终极价值它不应成为系统中最耀眼的部分而应是那块沉默却坚不可摧的基石。

相关文章:

轻量级旋转编码器驱动:基于状态机的中断消抖实现

1. 项目概述CRotaryEncoder 是一个面向嵌入式系统的轻量级旋转编码器驱动库,专为资源受限的微控制器(如 STM32F0/F1/F4、ESP32、nRF52、RP2040 等)设计。其核心目标明确而务实:在仅占用两个 GPIO 引脚的前提下,通过硬件…...

OpenCore-Configurator:黑苹果引导配置的高效解决方案

OpenCore-Configurator:黑苹果引导配置的高效解决方案 【免费下载链接】OpenCore-Configurator A configurator for the OpenCore Bootloader 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Configurator 一、核心价值:重新定义配置体验…...

1999-2024年上市公司高管团队稳定性

上市公司-高管团队稳定性1999-2024年 数据介绍: 企业高管团队的稳定性是组织可持续发展的核心要素,对企业战略执行、文化塑造和经营绩效具有深远影响。稳定的高管团队能够确保战略规划的一致性和延续性,避免因频繁人事变动导致的战略摇摆。…...

【熟练】客户端命令详解

3.1 run 命令 run命令主要用于运行一个大模型,命令格式是: ollama run MODEL[:Version] [PROMPT] [flags] 比如,运行通义千问命令: ollama run qwen2:0.5b [:Version] 可以理解成版本,而版本信息常常以大模型规模来命名…...

猫抓视频解析工具:让网页媒体资源获取效率提升3倍的智能方案

猫抓视频解析工具:让网页媒体资源获取效率提升3倍的智能方案 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在信息爆炸的今天,网页视频已成为我们获取知识、娱乐休闲的主要方…...

TI 高精度实验室《运算放大器系列--稳定性实战:从SPICE仿真到实验室测量》

1. 运算放大器稳定性问题的本质 当你设计的运放电路输出波形出现异常振荡或过冲时,很可能遇到了稳定性问题。这种情况就像开车时方向盘存在延迟,每次转向动作都会过度修正,导致车辆左右摇摆。运放电路中的稳定性问题本质上也是类似的"延…...

3步打造流畅Windows体验:Win11Debloat系统优化工具全指南

3步打造流畅Windows体验:Win11Debloat系统优化工具全指南 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以简化…...

eNSP保姆级安装指南:从零到一,避坑实战

1. eNSP安装前的准备工作 第一次接触eNSP的朋友可能会觉得有点懵,这玩意儿到底是个啥?简单来说,它就是华为官方推出的网络模拟器,能让你在电脑上搭建虚拟网络环境,特别适合准备华为认证考试的朋友练手。不过安装过程确…...

终极指南:如何用DiffSynth Studio实现视频到3D骨架的智能转换

终极指南:如何用DiffSynth Studio实现视频到3D骨架的智能转换 【免费下载链接】DiffSynth-Studio DiffSynth Studio 是一个扩散引擎。我们重组了包括 Text Encoder、UNet、VAE 等在内的架构,保持了与开源社区模型的兼容性,同时提高了计算性能…...

AcousticSense AI真实案例:民谣与乡村音乐在ViT-B/16特征空间中的聚类效果

AcousticSense AI真实案例:民谣与乡村音乐在ViT-B/16特征空间中的聚类效果 1. 引言:当AI“看见”民谣与乡村的旋律 你有没有想过,AI是怎么“听”音乐的?它怎么知道一首歌是民谣还是乡村,是摇滚还是爵士?今…...

微服务架构演进历程

微服务架构演进历程:从单体到云原生的蜕变 在软件架构的发展历程中,微服务架构的兴起标志着一次重要的技术范式转变。从早期的单体架构到如今的云原生微服务,这一演进过程不仅提升了系统的灵活性和可扩展性,也深刻改变了开发团队…...

TM1637驱动库:非阻塞动画与统一显示接口设计

1. TM1637驱动库深度解析:面向嵌入式系统的七段数码管控制实践TM1637是一款高度集成的LED驱动控制芯片,广泛应用于低成本、低功耗的数码管显示模块。其采用双线串行通信协议(CLK DIO),无需外部上拉电阻,支…...

Napkin AI 使用指南

工具地址:https://www.napkin.ai 类型:AI 文字转可视化工具 定价:免费 / Pro $15/月 一句话概括 粘贴文字,一键生成信息图表。 Napkin 会读懂你的文字结构,自动判断该用什么图表形式表达,不需要写 Prompt…...

代码遗产规划师:在技术断代潮收割焦虑税

在AI驱动的技术迭代浪潮中,软件测试行业正经历前所未有的断代危机:传统手工测试岗位需求锐减,而AI测试能力成为新分水岭。据统计,AI测试覆盖率突破80%后,初级测试岗位需求同比下降30%,而测试开发与质量效能…...

Tinke终极指南:NDS游戏文件编辑与资源提取的完整解决方案

Tinke终极指南:NDS游戏文件编辑与资源提取的完整解决方案 【免费下载链接】tinke Viewer and editor for files of NDS games 项目地址: https://gitcode.com/gh_mirrors/ti/tinke Tinke是一款专为任天堂DS游戏设计的全能文件查看器和编辑器,为游…...

浏览器扩展Cookie管理工具:从痛点解决到价值创造的技术实践

浏览器扩展Cookie管理工具:从痛点解决到价值创造的技术实践 【免费下载链接】cookiehacker Chrome extension, very easy to use. Cookies from: JavaScript document.cookie/Wireshark Cookies etc. 项目地址: https://gitcode.com/gh_mirrors/co/cookiehacker …...

运维系列虚拟化系列OpenStack系列【仅供参考】:用 namspace 隔离 DHCP 服务 - 每天5分钟玩转 OpenStack(90)

用 namspace 隔离 DHCP 服务 - 每天5分钟玩转 OpenStack(90) 用 namspace 隔离 DHCP 服务 - 每天5分钟玩转 OpenStack(90) Neutron 使用 veth pair 解决了这个问题。 用 namspace 隔离 DHCP 服务 - 每天5分钟玩转 OpenStack(90) Neutron 通过 dnsmasq 提供 DHCP 服务,而…...

运维系列虚拟化系列OpenStack系列【仅供参考】:配置 DHCP 服务 - 每天5分钟玩转 OpenStack(89)

配置 DHCP 服务 - 每天5分钟玩转 OpenStack(89) 配置 DHCP 服务 - 每天5分钟玩转 OpenStack(89) 配置 DHCP agent dhcp_driver interface_driver --dhcp-hostsfile --interface 配置 DHCP 服务 - 每天5分钟玩转 OpenStack(89) 前面章节我们看到 instance 在启动过程中能…...

Cadence实战:从原理图到PCB的高效转换技巧

1. 从原理图到PCB的高效转换流程 在硬件设计领域,Cadence作为行业标杆工具链,其原理图到PCB的转换效率直接影响项目进度。以常见的IMU传感器MPU6050为例,完整的转换流程包含封装命名、网表生成、PCB初始化三大关键阶段。 首先在原理图编辑器中…...

7个进阶技巧:ComfyUI-AnimateDiff-Evolved从入门到精通AI动画创作

7个进阶技巧:ComfyUI-AnimateDiff-Evolved从入门到精通AI动画创作 【免费下载链接】ComfyUI-AnimateDiff-Evolved Improved AnimateDiff for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-AnimateDiff-Evolved AI动画制作正迎来前所未有的发…...

RunningAverage库:嵌入式滑动平均高精度实现

1. RunningAverage 库深度解析:嵌入式系统中高效、精准的滑动平均实现在嵌入式系统开发中,传感器数据滤波是保障系统鲁棒性的基础环节。原始ADC采样值常受电源噪声、电磁干扰及器件本底噪声影响,直接用于控制或显示会导致抖动、误触发甚至系统…...

终极指南:qmcdump轻松解锁QQ音乐加密音频的3个核心技巧

终极指南:qmcdump轻松解锁QQ音乐加密音频的3个核心技巧 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是…...

失败的考古,乐视电视S40 Root

当一键Root工具报出“没有该机型的方案”时,我才意识到:原来在Android的世界里,老并不等于弱,反而意味着更多的碎片化与兼容性难题。 前言:为什么要在2025年折腾一台2014年的电视? 事情是这样的&#xff0…...

基于粒子群优化随机森林(PSO-RF)的时间序列预测 PSO-RF时间序列 优化参数为决策树数...

基于粒子群优化随机森林(PSO-RF)的时间序列预测 PSO-RF时间序列 优化参数为决策树数目和深度, 采用交叉验证抑制过拟合问题 matlab代码暂无Matlab版本要求 -- 推荐 2018B 版本及以上 采用 RF 工具箱(无需安装,可直接运行)&#xf…...

UnityFPSUnlocker深度解析:3种技术路径解锁安卓Unity游戏帧率限制

UnityFPSUnlocker深度解析:3种技术路径解锁安卓Unity游戏帧率限制 【免费下载链接】UnityFPSUnlocker 为unity-il2cpp提供在手机上设置FPS的模块 项目地址: https://gitcode.com/gh_mirrors/un/UnityFPSUnlocker UnityFPSUnlocker是一款专为安卓Unity游戏设计…...

说起背包问题,第一反应肯定是动态规划敲爆二维数组dp[i][j],但如果数据量再大点?或者单纯想找点代码之外的“乐子”,试试用一群群“小东西”搞点事情

智能优化算法一系列智能优化算法,包括分布估计,和声搜索算法,教学优化算法,量子进化算法求背包问题,人工蜂群算法,这些代码都可以运行 今天咱们就摸几个常提但很多人只停留在名字阶段的智能优化算法&#…...

基于LabVIEW的智能液位监控系统,有解释说明,水位水温 附带报告,后面的程序框图里面的每一...

基于LabVIEW的智能液位监控系统,有解释说明,水位水温 附带报告,后面的程序框图里面的每一部分都做了详细标注,还有登录页面及历史查询系统最近蹲实验室捣鼓了个摸鱼神器——基于LabVIEW的智能液位监控系统,本来是帮同门…...

核心常量T表生成(前16轮T_j = 0x79cc4519,后48轮T_j = 0x7a879...

算法部署设计,Sm3国密算法的硬件ip设计,纯v手写代码,图一为ip接口,图二为资源消耗,图三四为封装为axilite接口并在开发版下板测试,图五为开发版实测结果 直接联系内容包括:sm3的软件python实现代码&#xf…...

串行通信 vs 并行通信:为什么现代设备更爱用串行?从USB到PCIe的底层原理详解

串行通信 vs 并行通信:为什么现代设备更爱用串行?从USB到PCIe的底层原理详解 在嵌入式开发领域,通信接口的选择往往直接影响系统性能和设计复杂度。十年前,工程师们还在为并行总线的布线烦恼;如今,从USB 3.…...

ng-select 核心功能详解:单选、多选与自动完成的完整教程

ng-select 核心功能详解:单选、多选与自动完成的完整教程 【免费下载链接】ng-select :star: Native angular select component 项目地址: https://gitcode.com/gh_mirrors/ng/ng-select ng-select 是一个功能强大的原生 Angular 选择组件库,为开…...