ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于STM32F103RC的电子相册开发实战:原理图、PCB与源码全解析

基于STM32F103RC的电子相册开发实战:原理图、PCB与源码全解析 简介本资源是一套完整的基于STM32F103RC微控制器的电子相册嵌入式开发资料包面向嵌入式初学者、课程设计学生及STM32项目实践者解决从硬件设计到图像显示、SD卡文件管理、人机交互等全流程开发难题。压缩包共76个文件含30个C源文件实现LCD驱动、SD卡FAT读取、按键/触摸响应等核心功能、28个H头文件定义外设寄存器、结构体与接口函数、2个PCB工程文件与2个原理图文件完整双层板设计支持4.3寸TFT-LCD、MicroSD卡槽及独立按键另有调试配置、工程配置及Hex可执行文件等总大小2.16MB。已有442人学习下载资料结构清晰源程序模块化程度高原理图与PCB可直接复用配套代码注释详尽涵盖SPI多设备时序协调、FSMC/LCD初始化异常处理、低功耗唤醒机制等实战细节是掌握STM32嵌入式图像应用开发的优质入门与进阶参考。 在嵌入式开发这个圈子里按键点灯、串口打印玩久了很多人会进入一个瓶颈——单个外设都能跑但不知道怎么组合成一个完整的、有产品感的作品。基于STM32F103RC的电子相册恰好是跨过这道坎的一个经典项目它需要你把主控选型、显示驱动、文件存储、图片解码、人机交互甚至PCB设计全部串起来做完之后你手里拿到的是一个能真正常电、能翻页、能自动播放图片的实物而不是一堆零散的demo。这篇文章就围绕一套完整的开源设计资料含原理图、PCB源文件和源程序展开把每个环节为什么这么做、怎么做、实际做的时候有哪些坑一次性讲透。适合看这篇文章的人大概分两类一类是正在准备电子设计竞赛、课程设计的在校生需要快速掌握一个完整系统的设计流程另一类是工作了一两年、想从“只写固件”往“软硬通吃”方向走的嵌入式工程师。无论哪一类只要你手里有STM32F103RC这颗芯片或者准备入手一块对应的开发板这篇文章都能给你一个可以照着打样、烧录、跑起来的方向。1. 项目整体设计与思路拆解1.1 为什么选择STM32F103RC这颗芯片做电子相册主控芯片的选择不是拍脑袋定的背后有几条硬约束。先看芯片本身。STM32F103RC属于大容量产品线封装是LQFP64Flash有256KBRAM有48KB。这个配置放在电子相册场景里非常合适256KB Flash可以塞下完整的FatFs文件系统模块、TjpgDecode解码库以及UI状态机代码编出来镜像大概四五十KB还能剩不少空间。48KB RAM就更有讲究了后面讲JPEG解码的时候会提到TjpgDecode在工作时大约需要占用20KB到40KB的缓冲区如果换用C8T6那20KB RAM解码JPEG会非常勉强用RC的48KB RAM可以比较从容地做整行缓冲和多重缓冲。再对比一下同系列其他型号。下表是几颗常见芯片的差异芯片型号FlashRAM封装适合场景STM32F103C8T664KB20KBLQFP48简单外设实验跑小固件STM32F103RBT6128KB20KBLQFP64中间容量引脚够但RAM紧STM32F103RCT6256KB48KBLQFP64图片/图标资源多、跑RTOSSTM32F103VCT6256KB48KBLQFP100需要大量GPIO或外部总线扩展RCT6和RC的核心区别在FlashRC是256KBRCT6是256KB其实RC和RCT6的Flash和RAM完全一样只差在命名封装的温度等级和一些细分型号差异所以在很多资料里RC和RCT6是可以直接互相替代的。真正有差别的是引脚资源如果你要做FSMC并口屏需要PB0~PB15这样的数据口LQFP64刚好够用再想外挂一个SRAM或并口摄像头引脚就会很紧张。做电子相册不涉及特别复杂的并行外设所以LQFP64封装的RC是最省心的选择——引脚够用也不像LQFP100那样手工焊接难度大。1.2 功能框架与方案选型电子相册这个名字听起来简单拆开之后其实由以下几个子系统构成图片存储相册总得有“相册”吧一般用SD卡/TF卡存图片MCU通过FAT文件系统读取。图片解码SD卡里存的JPG、BMP不能直接在屏幕上显示必须解码成RGB像素数据。显示驱动解码后的像素数据要送到TFT液晶屏这涉及屏幕控制器的初始化、像素写入时序。人机交互至少要有上一张、下一张、自动播放切换这几个按键功能。电源管理USB供电或锂电池供电都需要稳定的3.3V电源。方案选型上有几个关键分叉点我直接给结论。第一屏幕接口选SPI还是FSMC并口。SPI屏的优点是引脚占用少、接线简单PCB也好画缺点是像素刷新慢一张320x240的图全屏刷新需要几百毫秒翻页会有轻微延迟。FSMC并口屏可以把LCD当成一块外部存储器来操作写像素速度非常快但需要8根甚至16根数据线外加控制线PCB布线和程序复杂度都会上升。对电子相册这种“不追求实时刷新、更看重翻页流畅”的应用我建议用SPI接口的TFT屏型号以ILI9341或ST7735为主2.4寸或2.8寸分辨率240x320。实测下来只要SPI时钟跑到36MHz左右翻一页的延迟在可接受范围。第二SD卡通信方式选SPI还是SDIO。SDIO模式速度确实快但在STM32F103上SDIO的代码配置比SPI模式麻烦不少而且对PCB布线要求高高速模式下容易出信号完整性问题。电子相册读取的图片文件普遍在100KB到500KBSPI模式下2.25MHz到4.5MHz的时钟读一张图大约几百毫秒这个速度完全够用。所以我更推荐用SPI方式驱动SD卡把SPI1的引脚同时复用给LCD和SD卡通过片选脚切换外设。第三图片格式选BMP还是JPEG。BMP格式没压缩解析逻辑最简单适合入门但一张240x320的24位BMP就有230KB一张16位BMP也有一百多KB存储效率很低。JPEG格式压缩率高同样一张图只有三四十KB卡里能存几百张但需要引入解码库。这里推荐用TjpgDecode这个小巧的JPEG解码库它专为嵌入式设计代码量小配合STM32F103RC的48KB RAM可以流畅解码。2. 原理图设计要点解析2.1 最小系统晶振、复位、调试接口一个都不能省拿到原理图第一眼先看最小系统。网上很多新手画的板子功能能跑但最小系统设计得潦草导致下载不稳定、RTC跑不准、偶尔死机这些都是基础没打牢。先说晶振部分。STM32F103需要两个晶振主晶振HSE用8MHz经过内部PLL倍频到72MHz系统时钟副晶振LSE用32.768kHz给RTC实时时钟用。电子相册如果只做图片翻页可以不用RTC但资料里的原理图一般都保留了LSE方便你后期加日期时间显示功能。晶振旁边要放两个负载电容8MHz主晶振用22pF32.768kHz用12.5pF左右。有些新手会把电容省掉后果是晶振起振困难或者频率偏很多。晶振尽量靠近MCU的OSC_IN和OSC_OUT引脚走线要短周围不要走高电平翻转的信号线最好用地围起来。复位电路是另一个容易出问题的地方。STM32的NRST引脚低电平复位正确做法是接一个10k上拉电阻到3.3V再接一个100nF电容到地形成RC复位延时。如果板上没做复位按键也要保留电阻电容因为调试器在连接SWD时经常需要硬件复位。启动模式也要注意。BOOT0和BOOT1引脚不能悬空否则上电时可能随机进入系统存储器启动模式代码烧进去却不执行。规范做法是BOOT0接10k下拉到地BOOT1同样接一个10k下拉。调试接口方面SWD只要SWDIO、SWCLK两根线加GND和3.3V就能下载调试比JTAG省引脚建议用SWD。SWDIO和SWCLK需要接上拉电阻吗一般调试器内部已经有上拉了但为了稳定原理图上也常给SWDIO加一个10k上拉SWCLK加一个10k下拉这样即使不接调试器也不会误触发。模拟电源引脚VDDA和VSSA一定不能直接接数字电源很多人忽略这个导致ADC采样不稳定。标准做法是在VDDA和VDD之间串一个10欧姆电阻或磁珠然后VDDA对地接一个1uF加一个10nF电容。VREF引脚如果存在也需要单独滤波。2.2 电源部分USB供电与锂电池备份电子相册的功耗主要来自屏幕背光和主控整体电流在100mA到200mA之间用USB的5V供电就很稳定。原理图里的电源方案通常是USB的5V经过一个AMS1117-3.3线性稳压器降到3.3V。AMS1117虽然便宜好用但要注意压差和功耗。输入5V输出3.3V压差1.7V如果后级电流200mALDO上消耗的功率就有0.34W对小封装来说已经有点烫了。解决办法可以是换成DC-DC降压模块或者在原理图上给LDO的散热焊盘做大一点加过孔阵列散热。如果做的是便携款想用锂电池供电可以在USB输入和5V之间加一个TP4056锂电池充电模块电池电压经过LDO一样转3.3V这样USB口既负责充电也负责供电。电源部分的滤波电容不能省。AMS1117的输入端要放一个10uF电解电容加一个100nF陶瓷电容输出端同样放一个10uF和一个100nF。另外STM32每个VDD引脚旁边都要放一个100nF去耦电容而且要尽量靠近引脚放置否则高频噪声会影响芯片稳定性。STM32F103RC是64脚封装VDD引脚有好几个每个都得配不能偷懒只放一两个。屏幕的背光LED电源是从3.3V直接取的还是单独接一般屏幕模块的背光LED电流几十毫安从3.3V取电没问题关键是限流电阻要算准。常见的2.4寸屏背光LED压降大概3V左右工作电流20mA如果直接接3.3V电源需要串联一个15欧姆左右的限流电阻。但很多屏幕模块已经内置了限流电阻原理图上就不需要再加。这里建议设计时留一个贴片电阻位如果屏幕模块自带电阻就直接短接如果不带就焊上15欧姆。2.3 显示、存储与交互接口的连线设计显示部分以SPI接口的ILI9341为例典型引脚定义如下屏幕引脚作用接主控引脚VCC3.3V电源3V3GND地GNDCS片选低有效任意GPIO如PB12RS/DC数据/命令选择任意GPIO如PB11RST复位低有效任意GPIO如PB10SDASPI数据输入SPI1_MOSI (PA7)SCKSPI时钟SPI1_SCK (PA5)SDOSPI数据输出SPI1_MISO (PA6)LED背光控制定时器PWM脚如PB0这里有一个细节ILI9341的SPI接口在读取模式时才用到SDO如果只做写操作SDO可以悬空但为了以后扩展和调试方便还是把它接到了SPI1_MISO上。背光LED脚用定时器的PWM输出控制可以实现亮度调节我用的是TIM3_CH3对应的引脚是PB0这是个顺便加的亮点功能。SD卡部分如果采用SPI模式典型连接如下TF卡引脚作用接主控引脚CS片选任意GPIO如PB9SCKSPI时钟SPI1_SCK (PA5)MOSISPI数据输入SPI1_MOSI (PA7)MISOSPI数据输出SPI1_MISO (PA6)VDD3.3V电源3V3VSS地GNDCD卡检测任意GPIO上拉输入SD卡的MISO和CS线建议各加一个10k上拉电阻到3.3V因为在SPI模式下SD卡默认是高阻态上拉能保证空闲时电平稳定减少误读。卡检测脚CD如果引脚不够可以直接接地或者悬空软件上不检测卡是否存在也不影响基本功能。按键部分直接用GPIO上拉输入。比如做“上一张”、“下一张”、“自动播放”、“菜单”四个按键每个按键一端接GPIO另一端接地。GPIO内部配置为上拉输入模式按键没按下时读到高电平按下时读到低电平。不用外部上拉电阻省器件也足够稳定。3. PCB布局布线实战经验3.1 布局规划先把功能模块“圈地”再摆元件原理图画完PCB才是真正考验耐心的地方。我自己画过几个版本发现最高效的做法是先规划功能区再一个个区域摆元件而不是拿到元件库就乱放。第一版布局时先按功能把板子分成几个区域USB电源在板子边缘LDO和滤波电容紧随其后MCU放在板的中心偏电源区域位置TFT屏幕的排针接口放在板子的一侧方便屏幕用排线翻折TF卡座放在板的另一侧或屏幕排针对面方便插拔按键放在板子边缘让位到能按到的位置。电源电路要遵循“输入电容靠近LDO输入端输出电容靠近LDO输出端”的原则AMS1117的散热焊盘要大上面打几个过孔帮助导热。MCU的去耦电容必须紧挨着对应的VDD引脚如果放远了高频滤波效果大打折扣。晶振的位置在两颗芯片之间特别讲究。8MHz晶振靠近OSC_IN/OSC_OUT旁边不要走时钟线、PWM输出线晶振下面的地层要完整。我在第一版PCB上把晶振放在了两条SPI走线之间结果屏幕虽然能亮但偶尔会白屏闪烁。后来重新布局把晶振挪到板边SPI走线从另一侧绕过去问题就消失了。屏幕排针和SD卡座之间要尽量避免长距离平行走线。屏幕接口的信号线是SPI时钟和数据频率有几十MHzSD卡的MISO也要传数据两者平行跑十几厘米容易出现串扰。我的做法是让屏幕排针在板子右侧SD卡座在板子左侧中间隔着MCU天然隔离。3.2 关键布线电源加粗、SPI走短、地平面完整布线阶段有两个重点电源和地线还有SPI高速信号线。电源线加粗。3.3V主干走线至少0.5mm宽最好1mm因为LDO出来不仅要给MCU供电还要给屏幕背光、SD卡供电。屏幕背光瞬间启动电流比较大如果电源线太细压降会让屏幕闪烁。GND走线同样要加粗而且整板最好用铺铜来做底面接地这样不仅降低地阻抗还能起到屏蔽作用。SPI信号线要遵循“短、直、少过孔”的原则。CLK和MOSI、MISO尽量等长间距拉开一点避免相互耦合。CLK线可以稍微粗一点例如0.3mm数据线0.25mm。如果板层允许在SPI下方铺铜接地形成微带线结构信号质量更好。过孔越少越好每个过孔都会引入寄生电容和电感会让信号边沿变缓。晶振的走线要特别照顾。OSC_IN和OSC_OUT引脚到晶振的走线尽量对称且短晶振的地焊盘要直接过孔连到主地平面。晶振区域下方不能有其他信号线穿过特别是SPI等高频线。这一点很容易被忽视因为原理图连线没问题但PCB一布局晶振位置受限就会有人图省事从晶振下面走线。TF卡座的焊接和布线是另一个容易翻车的地方。很多卡座引脚间距很小焊接容易连锡建议在封装周围多留一点手焊空间。走线时注意TF卡的VDD和VSS要加一个10uF电容做储能因为SD卡在读写时电流瞬变很大电压跌落会导致初始化失败。3.3 封装核对与生产文件输出PCB画完最怕的是拿到焊接才发现封装错了。芯片选STM32F103RC是LQFP64封装在Altium Designer和嘉立创EDA的库里都能直接搜到但一定要核对引脚第一脚方向。TFT屏幕排针如果是2.54mm间距要注意排针的定位孔方向TF卡座种类很多同一个封装在不同库里的引脚定义可能不一样必须对着数据手册一一核对。如果你用的是Altium Designer从原理图生成PCB后先跑一遍ERC检查再跑一遍DRC。如果跟我一样用嘉立创EDA画也可以在导出Gerber前做DRC检查。常见的问题包括走线间距不足、过孔孔径太小、封装焊盘重叠。Gerber导出之后推荐用在线Gerber查看器预览一遍确认没有丢失层、没有镜像、没有多余字符。打样时PCB厚度一般选1.6mm标准板厚铜厚1盎司即可。电子相册这种低速板两层板就够不需要做四层。PCB尺寸可以做到8cm x 10cm刚好能把屏幕排针、SD卡座、按键、USB口都放下又不至于太大浪费板材。4. 源程序架构与关键代码实现4.1 软件分层与初始化流程程序部分如果从零白手起家工程量其实不小。所以我习惯把代码分成三层开发时逐层调试底层硬件驱动层SPI读写函数、LCD初始化和画点函数、SD卡SPI驱动、按键扫描、PWM背光控制。中间件层FatFs文件系统、TjpgDecode解码库。应用层图片列表扫描、翻页逻辑、自动播放状态机。初始化流程建议按下面这个顺序写每做一步都可以通过串口打印确认状态配置系统时钟PLL倍频到72MHz。初始化GPIO、SPI1、TIM3PWM。初始化LCD发送初始化序列清屏。初始化SD卡切换到SPI高速模式挂载FatFs。扫描SD卡根目录收集图片文件名。显示第一张图片进入主循环。这里有一个特别容易踩的坑SD卡的SPI初始化必须分两个阶段。SD卡上电后默认工作在全速模式不对SD卡上电后必须先以低速SPI通常400kHz以下发送至少74个时钟脉冲然后再发送CMD0进入SPI模式最后用CMD1或ACMD41初始化。初始化成功后才能把SPI时钟切到高速。如果一上来就用高速时钟去发CMD0很多卡直接不响应。代码里可以用两个SPI配置函数来解决一个低速初始化一个高速读写。4.2 TFT屏幕驱动的几个关键细节SPI接口TFT屏幕的驱动并不是简单的“写两个字节数据”它分命令和数据的区分。以ILI9341为例RS/DC引脚低电平表示当前传输的是命令高电平表示是数据。所以核心的写命令、写数据函数是这样的void LCD_WriteCmd(uint8_t cmd) { LCD_DC_LOW(); // 命令模式 LCD_CS_LOW(); SPI_SendByte(cmd); LCD_CS_HIGH(); } void LCD_WriteData(uint8_t data) { LCD_DC_HIGH(); // 数据模式 LCD_CS_LOW(); SPI_SendByte(data); LCD_CS_HIGH(); }像素写入要设置访问窗口。每次在屏幕指定区域写像素前先发送CASET列地址设置和PASET行地址设置命令然后连续写入RGB565格式的像素值。如果初始化序列里设置了RGB还是BGR的顺序颜色显示会完全不同——我的第一个版本初始化序列里忘了设置BGR位结果整个屏幕的红色和蓝色对调了排查了半天才发现是这一位的问题。屏幕初始化序列里还有几个雷区。ILI9341的初始化流程不能照抄某宝店铺的例程不同厂家屏的初始化寄存器参数可能有差异。建议先用厂商给的初始化代码如果出现颜色偏色或者显示不完全再对照芯片手册逐项检查。另外很多屏模块的RST脚必须由MCU控制复位有些模块可以悬空但为了稳定程序里固定做一次“拉低RST—延时—拉高RST”的硬件复位操作。4.3 图片解码BMP与JPEG的处理方式BMP解码是最容易理解的。BMP文件由文件头、信息头和像素数据组成。文件头的第18到21字节是宽度第22到25字节是高度第28到29字节是每像素位数。24位BMP的像素数据是BGR顺序屏幕需要RGB565所以要做一个转换uint16_t rgb888_to_rgb565(uint8_t r, uint8_t g, uint8_t b) { return ((r 0xF8) 8) | ((g 0xFC) 3) | (b 3); }如果图片大小和屏幕分辨率不一样还要做缩放。最简单的方案是“裁切”即只取图片中间区域显示在屏幕上。虽然不如双线性插值平滑但实现代码量小运行速度快。对电子相册来说预览效果足够。JPEG解码用TjpgDecode库。这个库提供输入回调函数从SD卡读取压缩数据输出回调函数把解码后的像素数据一行行交给LCD。核心流程是// 解码输入回调从文件系统读取数据 static uint16_t jpeg_in_callback(JDEC *jd, uint8_t *buf, uint16_t ndata) { if (buf) { f_read((FIL *)jd-device, buf, ndata, br); return (uint16_t)br; } return 0; } // 解码输出回调写一行到LCD static uint16_t jpeg_out_callback(JDEC *jd, void *bitmap, JRECT *rect) { LCD_DrawImage((uint16_t *)bitmap, rect-left, rect-top, rect-right - rect-left 1, rect-bottom - rect-top 1); return 1; }注意TjpgDecode的缩放参数scale在JDCT_METHOD选择时会影响内存占用一般设为0表示原尺寸显示但也可以设为1或2实现1/2、1/4缩小。在STM32F103RC上解码一张320x240的JPEG实测耗时大约几百毫秒加上SPI刷屏时间翻页整体流畅度不错。4.4 按键扫描与自动播放状态机按键扫描最忌讳在延时函数里读按键因为屏幕刷新和SD卡读取会阻塞主循环按键响应会变得非常迟钝。我习惯用定时器中断每10ms扫描一次按键做一个简单的软件消抖void Key_Scan(void) { uint8_t key (KEY_NEXT_PIN RESET) ? 0x01 : 0x00; if (key ! last_key_state) { debounce_count; if (debounce_count 3) { key_event key; debounce_count 0; } } else { debounce_count 0; } last_key_state key; }自动播放功能用一个简单的状态机实现。状态包括显示图片、等待超时、切换到下一张。超时时间可以用SysTick或者TIM2计数。比如每30秒自动切到下一张按键按下时会临时暂停自动播放等待用户手动翻页几秒后再恢复。typedef enum { SHOW_IMAGE, WAIT_PLAY } APP_STATE; APP_STATE state SHOW_IMAGE; uint32_t last_tick 0; while (1) { switch (state) { case SHOW_IMAGE: display_current_image(); last_tick get_tick(); state WAIT_PLAY; break; case WAIT_PLAY: if (key_event KEY_NEXT) { current_index; state SHOW_IMAGE; } if ((get_tick() - last_tick) AUTO_PLAY_TIMEOUT) { current_index; state SHOW_IMAGE; } break; } }5. 常见问题与排查技巧实录5.1 屏幕白屏、花屏、颜色异常怎么办白屏是最常见的现象原因五花八门。先查背光有没有亮如果背光亮且整个屏幕白色说明背光正常但LCD没有收到有效数据大概率是屏幕RST脚复位时序不对或者初始化序列没发送成功。用逻辑分析仪抓SPI信号确认是否有数据输出波形是否干净。常见问题是SPI极性设置反了ILI9341要求CPOL0、CPHA0有些例程用了模式3屏幕完全不显示或显示乱码。花屏的常见原因是SPI时钟太高。屏幕模块的SPI最高频率有上限某些国产屏在36MHz下直接花屏降到18MHz就正常。解决方法是逐步降频测试。另外花屏也可能是电源纹波大屏幕刷新瞬间电流大如果电源线太细3.3V会被拉低屏幕内容就花了。用示波器看3.3V波形如果刷新时电压跌落超过0.2V就要检查电源走线和滤波电容。颜色异常大多数是RGB/BGR顺序问题。ILI9341初始化序列里有一个寄存器的RGB656色彩顺序设置位改一下这个位就能修复红蓝对调。还有可能是24位色转16位色时通道权重不对要检查rgb888_to_rgb565里的掩码值。5.2 SD卡初始化失败与文件读取异常SD卡初始化失败是重灾区。我遇到过好几次原因都是初始化时钟太快。SD卡在上电后必须用低速SPI发CMD0和CMD1/ACMD41如果直接用在高速模式下卡根本不响应。解决方法是写一个低速SPI初始化函数以360kHz到400kHz的频率完成SD卡初始化成功后再切换到18MHz或36MHz高速模式。还有一种情况是卡能识别、文件系统挂载不上那可能是卡在SPI模式下需要足够的拉高延时。SD卡规范要求CS拉高期间至少要有74个时钟周期STM32的SPI代码如果不处理这个细节某些卡就会初始化失败。在代码里先发80个0xFF字节给卡再拉低CS发送CMD0成功率会高很多。文件能读取但显示不了图片先检查文件路径。FatFs挂载后路径要用“/a/b.jpg”这样的绝对路径或者用f_chdir切换工作目录。如果文件名是中文FatFs默认不支持要在配置里开启长文件名和中文编码支持。我在做这个项目时直接在PC上把图片改名为“IMG001.JPG”这类纯英文名省了一堆编码转换的麻烦。5.3 下载调试时SWD连不上的排查思路SWD连不上是另一个高频问题。排查顺序一般是检查3.3V电源是否正常芯片供电引脚电压有没有。检查NRST复位引脚是否为高电平如果被拉低芯片一直处于复位状态。检查SWDIO和SWCLK是否虚焊。这两个脚是调试器通信的关键新手焊板子经常在这两个脚上弄出锡桥。检查BOOT0是否被拉高。如果BOOT0是高电平芯片上电进入系统存储器启动模式SWD还是能连上的但如果代码里开了读保护就会出现下载失败这种要先通过串口ISP全擦除才行。我调试这套板子时遇到过SWD下载失败用串口也连不上的情况查到最后是芯片的VDDA引脚没接磁珠导致内部模拟电路供电异常。所以焊接完第一块板子先不要急着下载程序用万用表把每个电源引脚的电压都量一遍确认无误再连调试器。6. 这套资料怎么用好、还能怎么扩展原理图、PCB源文件、源程序拿到手不要直接拿去打样先花点时间把图纸过一遍。我的习惯是先用查看器打开原理图对照我上面讲的几个关键模块确认电源、晶振、复位、SWD、SD卡座这些地方的设计是否合理。然后把PCB的3D视图打开转转看板子上有没有元件干涉排针和卡座方向是否顺手。最后再把源程序里的主循环和初始化流程读一遍搞清楚每一步在干什么这样烧录出问题你不用一头雾水。如果想把项目提升一个档次有几个扩展方向可以做。一是加上实时时钟芯片比如DS3231或使用STM32内部RTC在屏幕上显示日期时间电子相册秒变桌面电子日历。二是加一个音频解码模块比如VS1053让相册支持背景音乐播放这就要用到更丰富的SD卡文件管理逻辑。三是换成更大尺寸的屏幕比如3.5寸或4.3寸电阻/电容触摸屏加上触摸控制翻页交互体验会好很多。四是把图片存储从SD卡换成SPI Flash画一个自绘图片固件做成一个固定的迷你相册功耗更低也更有“产品”的感觉。我个人做完这个项目的最大体会是它真正逼着你把“底层驱动”和“应用逻辑”统一起来屏幕驱动是SPISD卡也是SPI两个外设共用了同一个SPI总线这就迫使你去理解总线的仲裁、片选的切换、时序的配合。这些经验光靠看教程是学不到的必须自己画板、自己焊、自己调才会在某个翻车瞬间真正明白为什么。希望这套资料能帮你在嵌入式这条路上一块砖一块砖地垫起来。本文还有配套的精品资源点击获取
返回列表