MC9S08DN60低功耗与CAN总线设计:嵌入式经典MCU实战解析

📅 2026/6/19 20:49:33
MC9S08DN60低功耗与CAN总线设计:嵌入式经典MCU实战解析
1. 项目概述与核心价值在嵌入式开发领域尤其是汽车电子、工业控制这些对可靠性和功耗有严苛要求的场景里选对一颗MCU往往意味着项目成功了一半。今天想和大家深入聊聊我用了多年的一个经典系列——飞思卡尔现恩智浦的MC9S08DN60。这系列芯片可能没有那些ARM Cortex-M内核的“网红”芯片名气大但它胜在稳定、皮实尤其是在集成CAN总线和实现超低功耗方面有着非常扎实和成熟的设计。很多老工程师的“工具箱”里都少不了它。MC9S08DN60系列基于经典的HCS08内核提供了从16KB到60KB不等的Flash存储选项以及丰富的模拟与数字外设包括12位ADC、模拟比较器、多个定时器和串行通信接口。但它的真正精髓在于其针对“连接”与“续航”这两个嵌入式核心矛盾的深度优化一个高度集成的CAN控制器让你轻松构建稳定的车载或工业网络节点一套精细划分的低功耗模式特别是Stop2和Stop3能让你的设备在“值守”时几乎不耗电。我曾在多个电池供电的远程数据采集器和车身控制单元BCU项目中选用它实测下来其功耗控制和通信稳定性都相当可靠。无论你是正在评估一款适合带CAN功能的低功耗MCU还是已经在使用该系列并想挖掘其潜力相信接下来的内容都能给你带来一些实用的参考。2. 芯片架构与资源全景解析在动手写代码之前我们必须像熟悉自己的手掌纹路一样了解芯片的内部构造和资源分布。这对于后续合理分配引脚、规划存储空间以及优化功耗至关重要。2.1 系列成员与核心资源配置MC9S08DN60系列并非单一型号而是一个根据存储容量和引脚数量进行划分的家族。这种“系列化”设计让开发者可以根据项目成本和控制规模进行精准选型避免资源浪费。表 2.1 MC9S08DN60系列型号关键参数对比特性MC9S08DN60MC9S08DN48MC9S08DN32MC9S08DN16Flash 大小 (字节)62080491523379216896RAM 大小 (字节)2048204815361024EEPROM 大小 (字节)204815361024512封装引脚数6448 / 3264 / 48 / 3248 / 32ADC 通道数1616 / 1016 / 1016 / 10TPM1 通道数66 / 46 / 46 / 4TPM2 通道数2222模拟比较器 (ACMP2)有有 (注1)有 (注1)有 (注1)注1在48引脚和32引脚封装中ACMP2的输出引脚ACMP2O不可用。选型经验谈Flash与RAM不要只看Flash大小。对于使用实时操作系统RTOS或复杂协议栈如CANopen的应用RAM大小往往是更关键的瓶颈。DN60和DN48的2KB RAM是一个比较舒适的门槛。引脚数量引脚数不仅决定了你能连接多少外设也影响了部分外设的可用性。例如64引脚版本拥有最完整的I/O和模拟功能而32引脚版本会牺牲掉部分端口如Port C、Port G的部分引脚和ADC通道。务必对照数据手册的引脚复用表进行核对。模拟比较器ACMP2在低引脚封装中输出功能受限这意味着你只能将其用于内部触发或读取状态标志而无法直接驱动外部引脚。如果设计需要比较器结果直接控制一个IO则需要使用ACMP1或重新规划硬件。2.2 系统时钟树与分配策略时钟是MCU的脉搏理解时钟树是进行低功耗设计和外设定时配置的基础。MC9S08DN60的时钟系统由多功能时钟发生器MCG模块驱动结构清晰但选项灵活。核心时钟信号解读MCGOUT这是MCG模块产生的主时钟输出是芯片内部最根源的时钟源。总线时钟BUSCLK的频率恒为MCGOUT的一半。这是理解所有外设时钟频率的基点。BUSCLK系统总线时钟CPU、内存以及大部分外设如IIC、SPI、部分定时器模式都基于此时钟运行。LPO一个独立的1kHz低功耗振荡器。它功耗极低专门用于在低功耗模式下为看门狗COP和实时计数器RTC提供时钟源是维持系统“心跳”的关键。MCGIRCLK / MCGERCLK内部/外部参考时钟。可用于作为RTC的时钟源其中外部参考时钟MCGERCLK还可作为ADC的备用时钟。MCGFFCLK固定频率时钟。这是一个非常有用的时钟源可以独立于主系统时钟被选择为TPM1和TPM2的时钟源。这意味着即使主CPU进入低速或休眠模式定时器仍然可以基于一个稳定的时钟继续工作用于产生周期性唤醒中断。TPMxCLKTPM模块的外部输入时钟引脚。允许你使用外部信号作为定时器的时钟用于频率测量或脉冲计数等场景。时钟配置的实战技巧上电默认状态芯片复位后默认使用MCG的内部时钟MCGIRCLK作为MCGOUT源。此时频率较低且精度一般仅用于启动初期的基本操作。你的初始化代码中首要任务之一就是根据需求如需要USB、高精度定时或CAN通信配置MCG切换到外部晶振或锁相环PLL以获得更高精度和频率的时钟。低功耗时钟规划计划进入Stop3模式时若希望RTC或ADC使用异步时钟时继续工作必须提前在MCG控制寄存器MCGC1、MCGC2中使能相应的内部或外部参考时钟设置IRCLKEN/ERCLKEN和IREFSTEN/EREFSTEN位确保在CPU时钟停止后这些参考时钟源仍保持活动。ADC时钟注意ADC模块对时钟频率有最小和最大要求。使用前务必查阅电气特性附录确保提供给ADC的时钟频率在指定范围内否则转换精度和速度无法保证。3. 引脚功能与硬件设计要点芯片的引脚是连接内部逻辑与外部世界的桥梁正确的硬件设计是软件稳定运行的前提。MC9S08DN60的引脚复用功能非常强大但也需要仔细规划。3.1 电源与接地设计稳定的基石电源设计看似简单实则最容易埋坑。数据手册的推荐连接图是黄金标准务必遵循。VDD / VSS数字电源/地这是主供电引脚。除了32引脚封装其他封装都有两个VDD和VSS引脚。每个VDD引脚都必须就近放置一个0.1μF的陶瓷去耦电容用于滤除高频噪声。此外整个系统电源入口处应有一个更大的储能电容如10μF的钽电容以应对瞬时电流需求。VDDA / VSSA模拟电源/地这是ADC模块的专用电源。即使你的应用暂时不用ADC也强烈建议将其妥善连接。最佳实践是使用独立的LC滤波器例如一个磁珠加电容从数字电源隔离出模拟电源并在VDDA和VSSA引脚最近处放置0.1μF陶瓷电容。对于48引脚和32引脚封装VREFH和VREFL在内部已分别连接到VDDA和VSSA这简化了设计但也意味着ADC参考电压直接取自模拟电源因此对模拟电源的纯净度要求更高。VREFH / VREFLADC参考电压在64引脚封装中这是独立的引脚可以接入一个更精准、更稳定的参考电压源如2.5V或3.0V的基准芯片从而大幅提升ADC的测量精度。这是进行高精度模拟量采集的关键。重要提示在PCB布局时务必确保电源先经过大电容再经过小电容最后才进入芯片引脚。电源走线要尽量粗短形成低阻抗回路。3.2 复位与调试接口系统的控制阀RESET引脚内部已有上拉通常只需连接一个0.1μF电容到地即可完成上电复位POR和手动复位功能。在噪声较大的环境中可以增加一个简单的RC滤波如10kΩ电阻串联一个0.1μF电容到地。请注意此引脚只能用于复位到用户模式无法通过它直接进入后台调试模式BDM。BKGD/MS引脚这是双功能引脚。复位期间它是模式选择MS引脚复位释放后变为后台调试BKGD引脚。关键点在于若要使用BDM进行编程和调试必须在复位上升沿期间将此引脚拉低。标准的6引脚背景调试接头就是为此设计的。该引脚内部有上拉通信协议包含主动的高速加速脉冲因此外部电路非常简单通常直接连接即可避免引入过大电容影响通信波形。3.3 通用I/O与外围设备复用管理芯片最多支持53个通用I/O引脚它们与ADC、定时器、串口等外设功能复用。复位后所有引脚默认为高阻输入且内部上拉电阻禁用。初始化时的关键操作在main函数一开始必须处理所有未使用的引脚。浮空的输入引脚是电流泄漏和系统不稳定的重要源头。你有两个选择启用内部上拉电阻将引脚配置为输入并使能其上拉。这是最简单的方法。配置为输出低电平或高电平将引脚配置为输出并驱动到一个确定的电平通常是低电平以省电。// 示例初始化Port A将未使用的PTA4, PTA5设为输出低电平使用的PTA0ADC设为输入 PTADD 0x30; // 设置PTA4, PTA5为输出方向 (二进制 0011 0000) PTAD 0x00; // 输出低电平 // PTA0 保持默认输入用于ADC外设与GPIO的优先级当一个引脚被某个外设模块控制时例如配置为UART的TX该外设模块会自动管理引脚的方向输入/输出。但是端口数据方向寄存器PTxDD的值仍然决定了你从端口数据寄存器PTxD中读取到什么。通常当外设控制输出时读取PTxD得到的是输出锁存器的值当外设控制输入时读取PTxD得到的是引脚的实际电平。理解这一点有助于调试。4. 深入剖析低功耗工作模式MC9S08DN60系列的低功耗设计是其核心亮点之一提供了从全速运行到深度睡眠的多种状态以适应不同场景下的功耗需求。4.1 运行模式Run Mode这是芯片正常工作状态。所有模块在配置的时钟下运行功耗最高。优化运行模式功耗的方法主要是动态调整系统时钟频率通过MCG模块和关闭未使用的外设时钟通过相应的模块控制寄存器。4.2 等待模式Wait Mode通过执行WAIT指令进入。在此模式下CPU时钟停止CPU进入低功耗状态但系统总线时钟BUSCLK和外设时钟如果使能仍然运行。这意味着定时器、串口等外设可以继续工作并产生中断。进入执行WAIT指令。CPU的CCR寄存器中的中断屏蔽位I会被自动清除从而允许中断唤醒。唤醒任何使能的中断请求IRQ均可将CPU从等待模式唤醒。唤醒后CPU会首先执行中断服务程序ISRISR返回后程序将从WAIT指令之后继续执行。适用场景适用于需要外设如定时器、ADC转换完成、串口接收周期性唤醒CPU进行短暂处理的场合。功耗低于运行模式但高于停止模式。4.3 停止模式Stop Modes停止模式是功耗最低的模式通过执行STOP指令进入。根据配置不同分为Stop3和Stop2两种子模式其进入条件由SOPT1.STOPE、SPMSC1.LVDE/LVDSE、SPMSC2.PPDC等寄存器位共同决定。表 4.1 停止模式选择逻辑STOPEENBDM (BDCSCR)LVDE LVDSEPPDC (SPMSC2)进入的模式0XXX停止模式被禁用执行STOP指令将触发非法操作码复位11XXStop3模式且BDM保持活动10两者均为1XStop3模式电压调节器保持活动LVD使能10任一为00Stop3模式10任一为01Stop2模式4.3.1 Stop3模式快速唤醒的平衡之选Stop3是一种折中方案在功耗和唤醒速度之间取得了良好平衡。状态保持所有内部寄存器、RAM内容、I/O引脚状态均保持不变。时钟所有系统时钟停止。但MCG模块的参考时钟如果通过MCGC1.IRCLKEN/IREFSTEN或MCGC2.ERCLKEN/EREFSTEN使能可以继续运行以供RTC或ADC异步模式使用。电压调节器默认进入待机状态。但如果使能了低电压检测LVD或后台调试模块BDM则调节器保持完全活动状态以支持这些功能。唤醒源非常丰富包括外部异步中断引脚IRQ、所有具有中断功能的端口引脚PIAx, PIBx, PIDx。内部模块中断RTC中断、ADC转换完成中断、SCI接收中断、低电压警告LVW中断。复位引脚RESET。低电压检测LVD复位。唤醒过程如果由中断唤醒MCU将直接跳转到对应的中断向量执行ISR。唤醒延迟很短通常在几微秒到几十微秒量级因为核心逻辑供电保持。Stop3模式配置心得如果应用中需要ADC在休眠期间进行周期性采样例如温度监控则必须配置ADC使用异步时钟源ADCSC2.ADACT。在进入Stop3前确保LVD在停止模式下使能设置SPMSC1.LVDE1且LVDSE1。这是因为ADC模块在停止模式下工作需要LVD系统保持活动以维持其模拟部分的供电。4.3.2 Stop2模式极致低功耗的终极手段Stop2是功耗最低的模式适合电池供电设备长期待机。状态保持仅保持RAM内容。所有内部寄存器包括I/O端口寄存器和大部分内部电路都会掉电。I/O引脚的状态由硬件锁存器保持但控制逻辑已失电。时钟与电源所有时钟停止电压调节器关闭。只有RAM处于待机状态以维持数据。唤醒源非常有限。主要唤醒源RESET引脚。这是一个硬复位唤醒后MCU如同重新上电。特定版本唤醒源在3M05C或更早的掩膜版本中PTA7/IRQ引脚也可作为唤醒源低电平有效。但在新版本中已移除设计时不应依赖于此。RTC唤醒如果RTC使能且其时钟源如LPO在进入Stop2前已配置好RTC中断也可以唤醒系统。唤醒过程与恢复这是Stop2模式最复杂、最需要小心处理的部分。因为唤醒相当于一次上电复位POR所有模块寄存器恢复为复位默认值。LVD复位功能使能如果电压低于阈值MCU会保持在复位状态。CPU从复位向量0xFFFE-0xFFFF开始执行。关键标志位SPMSC2.PPDF位会被置1指示本次复位是由Stop2唤醒引起的。关键状态I/O引脚仍处于硬件锁存状态直到软件向SPMSC2.PPDACK位写1锁存器才会释放引脚控制权交还给端口寄存器。Stop2模式恢复流程软件必须遵循// 假设进入Stop2前已将需要保持的端口寄存器值保存到RAM中例如 // savePortA PTAD; savePortADD PTADD; __asm STOP; // 进入Stop2 // 系统被RESET唤醒后从复位向量开始执行 void main() { // 1. 标准初始化时钟、外设等 sys_init(); // 2. 检查是否从Stop2唤醒 if (SPMSC2_PPDF) { // 3. 首先恢复I/O端口的状态 // 必须先恢复方向寄存器再恢复数据寄存器顺序很重要。 PTADD savePortADD; // 恢复端口方向 PTAD savePortA; // 恢复端口输出数据 // 对于配置为上拉的输入引脚也需相应恢复上拉使能寄存器。 // 4. 重新配置在Stop2中失能的外设模块如UART, SPI, ADC等 uart_reinit(); adc_reinit(); // 5. 最后确认恢复完成清除PPDF标志并应答 SPMSC2_PPDACK 1; // 释放I/O锁存此操作会同时清除PPDF位 // 6. 跳转到之前的应用状态例如从RAM中恢复任务上下文 restore_application_context(); } else { // 冷启动或其它复位执行完整的应用初始化 full_application_init(); } // ... 主循环 }重要警告如果在写PPDACK之前没有恢复端口寄存器一旦锁存释放所有引脚将瞬间变为复位后的默认状态高阻输入可能导致外部电路出现意外电平跳变造成系统故障。4.4 各模块在停止模式下的状态总结表 4.2 外设模块在停止模式下的行为模块Stop2Stop3CPU关闭待机RAM待机数据保持待机Flash/EEPROM关闭待机并行端口寄存器关闭值丢失待机值保持ACMP关闭关闭ADC关闭可选开启需异步时钟和LVDIIC, SCI, SPI, TPM关闭待机MCG关闭可选开启参考时钟RTC可选开启可选开启电压调节器关闭可选开启需LVD或BDMXOSC外部晶振关闭可选开启I/O 引脚状态被锁存保持状态保持BDM关闭若ENBDM1则实际进Stop3可选开启LVD/LVW关闭若LVDSE1则实际进Stop3可选开启5. 低功耗设计实战与测量技巧理论最终要服务于实践。下面结合一个典型的电池供电远程传感器节点场景来规划其功耗状态切换。应用场景设备每10秒唤醒一次采集温度ADC和数字信号通过CAN总线发送数据然后进入休眠。要求平均电流低于50μA。功耗状态规划主动运行期~10ms模式Run Mode全速假设总线时钟8MHz。动作初始化CAN控制器发送数据处理通信。此阶段电流可能为5-10mA。数据采集期~5ms模式Run Mode可适当降频。动作开启ADC进行采样。保持CAN模块关闭以省电。休眠期~9.985s目标Stop3模式。理由需要RTC定时唤醒10秒间隔且希望快速恢复。Stop3的唤醒延迟短恢复简单。前置配置配置RTC时钟源为LPO1kHz。设置RTC定时器溢出值为1000010秒。使能RTC溢出中断。确保LVD在停止模式下使能LVDE1, LVDSE1如果ADC需要在休眠期间工作本例不需要。关闭所有不必要的外设时钟SPI, I2C, TPM等。将所有未使用的I/O引脚设置为输出低电平或输入上拉。代码示例片段void enter_stop3_mode(void) { // 1. 检查并等待所有关键操作完成如Flash写入、CAN报文发送完成 while(!CAN_TxComplete); // 假设的标志位 // 2. 配置唤醒源RTC中断已使能 // 3. 清除可能存在的旧中断标志 RTCSC_RTIF 1; // 4. 确保进入Stop3的条件根据表4.1 // STOPE 1 (SOPT1) // ENBDM 0 (默认除非调试需要) // LVDE LVDSE 根据ADC需求设置 // PPDC 0 (SPMSC2) // 5. 执行等待中断指令然后进入停止模式 // 先执行WAIT让CPU暂停等待RTC中断发生在中断服务程序中再执行STOP // 这是一种常见做法确保状态干净地进入Stop3 EnableInterrupts; // 全局中断使能 __asm WAIT; // WAIT之后CPU暂停直到RTC中断发生 // RTC中断服务程序 (ISR) void RTC_ISR(void) { RTCSC_RTIF 1; // 清除中断标志 // 在ISR中执行STOP指令进入Stop3 __asm STOP; // STOP之后CPU时钟停止。下次唤醒将从STOP之后的下一条指令开始 // 注意对于中断唤醒Stop3实际是从中断向量开始执行即ISR。 // 而我们在ISR里执行了STOP那么唤醒后会继续执行ISR中STOP之后的代码吗 // 不这是一个需要特别注意的点 } // 更常见的做法是在main循环中根据一个由RTC中断置位的标志位来决定进入STOP }更稳健的流程volatile uint8_t rtc_wakeup_flag 0; void main(void) { sys_init(); rtc_init(); // 配置RTC 10秒中断 EnableInterrupts; while(1) { if(rtc_wakeup_flag) { rtc_wakeup_flag 0; // 执行测量和发送任务 perform_measurement(); send_can_message(); // 任务完成后清理并准备再次休眠 prepare_for_sleep(); } // 没有任务时进入等待模式功耗降低 __asm WAIT; } } // RTC中断服务程序 void RTC_ISR(void) { RTCSC_RTIF 1; // 清除标志 rtc_wakeup_flag 1; // 设置唤醒标志 // ISR返回后CPU从WAIT指令后继续执行发现标志置位进入任务处理 } void prepare_for_sleep(void) { // 关闭不需要的外设如CAN控制器、ADC电源等 CAN_CCTL0_CANE 0; // 禁用CAN模块 // 配置所有I/O为低功耗状态 // ... // 此时系统已处于低功耗状态主循环中的WAIT指令将使CPU暂停 }功耗测量技巧使用高精度万用表串联在供电回路中测量平均电流。对于间歇性工作的设备万用表的读数刷新率可能跟不上此时观察其“保持”功能或统计功能得到的平均值。使用示波器小采样电阻在电源路径上串联一个1-10Ω的精密电阻用示波器测量电阻两端的电压差。根据欧姆定律I V / R计算瞬时电流。这样可以清晰看到唤醒、运行、休眠各个阶段的电流波形和峰值。隔离测量在测试低功耗模式时务必断开调试器如BDM因为调试器本身会向目标板供电或注入电流导致测量结果严重失真。可以编程让芯片进入休眠后再断开调试器进行测量。6. 常见问题排查与避坑指南在实际开发中低功耗和CAN总线相关的问题最为常见。这里汇总一些我踩过的“坑”和解决方案。6.1 低功耗模式相关问题1芯片无法进入Stop3或Stop2模式执行STOP指令后似乎没反应。检查SOPT1.STOPE位这个位必须为1才能允许停止模式。默认可能是0。检查中断标志在执行STOP指令前如果有任何未处理的中断标志特别是像LVD、RTC这种在停止模式下可能仍能产生中断的模块MCU可能会立即被唤醒。确保清除相关中断标志。检查全局中断屏蔽位I执行STOP指令时CCR中的I位状态不影响进入停止模式但会影响唤醒。通常我们希望中断能唤醒所以I位应为0中断使能。使用调试器如果通过BDM调试确保BDCSCR.ENBDM位为0否则MCU会进入“带BDM的Stop3”功耗和唤醒行为都会不同。问题2从Stop2唤醒后I/O引脚状态混乱外围设备异常。这是最典型的问题。根本原因就是没有遵循正确的恢复流程。务必严格按照第4.3.2节描述的步骤操作先恢复所有GPIO的端口数据方向寄存器DDR和数据寄存器Data重新初始化所有使用到的外设模块最后再写PPDACK。建议在进入Stop2前将关键端口寄存器的值DDR, Data, Pull-up Enable保存到RAM中的特定区域。唤醒后先进行最小系统初始化时钟等然后立即从RAM恢复这些值。问题3低功耗模式下电流仍然有几百微安达不到数据手册的典型值可能几个微安。检查浮空输入引脚这是最大的漏电流来源。确保每个未使用的引脚都配置为输出低电平或输入上拉。检查模拟引脚未使用的ADC输入引脚应接地或接到一个确定的电压如通过电阻分压到VDD/2避免悬空。检查外部电路MCU本身的功耗达标了但外部电路可能还在耗电。检查是否有LED、电平转换芯片、传感器等外部器件在休眠时未被断电。测量方法尝试仅给MCU核心供电断开所有非必要的外部负载进行测量以确定问题是在MCU还是外围。6.2 CAN总线通信相关注虽然输入资料未包含CAN模块具体章节但作为该系列核心特性结合通用CAN原理补充常见问题。问题1CAN节点无法加入网络或错误帧频繁。波特率配置这是首要检查点。确保网络中的所有节点波特率、采样点设置完全一致。计算波特率时注意MC9S08DN60的CAN模块时钟源通常是总线时钟BUSCLK和预分频器、时间段设置。终端电阻CAN总线两端最远距离的两个节点必须各接一个120Ω的终端电阻。缺少或电阻值不对都会导致信号反射通信失败。物理连接检查CAN_H和CAN_L是否接反线路是否有短路或断路。使用示波器观察波形健康的CAN信号应该是差分对称的。问题2发送报文成功但接收不到或接收中断不触发。验收过滤设置检查CAN接收屏蔽寄存器IDAM, IDMR和接收标识符寄存器IDAR。如果过滤条件设置过窄会屏蔽掉目标报文。接收缓冲区Rx Buffer和FIFO确保已正确启用接收缓冲区或FIFO并清除了相应的接收标志。读取数据后必须通过特定操作如写标志位来释放缓冲区以便接收新报文。中断使能检查CAN控制寄存器中接收中断使能位是否打开同时确保CPU的全局中断已使能。问题3在低功耗模式如Stop3下CAN模块无法工作或无法唤醒MCU。时钟需求CAN模块需要总线时钟BUSCLK才能工作。在Stop3模式下系统时钟停止CAN模块必然无法进行报文收发。因此CAN不能作为Stop3模式的唤醒源。唤醒替代方案如果需要CAN报文唤醒通常有两种方法使用外部中断将CAN收发器的错误或唤醒输出引脚连接到MCU的一个外部中断引脚如IRQ。配置该中断引脚在Stop3下有效。当总线上有活动时收发器产生唤醒信号MCU先被外部中断唤醒然后再初始化CAN模块进行通信。使用周期性唤醒如之前的例子使用RTC定时唤醒MCU然后让MCU主动查询CAN总线是否有报文。这种方式实时性较差但功耗可控。问题4程序跑飞疑似看门狗COP复位。COP配置MC9S08DN60的看门狗时钟源可以是总线时钟或独立的LPO。在低功耗模式下如果总线时钟停止必须将看门狗时钟切换到LPO否则看门狗计数器会停止失去作用。喂狗时机在低功耗模式下如果看门狗仍使能且使用LPO时钟必须在它溢出前唤醒MCU并执行喂狗操作。这需要在低功耗设计时统筹考虑唤醒间隔和看门狗超时时间。最后嵌入式开发离不开扎实的调试。充分利用芯片的BDM接口和调试模块DBG设置断点、观察变量、单步执行是定位复杂问题的利器。养成阅读官方数据手册和参考手册的习惯里面藏着所有问题的答案。MC9S08DN60系列是一颗非常经典的芯片其设计理念在如今的低功耗MCU中依然常见。吃透它的功耗管理和外设控制对你理解更复杂的ARM Cortex-M系列芯片也会有极大的帮助。