ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

STC15F2K60S2单片机例程合集:常见外设原理与实战避坑指南

STC15F2K60S2单片机例程合集:常见外设原理与实战避坑指南 简介这套例程集合面向STC15F2K60S2单片机的学习者和项目开发者以C语言实现为主覆盖GPIO控制、中断处理、定时器配置、串口通信、ADC采样、PWM输出、LCD显示和红外收发等常用外设功能适合从基础入门到进阶移植的多种使用场景。资源包共含1286个文件大小4.17MB以235个h头文件、178个c源文件和86个hex烧录文件为核心配合uv2/uvproj工程文件、opt/plg配置文件以及lst/m51编译中间文件便于在Keil环境中直接打开、修改和验证同时板块划分清晰包括STC-开发板4-程序-C语言-V1、库函数与例程等独立目录。目前已有3943人浏览学习资源内还包括LCD128x64驱动、HC595扩展、SPI-PM25LV040、NTC测温、低功耗唤醒、双串口通信、PCA软串口、xdata扩展等进阶例程内容覆盖从LED闪烁、按键检测到复杂外设联调的完整链路。对初学者可逐行研读入门代码快速建立外设驱动与中断逻辑的直觉对有经验者也能直接移植到实际项目中减少重复开发时间是一份兼具教学与工程参考价值的单片机资料集。 做过几年嵌入式项目给我留下最深印象的不是各路ARM反而是这颗看着不起眼的STC15F2K60S2。它属于STC15系列增强型51内核单片机2KB SRAM加60KB Flash1T流水线架构主频最高能到35MHz左右虽然名字还带“51”实际吞吐量比老89C52强了不止一个档次。手上这套STC15F2K60S2例程集合覆盖了定时器、串口、数码管、LCD1602、OLED、PWM、ADC、EEPROM基本能覆盖课程设计、竞赛备赛、毕业设计里八成常见场景。这篇就把例程整理出来每个模块讲清楚原理、关键代码和踩过的坑适合正在学51单片机、准备蓝桥杯或者要做单片机设计的朋友直接抄作业。1. 这颗芯片为什么值得出一套例程1.1 老将不老STC15F2K60S2的资源盘点STC15F2K60S2是STC15系列里性价比很高的一颗料。很多人一听到“51内核”就以为它是上古产物实际上STC15已经把8051玩到近乎极致1T模式让大多数指令在1个时钟周期内完成同频下比传统12T的89C52快6到12倍。60KB的Flash对写复杂应用来说非常宽裕2KB的SRAM虽然比不了STM32但跑裸机状态机、时间片轮询足够。资源参数说明Flash60KB支持IAP/ISP可划分EEPROM区SRAM2KB内部RAM够裸机任务调度定时器T0/T1/T2/T3/T45个16位定时器含增强PWM相关功能ADC10位8通道集成在P1口转换速度可配PCA/PWM6路可做硬件PWM、捕获/比较串口2路支持波特率独立自带波特率发生器选项内置复位有可省外部复位芯片看门狗也可配选这颗料做例程还有一个现实原因它几乎是蓝桥杯单片机赛项和老版教学平台的常客。网上不少参考代码是STC15F2K60S2但很多是零散片段真正能组合起来跑的整套例程很少。我把常用外设攒成一套方便直接拿来做工程基底。1.2 例程规划的整体思路这套例程没有追求把每个外设拆成孤立Demo而是按“裸机项目最少依赖”来组织。基础层是系统节拍和串口日志中间层是按键、显示、ADC上层是舵机、电机驱动、EEPROM存取这类完整功能块。这样分层的好处是做新项目时直接复制基础工程往中间层加模块改引脚映射就能跑不用从零写寄存器。考虑到STC15F2K60S2没有硬件除法指令外的复杂外设抽象代码量不大所有例程都保留寄存器操作注释。可能有人觉得寄存器写法不如库函数优雅但对这颗芯片来说寄存器操作反而是最稳的路线STC官方库在不同型号间还有兼容差异自己控寄存器心里最踏实。2. 环境搭建与最小系统先把底子打好2.1 硬件最小系统注意点STC15F2K60S2内置时钟和复位电路最小系统比89C52还简单。芯片可以完全省掉外部晶振用内部IRC时钟频率在STC-ISP下载时配置成11.0592MHz或者22.1184MHz能同时照顾串口波特率和PWM频率精度。我自己常用11.0592MHz9600和115200波特率误差几乎为零。电源部分建议加一个100uF电解电容和两个0.1uF陶瓷电容一个靠近VCC引脚一个靠近ADC参考输入。STC15虽然对电源要求不算苛刻但做PWM驱动时如果电源纹波大ADC采样值会跳动这个在电磁炉、追光这类项目里特别明显。复位引脚可以直接悬空或通过10k电阻上拉内部有复位电路不需要外部复位芯片但为了下载稳定我习惯在RST引脚加一个1uF电容到地。下载电路是STC的老传统串口TTL电平直接下载不需要额外烧录器。USB转TTL模块选CH340或者CP2102都行接线是TXD接RXD、RXD接TXD共地。要注意STC15系列下载瞬间会冷启动下载器如果是那种没有断电控制的三线模块需要手动断电再上电才能触发下载最好直接用带DTR自动断电功能的下载板省心很多。2.2 Keil工程配置与烧录常见坑Keil里新建工程时芯片选择很重要。老版本Keil的设备列表里STC不像ST那么直观需要从STC官网或STC-ISP软件里安装对应的器件库包。如果Device列表里找不到STC15F2K60S2用STC-ISP的“Keil仿真设置”功能安装一次选到Keil安装目录就能识别全系列STC15。工程配置里有几个关键点。第一是内存模型一般选Small模式变量默认放在内部直接寻址区访问快。第二是Code Rom Size要选Large因为60KB Flash超过默认64KB寻址习惯不选大模式会有链接错误。第三是“Use Extended Linker”和XDATA相关设置STC15F2K60S2的2KB SRAM其实有一部分可以通过XDATA访问程序比较多时把大数组放XDATA能缓解data段空间不足。烧录时STC-ISP里要重点确认IRC频率选择这个会直接写入芯片的硬件配置寄存器。如果例程里用了定时器计算波特率IRC频率选错串口数据全是乱码。STC15系列还支持程序加密和ID号读取量产时可以在硬件选项里勾上“下次烧录时擦除用户EEPROM区”避免旧数据干扰。3. 基础外设例程定时器、串口、中断3.1 定时器例程1ms节拍与温度上下限报警STC15系列的定时器0在1T模式下时钟源是系统时钟不分频计数频率11.0592MHz。要产生1ms节拍重装值计算方式是65536 - (系统时钟 / 1000)代入就是65536 - 11059 54477。注意这里的结果是十进制写作0xD4CD。初始化时要先把AUXR寄存器的T0x12位置1开启1T模式再把T0设置为16位重装模式。void Timer0_Init(void) { AUXR | 0x80; // T0x1211T模式 TMOD 0xF0; // 清空T0模式位 TMOD | 0x01; // T0为16位定时器模式 TL0 0xCD; // 低字节重装值 TH0 0xD4; // 高字节重装值 ET0 1; // 开T0中断 EA 1; // 开总中断 TR0 1; // 启动T0 }温度上下限报警是把这个节拍用在状态检测里最常见的方式。用10ms定时标志位读一次NTC热敏电阻分压值换算成温度后与上限和下限比较超过上限拉高蜂鸣器引脚低于下限可以触发继电器加热。实际测试中要注意NTC电阻分压的采集曲线不是线性的建议用查找表或者Steinhart-Hart方程换算几十个温度点建表查插值就够用。定时器的中断函数里只置标志位主循环消费标志不要在里面做长操作否则节拍漂移会非常明显。这是新手最容易犯的错把浮点换算温度直接写进中断一个中断能占掉几毫秒。3.2 串口例程printf调试与系统日志串口1在STC15F2K60S2上有两种波特率产生方式最灵活的是用定时器1做波特率发生器设置T1x12为1。以11.0592MHz、115200波特率为例16位自动重装模式下的初值256 - (11059200 / 16 / 115200) 256 - 6 250 0xFA。这组参数实测非常稳定比9600波特率速度高日志刷屏时也不阻塞。void Uart1_Init(void) { SCON 0x50; // 串口1模式18位数据允许接收 AUXR | 0x40; // T1x1211T模式 TMOD 0x0F; TMOD | 0x20; // T1设为8位自动重装 TL1 0xFA; TH1 0xFA; ET1 0; // 关闭T1中断T1只做波特率发生器 TR1 1; ES 1; EA 1; }发送单字节可以用查标志位等待的轮询方式不占中断。要支持printf不同工程师习惯不同最稳妥的是在Keil中重写putchar即将字符通过串口发出再在主程序里调用printf。我还习惯在工程里加一个log_printf宏用条件编译开关日志功能调试完直接关掉不删除代码。3.3 外部中断例程小车测速的脉冲计数STC15F2K60S2有四个外部中断INT0到INT3可以配置为上升沿或下降沿触发还有电平触发。小车测速场景常用霍尔传感器或者对射光电编码器给脉冲信号把脉冲输出接到INT0引脚每次下降沿触发中断在中断里累加计数器配合定时器1秒中断计算转速。void External0_Init(void) { IT0 1; // INT0下降沿触发 EX0 1; EA 1; } void INT0_Isr(void) interrupt 0 { pulse_count; // 每个脉冲加1 }这个方案里最常见的问题是传感器输出信号抖动同一个轮齿可能触发多次。硬件上可以在信号线上并联一个0.1uF电容滤波软件里在中断服务函数开头加一个“清标志后延时再判断电平”的消抖逻辑或者用定时器0做100us的窗口检测。实际测速精度要求高时用PCA模块做捕获更好那个是硬件捕获不受中断延迟影响。STC15F2K60S2的PCA模块可以配置在上升沿捕获当前计数值算脉宽和脉冲间隔都很准。4. 显示与交互例程4.1 数码管动态扫描数码管动态扫描的原理是视觉暂留用非常快的时间轮流点亮每一位。比如四位共阴数码管位选信号轮流选中个位、十位、百位、千位同时段码输出对应数字保持1到2毫秒再切换下一位。人眼看过去就是稳定的四位数字。code unsigned char seg_table[] { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, // 0,1,2,3,4 0x92, 0x82, 0xF8, 0x80, 0x90 // 5,6,7,8,9 }; void DisplayScan(void) { P0 0xFF; // 消隐防止拖影 switch (scan_pos) { case 0: P2 0x01; break; case 1: P2 0x02; break; case 2: P2 0x04; break; case 3: P2 0x08; break; } P0 seg_table[display_buf[scan_pos]]; scan_pos (scan_pos 1) % 4; }这个例程的核心坑是消隐。如果切换位选前不清空段码上一个位的数据会短暂闪烁在当前位人眼会看到鬼影。P0输出段码前先把所有位选关掉或者先给P0写0xFF再切位选能明显改善拖影。动态扫描函数建议放在1ms定时器中断里调用而不是主循环while里跑。中断调用可以保证刷新频率稳定在250Hz左右不会因为主循环中有ADC转换之类的耗时操作而闪烁。4.2 LCD1602例程菜单与状态显示LCD1602用得最多的是8线接法和4线接法8线接线多但初始化简单4线省4个IO代码稍复杂一点。STC15F2K60S2的IO足够富裕新手建议直接用8线省心工程上IO吃紧时用4线。4线模式下数据引脚只接DB4到DB7初始化时序比较讲究必须先给三次0x30命令再切换为4线模式否则显示可能不启动。我比较常用4线驱动代码量不大。写命令和写数据两个函数关键在时序上要留有足够的延时特别是初始化阶段每步至少延时5ms。STC15速度快直接用软件延时循环时要注意优化等级Keil的O0和O2优化下延时差很多实测在O2优化下延时循环次数要调大。菜单显示在温度报警这类设计里很实用。第一行显示当前温度第二行交替显示上限和下限值用按键切到设置模式时第二行变成可编辑状态光标闪烁在调整位加键和减键修改数值设置完把参数保存到EEPROM。LCD1602本身不带光标闪烁以外的特殊效果需要自己维护一个缓冲区在定时中断里周期性刷新变化的内容而不是每次按键都Full刷屏这样能减少闪烁。4.3 OLED与IIC两线驱动如果项目里想显示曲线或者更多信息LCD1602不够用可以用SSD1306的0.96寸OLED。STC15本身没有硬件IIC外设需要用软件模拟IIC标准IIC时序是起始、停止、写字节、读应答。SCL和SDA两个引脚最好不要选在P3.0和P3.1因为那两个默认是串口引脚调试时容易冲突。我常用P2.0和P2.1避开下载和串口。OLED驱动代码可以直接移植网上开源的SSD1306驱动只需改动底层IIC的引脚宏和延时函数。STC15F2K60S2的GPIO翻转速度极快IIC时钟可以跑到400kHz的快速模式但OLED屏对上升沿要求不高慢一点更稳。软件IIC写EEPROM和OLED都要注意SDA方向切换在模拟接收应答位时要把SDA引脚从输出模式切回输入模式STC15的P2口配置成准双向口模式读取时不需要额外切方向这个比STM32的推挽输入配置省事。4.4 按键扫描非阻塞方案按键扫描最扎实的方案是状态机消抖而不是用delay延时消抖。delay会阻塞整个主循环在有多任务需求的工程里非常致命。状态机思路很简单每10ms检测一次按键电平连续两次检测结果相同才认为按键状态稳定产生事件。这样消抖和识别一步到位。typedef enum { KEY_IDLE, KEY_PRESS, KEY_RELEASE } KeyState; KeyState key_scan(void) { uint8_t level KEY_IO; switch (key_state) { case KEY_IDLE: if (!level) { key_state KEY_PRESS; return KEY_EVENT_NONE; } break; case KEY_PRESS: if (!level) { return KEY_EVENT_PRESSED; } else { key_state KEY_RELEASE; } break; case KEY_RELEASE: if (level) key_state KEY_IDLE; break; } return KEY_EVENT_NONE; }这套状态机比传统的两次比较法要清晰很多最重要的是不会漏掉“按下”事件。多按键场景可以扩展成矩阵键盘扫描原理类似关键是列扫描时必须设置未选中行为高阻或数字输入否则按键串扰严重。STC15的IO默认是准双向口读外部矩阵键盘时如果行引脚同时接了输出很容易出现电平打架我习惯把行引脚设置为高阻输入模式列引脚设置为推挽输出这样检测最干净。5. 控制类例程PWM、舵机与电机驱动5.1 用PCA模块输出PWMSTC15F2K60S2的PCA模块可以工作在PWM模式输出PWM信号到PCA0或者PCA1引脚。PCA时钟源可以选择系统时钟或系统时钟分频通过CMOD寄存器的CPS位配置。在11.0592MHz下如果CPS选择系统时钟PWM频率是11.0592MHz / 256约43kHz这个频率适合LED亮度调节和部分电机调速但驱动舵机一般不需要这么高。void PcaPwm_Init(void) { CMOD 0x02; // PCA时钟源为系统时钟/2 CCON 0x00; CCAPM0 0x42; // 使能PCA0的PWM模式禁止比较中断 CCAP0H CCAP0L 0x80; // 初始占空比50% CR 1; // 启动PCA计数器 } void set_pwm0_duty(uint8_t duty) { CCAP0H duty; // 更新占空比软件需要在下一个周期才生效 }PCA模式下的PWM输出极性是反的占空比寄存器存的是“高电平时间”的余数这个概念经常坑到新手。CCAP0H的值越大输出高电平时间越短实际输出波形是反相的。要在示波器上验证极性避免电机方向控制反。STC15F2K60S2还有一个独立的6路PWM模块可以输出互补PWM和死区控制驱动全桥或者H桥时用那个更合适PCA更适合简单的单路PWM场景。5.2 舵机控制从9g舵机到太阳能追光9g舵机的控制信号是50Hz、脉宽1ms到2ms的PWM。STC15F2K60S2用PCA输出50Hz的PWM需要把PCA时钟分频到合适的范围。以11.0592MHz为例PCA时钟选系统时钟分频为11.0592MHz / 16 691.2kHz一个PWM周期是256个计数此时PWM频率就是2700Hz离50Hz太远。所以驱动舵机不用PWM模式用PCA比较模式配合中断更合适或者直接用一个普通定时器产生50Hz中断在中断里翻转IO引脚模拟舵机脉宽。我用定时器0做200us中断维护一个脉宽计数变量。50Hz信号是20ms周期即100个200us。舵机在0度时脉宽0.5ms180度时脉宽2.5ms换算成计数就是2.5到12.5个200us取整精度够用。这种软件模拟方式对9g舵机完全够因为舵机本身响应带宽低200us的抖动根本感觉不出来。太阳能追光项目就是把两路光敏电阻分压接入ADC根据两路ADC差值改变舵机角度。关键经验是光敏电阻分压要加一个10k左右的下拉电阻并且ADC采样值要做滑动滤波否则云影飘过会让舵机疯狂乱摆。每100ms采样一次取最近5次平均值再把差值死区设在20左右小于死区不动作舵机就安静很多。5.3 MOS管驱动与负载控制用单片机IO直接驱动MOS管时要注意STC15的IO在推挽模式下驱动能力还是有限的。单片机IO推挽输出一般只有20mA左右的驱动能力直接驱动栅极电容大的功率MOS管开关速度会不够快发热严重。正确的做法是加一个专门的栅极驱动芯片或者用三极管做图腾柱驱动至少也要在栅极串联一个10到22欧姆的电阻并联一个10k放电电阻。MOS管下管驱动电路里源极接地、栅极接IO、漏极接负载这是最常见也最简单的方式。STC15的IO默认准双向模式如果直接驱动MOS管建议把引脚切换为推挽模式否则高电平输出能力不足。STC15特殊功能寄存器PxM1和PxM0控制IO模式我要把对应位设置成0b10即推挽输出。低电平驱动还是高电平驱动由NMOS还是PMOS决定NMOS要栅极电压大于源极才能导通5V单片机的IO驱动逻辑电平NMOS没问题但驱动12V或24V系统的MOS管时就需要电平转换了。驱动感性负载比如继电器、电磁阀时一定要在负载两端并联续流二极管否则关断瞬间的反向电动势可能打坏IO口。STC15的IO虽然内部有钳位二极管但那是ESD保护级别的扛不住继电器线圈的感应电压。续流二极管要靠近感性负载安装选1N4148或者5819都可以注意方向千万别接反阴极接电源正极阳极接负载端。6. ADC与EEPROM应用例程6.1 内部10位ADC使用STC15F2K60S2的ADC是10位逐次逼近型转换结果分存ADC_RES和ADC_RESL两个寄存器。启动转换前要先设置ADC_CONTR寄存器打开ADC电源并选择通道。ADC转换完成后ADC_FLAG置1这个标志要软件清零否则下一次转换结果会直接覆盖旧值。uint16_t adc_read_channel(uint8_t ch) { ADC_CONTR 0x80 | 0x40 | ch; // 开启ADC电源启动转换 while (!(ADC_CONTR 0x10)); // 等待ADC_FLAG置1 ADC_CONTR ~0x10; // 清ADC_FLAG uint16_t result ADC_RES; result (result 2) | (ADC_RESL 0x03); return result; }ADC的结果寄存器和常规51不同高位在ADC_RES低两位在ADC_RESL的最低两位。如果不小心把它们当成两个独立字节拼错位读出来的值会整体错位波形看起来像被截断。我刚开始用这颗芯片时就在这里踩过坑数据忽大忽小后来查手册才知道是拼接方式问题。ADC的参考电压默认是VCC如果要用精确参考可以把AVREF引脚接外部基准源比如TL431做2.5V基准这样采集电池电压时能避开VCC波动的影响。6.2 EEPROM读写与掉电保存STC15系列把Flash的一部分划成EEPROM区使用在STC-ISP下载时指定EEPROM大小比如划分2KB。这2KB通过IAP方式访问不需要外部存储芯片。IAP操作过程比普通RAM读写慢很多而且擦写次数有限一般约10万次所以设计时要避免频繁写。void eeprom_write_byte(uint16_t addr, uint8_t dat) { IAP_CONTR 0x80; // IAP使能 IAP_CMD 0x02; // 写命令 IAP_ADDRH (uint8_t)(addr 8); IAP_ADDRL (uint8_t)(addr 0xFF); IAP_DATA dat; EA 0; // 关中断防止触发时序异常 IAP_TRIG 0x5A; IAP_TRIG 0xA5; EA 1; _nop_(); IAP_CONTR 0x00; // 关闭IAP }写EEPROM前必须先擦除所在的扇区STC15的扇区大小视型号而定通常是512字节。如果只改一个字节而整个扇区没擦过写入会失败或者写入值不对。所以更新配置时我习惯先读一块配置到RAM在RAM里改好再整块擦除扇区整块写回。温度报警的上下限参数、校准值、清零后的累计计数都可以存在EEPROM里掉电不丢失。这里还要注意IAP操作时关闭总中断因为IAP触发时序要求严格万一中断插进来把IAP_TRIG的5A/A5拆开芯片可能误触发擦写命令源码里这个细节特别重要。7. 常见问题排查与避坑实录7.1 Keil仿真System Viewer为什么空白的STC15在Keil里仿真时System Viewer窗口一片空白原因是Keil自带的SFR描述文件没有覆盖STC15F2K60S2的特殊寄存器。解决方法是先用STC-ISP安装Keil器件库安装完成后在工程中重新选择芯片型号为STC15F2K60S2编译后进入仿真System Viewer里就能看到ADC_CONTR、CCON、IAP_CONTR这些STC15专有寄存器了。如果还是空白检查Options for Target的Debug设置里右侧器件列表是否显示STC开头的型号如果没有说明器件库没装上。STC15系列在Keil仿真时还有一个经典问题硬件仿真器不识别真机上的内部IRC频率仿真时定时器溢出频率和真机不一致。我建议串口和波特率相关功能不要依赖仿真器直接烧录跑真机通过串口打印观测。Keil仿真更适合纯逻辑调试比如状态机流程和按键扫描逻辑。7.2 Proteus仿真STC单片机xdata异常怎么办STC15系列芯片的仿真模型在Proteus里不算完善特别是xdata和部分SFR寄存器的访问经常出现仿真结果和真机不一致。如果你在Proteus里用STC15F2K60S2做仿真变量莫名其妙乱跳、数组访问错乱建议先检查编译器的内存模型设置确认不是Keil生成代码的问题。Proteus里的STC15模型对PCA、ADC、EEPROM的支持都不完整这些外设不要依赖仿真验证。最稳妥的做法是逻辑功能用标准8051模型或者AT89C52模型在Proteus里验证ADC、PWM、EEPROM这些和硬件强相关的功能直接下载到真机测。Proteus做原理图和接线检查没问题但不要指望它能精确模拟STC15的内部架构。这是很多备赛的朋友会踩的坑仿真好几天发现实物根本不走那个分支浪费时间。7.3 推挽输出发热与IO保护STC15的IO在推挽模式时拉电流和灌电流能力都可以到20mA左右但整个芯片总的电流限制在120mA上下。如果多个引脚同时灌入较大电流芯片会明显发热甚至烧毁。常见发热场景是IO直驱数码管段码8个段码都是低电平有效每段10mA八段全亮就是80mA这时如果再从P2口灌几十毫安芯片就开始发烫了。解决方法是数码管段码加限流电阻阻值取330欧姆到1k欧姆之间实测亮度差不多电流小很多。继电器这类大电流负载不要用IO直驱用三极管或驱动芯片IO只负责输出几毫安级别的控制信号。IO内部有ESD保护二极管但遇到外部高压静电还是可能被打坏批量产品建议在IO串联33欧姆电阻和两枚双向TVS管这个在工业控制板上很常见。7.4 多任务调度的最简单实现STC15F2K60S2跑不起重量级RTOS但裸机多任务用时间片轮询就够了。核心逻辑是给每个任务分配一个延时计数器在1ms时基中断里递减计数主循环周期扫描所有任务只要计数减到0就执行对应函数并重新装载周期。这个结构可以轻松管理十来个任务按键扫描、LED刷新、ADC采样、串口日志互不阻塞。void Task_Handler(void) { if (--task_delay[0] 0) { task_delay[0] 10; Key_Scan_Task(); } if (--task_delay[1] 0) { task_delay[1] 1; Display_Refresh_Task(); } if (--task_delay[2] 0) { task_delay[2] 100; Adc_Sample_Task(); } }时间片轮询的注意点是每个任务函数必须快速返回不能有阻塞等待。比如IIC读写EEPROM一个字节的写周期可能耗时几毫秒如果在任务函数里用死等整个调度就卡住了。我习惯把IIC状态机拆成多步每次执行一步没完成就返回下次再继续这样整个调度依然流畅。这套思路在STC15、STC8、STM32裸机上都通用值得掌握。这套例程我从大学实验室一直用到现在每次做新板子都是复制基础工程加中间层模块改引脚映射基本半天就能跑通一个新外设。最后分享一个小习惯所有例程顶部都留下调试宏开关串口日志用条件编译控制开一次日志刷屏找到问题后关一次宏编译烧录整个工程干净又有条理。单片机这东西不怕报错就怕报错后没有日志没有定位手段把调试能力当成功能来设计做项目会轻松很多。本文还有配套的精品资源点击获取
返回列表