
简介
该用户还未填写简介
擅长的技术栈
可提供的服务
暂无可提供的服务
内部那三五十kΩ的电阻,总线电容稍微大一点,RC充电时间常数就上去了,上升沿变缓,从机就判断不了高电平。不对,发了,但从机没应答。F103的内部上拉电阻,参考手册上写的是典型值30kΩ到50kΩ之间,注意这只是典型值——有些引脚更离谱,都到70kΩ了。HAL库的I2C初始化翻来覆去对了三四遍,时序参数从标准模式切到快速模式再切回来,GPIO配置也检查了,Open Drain没错,AFIO也开了。上
你有没有过这种经历——在Ubuntu上写了个C程序,gcc编译通过,跑起来一切正常,然后丢到ARM开发板上,./a.out敲下去,系统回你一句"cannot execute binary file"?道理很简单。x86_64编译出来的东西,没办法在ARM的核上跑。不仅仅是换个CPU架构这么简单。
85%其实凑合能用,但如果你的产品需要高可靠性——比如工业缺陷检测或者涉及人身安全——你得想清楚接不接受这个tradeoff。我后来试了用更多数据做量化校准,把精度拉回到88%,也算勉强能接受了。你根本不知道,直到你在MCU上一跑,RAM直接爆炸。模型是Keras训的,2层卷积加全连接,参数加起来几十万个浮点数——扔在PC笔记本上跑得好好的,张嘴就要塞进一个只有256KB RAM的Cortex-M
过了9个月,真还活得好好的——但那已经是后话了。XC6206这种Iq只有1μA左右,而AMS1117的Iq高达5mA——你没看错,5个毫安,待机时的MCU才零点几个μA,一个LDO就把预算吃光了。有次测出来待机电流莫名其妙多了十几μA,用示波器一量,有几个GPIO在sleep前没配好,处于floating状态,内部上拉/下拉来回跳导致漏电。MCU待机电流只是冰山一角,真正吃电的是外围器件——LDO
模型和推理引擎都就位了,传感器数据怎么喂进去?以一个三轴加速度传感器检测震动异常为例:MCU通过SPI读取ADXL345的数据,每读一组xyz就塞入一个环形缓冲区。攒够窗口长度(比如64个采样点),做一次简单的归一化——把原始值映射到模型输入要求的[-1, 1]区间——然后memcpy到interpreter的input tensor。i++) {Invoke()返回后,output tensor
模型和推理引擎都就位了,传感器数据怎么喂进去?以一个三轴加速度传感器检测震动异常为例:MCU通过SPI读取ADXL345的数据,每读一组xyz就塞入一个环形缓冲区。攒够窗口长度(比如64个采样点),做一次简单的归一化——把原始值映射到模型输入要求的[-1, 1]区间——然后memcpy到interpreter的input tensor。i++) {Invoke()返回后,output tensor
一个有意思的细节是,OSPEEDR的实际效果还跟IO的负载电容有关。PA5的上升沿几乎是垂直弹上去的,而PA6的上升沿有一个明显缓坡。大部分人的反应是"无所谓吧,拉满就完了,50MHz走天下"。先不评价这个习惯好不好,我们直接从参考手册的寄存器描述入手,看看GPIO的OSPEEDR位域背后到底控制了什么。因为这不是一个"设多少就能跑多快"的参数,它控制的是输出驱动电路的。注意看,同一个GPIO组的
之前做一个小项目,用STM32F103的ADC采波形,通过DMA自动搬运到内存里。逻辑很简单对吧?ADC配置成连续模式,TIM2触发,DMA circular mode,数据满了进回调。代码写完一跑,前十几帧数据是好的。然后……DMA停了。波形停在最后一次采样的电压上,ADC还在干,but DMA不搬了。我当时第一反应:是不是哪里有溢出?检查了BUF_SIZE,128个uint16,DMA配置也是
你有没有想过一件事——一个在MCU上写裸机程序的工程师,第一次接触嵌入式Linux时,最困惑的是什么?不是语法,不是API,而是"操作系统"这三个字到底意味着什么。从单片机切到嵌入式Linux,最核心的思维转变不是学会调用 open/read/write,而是理解你的程序不再拥有整个CPU。它只是个"租客"——在操作系统的管辖下,分时地使用硬件资源。而且这还不是唯一的变化,你还要面对用户态和内核态
有次跟一个做服务器的朋友聊天,他说你们嵌入式搞AI就是在玩具上跑马灯。我当时就跟他杠上了——Cortex-M4带DSP和FPU,跑个轻量推理怎么就玩具了?后来自己真动手试了试,发现……嗯,确实有点自虐倾向。







