很多人学单片机都是从"点灯"开始的,点完灯学串口,学完串口学定时器,一路学下来感觉单片机也不难。但真要做一个完整的单片机项目,就会发现坑特别多,远不是跟着教程写几个例程那么简单。今天聊聊从入门到能独立做项目的几个进阶要点。
第一个进阶点是时钟配置。单片机的时钟是整个系统的"心跳",时钟配错了,所有外设都跑得不对。很多新手用默认时钟就完事了,但实际项目中可能需要用到不同的时钟频率,比如用较高频率让USART波特率更精确,用较低频率降低功耗。时钟树的配置要仔细看芯片手册,别凭感觉配。
第二个进阶点是中断管理。单片机的中断系统是实现实时性的关键,但也是最容易出bug的地方。常见问题有:中断优先级配置不当导致高优先级中断被低优先级抢占;中断服务函数写得太长,影响系统响应速度;中断标志位没有及时清除,导致中断反复触发。正确的做法是中断服务函数尽量短,只做必要的操作,把耗时的逻辑放到主循环里处理。
第三个进阶点是外设驱动。单片机的外设特别多:GPIO、USART、SPI、I2C、ADC、定时器……每个外设都有自己的配置和使用方法。新手容易犯的错误是直接用库函数但不理解底层原理,出了问题不知道怎么排查。建议在使用每个外设之前,至少要搞清楚它的工作模式、关键寄存器配置和典型应用电路。
第四个进阶点是功耗优化。很多单片机项目是电池供电的,比如智能门锁、环境监测节点,这时候功耗就是核心指标。常见的低功耗策略有:空闲时进入低功耗模式、关闭不需要的外设、使用时钟裁剪、配置IO口为高阻态。我做过一个LoRa传感器节点,通过一系列优化把待机电流从几毫安降到了几十微安,电池寿命直接翻了十倍。
第五个进阶点是调试技巧。单片机调试最常用的是串口打印和在线调试(JTAG/SWD)。串口打印适合观察程序运行状态,但要注意不要在中断里用printf,会阻塞程序。在线调试可以单步执行、看寄存器的值,但要注意优化等级,开高优化后代码可能被合并,调试起来对不上。另外,逻辑分析仪是调试外设通信的利器,SPI、I2C、USART的时序问题,用逻辑分析仪抓一下就一目了然。