十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

STM32复位期间IO引脚电平跳变原理及软硬件对策

STM32复位期间IO引脚电平跳变原理及软硬件对策 做STM32嵌入式开发久了和复位Reset较劲的经历几乎人人都有。我早期接过一个用STM32F103控制继电器的案子板子一上电或者按下复位键继电器就会“啪”地吸合一下多的时候一个生产批次能遇到好几块客户那边也投诉了好几次。整个排查过程折腾了一周最后定位到的问题根源就是STM32的IO引脚在复位释放reset release期间从默认逻辑default logic切换到用户配置逻辑的过程中出现了一次不可控的电平跳变。这类问题在涉及电机、电磁阀、继电器、功率开关的项目里特别典型。很多人以为引脚电压在复位前后是稳定的实际上复位释放瞬间引脚状态会经历一个“高阻态 → 复位默认逻辑 → 用户代码配置逻辑”的过渡过程中间任何一个环节绷不住外部设备就会误动作。这篇文章就把这个问题彻底讲透复位期间引脚内部到底发生了什么、哪些特殊引脚容易埋雷、硬件和软件两个层面分别怎么应对以及如何用示波器和代码把时序抓出来验证。1. 先从一件真实事故说起继电器为什么会自己吸合1.1 现场现象与初步排查那块板子的结构不复杂STM32F103C8T6做主控PA8接一个NPN三极管驱动继电器继电器控制一个12V的小水泵。故障现象非常稳定每次上电或者按复位键水泵都会突然转一下大概持续几十毫秒然后停住。正常流程是上电后等3秒按键触发才启动水泵所以这几十毫秒的误动作完全不应该出现。一开始自然怀疑驱动电路。把三极管换成光耦隔离续流二极管也重新焊了一遍问题依旧。接着怀疑电源给12V和3.3V都加了更大的滤波电容还是不行。后来用示波器同时抓PA8和3.3V电源轨才看到真相3.3V电源已经稳定建立之后PA8在复位释放瞬间被拉高到了约1.7V在这个电压下三极管处于临界导通状态继电器刚好吸合。等main函数跑起来、GPIO被配置成推挽输出低电平之后PA8才被强制拉低继电器才释放。1.2 示波器抓到的关键时序把示波器设为单次触发触发源选在NRST引脚上抓到的一次波形大致是NRST从低电平释放开始上升大约几十微秒后PA8从0V爬升到1.7V左右呈现典型的浮空电平不是干净的高或低再过几百微秒PA8突然跳到0V这是main函数里GPIO初始化代码执行完毕的时刻。这个1.7V的浮空电平就是问题所在。PA8在复位后处于浮空输入模式引脚对外表现为高阻外部电路里三极管的基极电阻把引脚电平拉到了一个不确定的中间值恰好落进了三极管的放大区于是继电器半导通。更麻烦的是这个时间段发生在CPU取复位向量、执行SystemInit、跳转到main的整个过程中用户代码根本没有机会干预。1.3 根因总结复位释放后的“失控窗口”后来我把这个问题归结为一个概念引脚失控窗口。从复位释放的那一瞬间开始到用户代码完成GPIO初始化为止这段时间内引脚处于硬件默认状态不受用户程序控制。窗口的长短取决于代码路径——从复位向量到main函数里GPIO配置完成FastBoot模式下可能只有几十微秒如果还跑了时钟初始化库函数、CRC校验之类的可能到几百微秒。对于继电器这种动作时间在毫秒级的器件这个窗口足以造成一次完整的误动作。这个案例让我意识到搞懂复位期间IO引脚的状态变化不是抠手册字眼的学术问题而是直接影响产品可靠性的工程问题。2. 复位期间引脚到底经历了什么2.1 复位源与复位序列STM32的复位源不止一种但无论哪种复位最终都会把芯片拉回到同一个初始状态。常见的复位源有上电复位POR/PDR电源电压上升到阈值之上时触发这是最常见的一种。外部复位NRST引脚被拉低通常由复位按键、看门狗芯片或外部电路产生。独立看门狗复位IWDG看门狗计数溢出时触发。窗口看门狗复位WWDG窗口看门狗条件不满足时触发。软件复位通过内核的AIRCR寄存器发起。低功耗模式复位从Standby模式唤醒时芯片会执行一个类似复位的启动序列。不管是哪种复位源芯片内部的复位发生器都会把系统拉进复位状态保持一段固定的时间然后释放。释放之后CPU从0x00000000地址取出栈顶指针从0x00000004取出复位向量跳到Reset_Handler开始执行。这里有个容易被忽略的时间点复位释放不等于CPU立即开始跑代码。从复位释放到CPU真正执行第一条指令中间还有内部时钟启动、Flash读取、电源稳定等过程这段时间引脚完全处于硬件默认状态。如果外部设备恰好和引脚直连这个阶段就是风险最高的时候。2.2 复位期间I/O引脚的物理状态关于复位期间引脚的物理状态STM32参考手册的表述是所有I/O引脚处于高阻态High-Z。具体来说引脚的输出驱动器关闭既不会主动输出高电平也不会主动输出低电平对外表现为极高的阻抗。但这个高阻态不是绝对的“悬空”。芯片内部每个引脚都有一对寄生二极管分别连接到VDD和VSS它们会把引脚电压钳位在-0.3V到VDD0.3V之间。也就是说如果外部电路把引脚拉到超过VDD0.3V电流会通过上方的寄生二极管泄放到VDD如果拉到低于-0.3V电流会从VSS侧被抽走。在正常工作范围内引脚电平完全由外部电路决定。这一点非常关键。浮空引脚对外呈现高阻但外部电路只要有微弱的上拉或下拉就能决定引脚电平。如果外部上拉和下拉都足够弱或者干脆没有引脚就会悬在一个不确定的电压上——通常是0V到3.3V之间的某个值而且可能缓慢漂移。这个不确定电压就是继电器误动作这类问题的物理根源。2.3 复位释放后的默认逻辑复位释放后引脚进入所谓的“默认逻辑”。这个默认逻辑的字面含义是所有GPIO相关寄存器的复位值共同决定的外在表现MODER寄存器复位值为00对应输入模式OTYPER寄存器复位值为0对应推挽输出但此时是输入模式这个值暂时不生效OSPEEDR寄存器复位值为00对应低速PUPDR寄存器复位值为00对应无上拉、无下拉ODR寄存器复位值为0对应输出数据寄存器为低电平。把这些组合起来典型引脚的复位默认状态就是浮空输入无上下拉输出数据寄存器为低。注意ODR虽然是0但因为MODER是输入模式这个0不会体现在引脚电平上引脚依然由外部电路决定。这里有一个很多工程师会忽略的坑如果复位后把引脚配置为输出模式且不修改ODR引脚输出的是低电平因为ODR复位值就是0。反过来如果在配置成输出之前先读ODR再写可能会读到一些意外的值。这些细节在调试时看着像是芯片“发疯”其实都是寄存器的复位值在起作用。2.4 从释放到用户代码接管的时间线把整个时间线画出来会更清楚。复位释放后引脚状态经过以下几个阶段复位释放瞬间引脚处于高阻态外部电路决定电平。CPU启动阶段CPU开始执行Reset_Handler依次完成时钟初始化SystemInit、数据段拷贝、BSS清零等C运行时初始化。整个过程引脚仍然保持复位默认状态。main函数入口用户代码开始执行。在GPIO外设时钟没有被使能之前写GPIO寄存器是无效的所以引脚继续保持默认状态。GPIO时钟使能并完成配置RCC寄存器打开对应GPIO端口的时钟然后配置MODER、OTYPER、OSPEEDR、PUPDR、ODR或BSRR引脚才变成用户期望的逻辑。配置完成之后引脚被用户代码稳定控制不再出现不可预期的跳变。其中第2和第3阶段是引脚不受控的窗口期。这期间引脚的电平变化虽然幅度不大但对于驱动能力要求不高的外部设备比如三极管基极、MOS管栅极、使能引脚来说已经足够造成误动作。3. 容易被忽略的“特殊引脚”它们一出生就和普通IO不一样3.1 调试引脚JTAG/SWD的默认占用如果整块板子所有引脚都按“浮空输入”来理解很多问题解释不了因为有一组特殊引脚从复位释放那一刻起就不按常理出牌那就是调试接口引脚。STM32大部分系列在复位后PA13JTMS/SWDIO、PA14JTCK/SWCLK、PA15JTDI、PB3JTDO、PB4JNTRST默认被分配给调试功能。其中PA13、PA14、PA15和PB3带有内部上拉PB4带有内部下拉。这个上下拉不是用户配置的而是芯片硬件自动完成的所以复位释放后这些引脚的电平是确定的PA13、PA14、PA15、PB3是高电平PB4是低电平。实际设计中有两种情况会踩坑。第一种把PA15或PB3当作普通IO使用并在外部加了上拉电阻或下拉电阻结果和内部上下拉形成分压导致电平判断错误。第二种想把这些引脚作为推挽输出使用代码里也配置好了但量出来的电平始终不对查了半天发现是JTAG功能还占着引脚没有释放。解决方法是如果SWD下载够用就通过AFIO寄存器关闭JTAG功能只保留SWD如果SWD也不用就把调试功能完全释放把PA13、PA14也解放成普通IO。我自己调试时遇到过一回去年做的一块板子PA15控制一个LED指示灯代码里配置成推挽输出高但LED总是微弱发亮。一量电压只有1.6V正是内部上拉和LED外部电路分压的结果。后来在代码里加了一句禁用JTAG的配置问题瞬间消失。3.2 启动配置引脚BOOT0和BOOT1的采样窗口BOOT0和BOOT1在复位释放后有一个特殊使命决定CPU从哪里取代码。BOOT0引脚的电平在复位释放后的某个固定时刻被采样然后锁存到启动配置寄存器里这个采样发生在SYSCLK的第4个上升沿。对于STM32F1系列典型的启动配置如下BOOT0引脚电平BOOT1引脚电平启动介质0任意主Flash10系统存储器Bootloader11内嵌SRAMBOOT0在多数芯片上有一个可选的内部下拉但下拉能力很弱。如果外部电路在BOOT0上并联了一个较大的电容比如100nF以上复位释放后电容充电需要时间BOOT0电平可能在一个短暂窗口内没有到达正确的高或低导致采样结果不稳定。更隐蔽的问题是把BOOT0复用为普通IO使用。有些设计为了省引脚把BOOT0当通用输入输出这在正常运行阶段没有问题但每次复位时BOOT0的电平都会被重新采样。如果此时外部电路恰好把它拉高芯片就会进Bootloader表现为复位后程序不跑、进入下载模式等待状态。排查这种问题很让人头疼因为看起来就是“程序丢了”实际上只是启动介质选错了。3.3 其他特殊引脚RTC、晶振、电源管理还有几个容易被忽略的引脚虽然不像JTAG和BOOT那么特殊但在复位期间的行为也值得留意。PC13、PC14、PC15在STM32F1系列上是RTC和防侵入检测功能的复用引脚。复位后它们默认是普通输入模式但需要特别注意的是这三个引脚的驱动能力比其他普通IO弱而且如果使用了外部低速晶振LSE它们会被晶振电路占用复位后进入晶振振荡状态表现在引脚上会有小幅振荡波形。如果有外部电路连接在这些脚上可能被这个振荡干扰。PH0和PH1如果有的话通常用于外部高速晶振HSE。复位后它们默认是普通IO但如果代码里使能了HSE它们就立刻被晶振电路接管。对于外部电路来说这两个引脚上连接晶振负载电容就可能产生串扰。VBAT引脚用于备份域供电。如果使用VBAT供电且没有外部电池复位期间VBAT的电平取决于外部电容或电源轨不会影响普通IO状态。但如果VBAT掉电备份域的RTC寄存器和备份寄存器内容会丢失这不是引脚电平问题但经常和复位问题一起出现排查时容易混淆。3.4 不同系列的差异不同系列STM32在复位默认状态上大体一致但细节有差异。以我常用的几个系列为例STM32F1经典所有GPIO复位后是浮空输入JTAG引脚有内部上下拉。这个系列的GPIO没有独立的内部上拉/下拉使能位PUPDR寄存器从F1的某个型号开始才引入老型号可能行为稍有不同。STM32F4GPIO功能从AFIO改成了独立的GPIO_AFRL/AFRH寄存器但复位默认状态和F1一致。STM32G0部分型号引入了可配置的复位引脚选项比如BOOT0引脚可以通过选项字节改变用途。STM32L4和L5引脚默认状态和F4类似但低功耗模式下有些引脚的行为会有差异。实际设计时最好以具体型号的参考手册和 datasheet 为准不要只靠经验跨系列套用。尤其是带安全功能的系列比如L5引脚复位行为和普通系列可能完全不同。4. 硬件对策与软件对策把这个坑填平4.1 外部上下拉电阻的选型与计算最直接、最可靠的治本方法是在关键引脚上加外部上拉或下拉电阻让复位释放期间的电平被外部电阻牢牢固定住。以我修复那个继电器案子为例PA8控制三极管基极我希望复位期间PA8保持低电平所以在PA8和三极管基极之间加了一个10kΩ下拉电阻到GND。10kΩ对3.3V CMOS电路来说是一个常用值功耗只有0.33mA左右对板子的总功耗影响可以忽略。选择阻值时要考虑三个方面阻值不能太大否则抗干扰能力差。对于MCU引脚内部可能没有上下拉外部电阻越大引脚越容易被外部噪声影响10kΩ是一个平衡点100kΩ以上就要谨慎了。阻值不能太小否则功耗会增加而且可能和驱动端形成分压。如果引脚要输出高电平驱动外部负载外部下拉电阻会分走一部分电流可能导致高电平达不到阈值。要结合内部上下拉一起分析。前面提到的内部上拉约30-50kΩ如果外部下拉用10kΩ高电平时分压结果是3.3×10/(1040)0.66V远远达不到CMOS高电平阈值引脚会被固定在低电平。所以如果引脚本身有内部上拉外部下拉阻值至少要选大于内部上拉5倍的数值或者干脆换一种固定电平的方式。对于需要固定为高电平的引脚同样可以加外部上拉。比如PA15如果被当作普通IO且复位期间需要高电平外部上拉10kΩ就能让它在复位释放后稳定为高。不过要注意PA15内部本来就有上拉外部再加一个两个并联后的等效上拉更强功耗会略微增加。4.2 用硬件使能时序彻底隔离有时候单靠上下拉电阻不够。比如引脚控制的是一个MOS管栅极即使引脚被下拉到低电平如果MOS管的栅极电容较大上电瞬间充电电流仍然可能造成短暂的误导通。这种情况下可以考虑在驱动链路中间增加一级使能控制。常见做法是在关键外设的电源轨上加一个由RC延时控制的负载开关。具体来说用一只MOS管或专用负载开关芯片控制外部设备的电源MOS管的栅极由一个RC网络延迟。上电时RC网络让MOS管在几十毫秒后才导通此时MCU已经完成GPIO初始化引脚早就被配置成了确定状态。这样即使MCU引脚在复位期间出现浮空电平外设电源还没接通根本不会造成误动作。另一种方案是使用带输出使能Output EnableOE的缓冲器或锁存器。GPIO信号先经过缓冲器缓冲器的OE引脚由RC延时或复位监控芯片控制。在MCU完成初始化之前OE无效输出端被强制为高阻或确定电平从源头上隔离了MCU引脚的不确定状态。我之前给一个控制电磁阀的项目就用过这个思路。电磁阀的驱动电流大而且电磁阀本身有电感复位时误动作不仅影响控制逻辑还有可能损坏机械结构。后来在驱动电路前加了一个74LVC1G125缓冲器OE由RC延时控制复位期间输出恒为低彻底解决了问题。4.3 软件初始化顺序的优化软件层面能做的事情也很多但要注意软件不能改变复位释放到main入口之间的引脚状态只能尽量缩短引脚不受控的时间窗口。最有效的一条原则是在main函数的第一行就把关键引脚配置成确定状态。具体来说按照这个顺序int main(void) { // 1. 先使能GPIO时钟 RCC-AHB1ENR | RCC_AHB1ENR_GPIOCEN; // 2. 把关键引脚配置为推挽输出 GPIOC-MODER ~(GPIO_MODER_MODER0_Msk); // 先清模式位 GPIOC-MODER | (GPIO_MODER_MODER0_0); // 设为输出 GPIOC-OTYPER ~GPIO_OTYPER_OT0; // 推挽输出 // 3. 立刻写输出电平 GPIOC-BSRR GPIO_BSRR_BR0; // 输出低电平BR是Reset位 // 或者 GPIOC-ODR ~GPIO_ODR_OD0; // 直接写ODR也可以 // 4. 然后才做其他初始化 SystemClock_Config(); // ... }这里有一个容易被新手忽视的细节在GPIO时钟没有使能之前写GPIO寄存器是无效的所以必须先使能对应的RCC时钟。另外GPIO的MODER寄存器需要先清除原来的模式位再写入新值否则可能残留其他配置。还有一个实用技巧把关键引脚的初始化从外设初始化函数里独立出来单独封装成一个函数确保它在系统时钟切换、外设配置之前被调用。时钟切换时如果PLL还没稳定芯片执行速度会很慢这段时间引脚依然是默认状态所以关键引脚的配置越早越好。4.4 软件配置中的其他细节还有一个很多项目会踩的坑在配置GPIO时先写ODR再改MODER还是反过来。建议先配置模式再写电平避免中间出现一个短暂的反向电平。以设置为推挽输出高为例如果先写ODR1再改MODER为输出那么中间有一个瞬间ODR1但MODER还是输入引脚依然浮空不会立即输出高电平这个瞬间很短但确实存在。反过来如果先改MODER为输出此时ODR还是0引脚会先输出低电平然后写入ODR1才变成高。这两种顺序都可能有瞬态但在大多数场景下先改模式再写电平更安全因为输出低电平通常比输出高电平更不容易造成误动作比如继电器、MOS管通常是高电平触发。另外如果使用HAL库要注意HAL_GPIO_Init函数内部会先配置MODER再配置OTYPER最后配置PUPDR但它不会主动设置ODR。所以如果你需要引脚初始化为高电平必须在调用HAL_GPIO_Init之前先调用HAL_GPIO_WritePin或者在HAL_GPIO_Init之后马上调用一次否则引脚可能以低电平开始运行。5. 实际操作把复位时序抓出来看个明白5.1 用示波器抓取复位释放瞬间排查这类问题示波器是必不可少的工具。抓取方法如下通道1接NRST引脚通道2接可疑引脚比如PA8地线夹子尽量靠近测量点避免环路引入噪声。示波器设为单次触发触发源选NRST下降沿。按下复位键时NRST先被拉低释放时恢复高电平这个过程可以完整捕获。时基建议设在20ms到50ms每格观察窗口覆盖从复位释放到main函数初始化完成的全过程。如果只关心上电瞬间触发源可以选电源轨的上升沿观察电源稳定后引脚电平的变化时序。抓到的波形要重点观察几个时间点NRST释放瞬间、第一个引脚电平跳变点、引脚被拉低或拉高到最终状态的时刻。如果引脚电平在NRST释放后出现一个缓慢爬升然后突然跳变的过程就基本可以断定是复位默认状态和外部电路共同作用的结果。5.2 用逻辑分析仪做多通道对比如果需要同时观察多路引脚比如一个电机驱动板的4个控制引脚逻辑分析仪比示波器更高效。把引脚全部接到逻辑分析仪通道上设置好触发条件NRST下降沿一次就能抓到全部引脚的时序关系。逻辑分析仪能看到每个引脚在复位期间到底是高、低还是浮空浮空会表现为中间电平或不稳定状态也能精确测量从复位释放到引脚被用户代码接管的时间。这个时间在不同启动配置下差异很大比如使用外部高速晶振HSE的时候等待晶振稳定可能需要几毫秒这段时间引脚全部处于默认状态。5.3 用代码来确认引脚状态如果手头没有示波器也可以靠代码辅助排查。在main函数最前面加一段测试代码把目标引脚配置为输出然后持续翻转用LED或者串口打印来确认代码执行到了哪里int main(void) { // 打开GPIO时钟 RCC-AHB1ENR | RCC_AHB1ENR_GPIOAEN; // PA8设为推挽输出 GPIOA-MODER ~GPIO_MODER_MODER8_Msk; GPIOA-MODER | (GPIO_MODER_MODER8_0); GPIOA-OTYPER ~GPIO_OTYPER_OT8; // 先输出低然后延时再输出高 GPIOA-BSRR GPIO_BSRR_BR8; // 低电平 DelayMs(100); GPIOA-BSRR GPIO_BSRR_BS8; // 高电平 // 如果能看到LED先灭100ms再亮说明代码执行到了这里 // 如果LED在复位后立即微亮说明已经发生了误动作 }这种方法的缺点是只能验证最终结果看不到瞬态过程但配合问题复现比如让继电器误动作也能定位问题。如果LED在复位瞬间就微微发光但代码里明明配置的是低电平基本可以断定是复位窗口期的引脚状态出了问题。5.4 使用调试器观察寄存器状态调试器也能提供有价值的信息。使用ST-Link或者J-Link在复位后、main函数入口设置断点停下来后查看GPIO端口的MODER、ODR、PUPDR等寄存器值可以看到它们都处于复位默认值。这个操作有助于建立直观认识不要以为芯片一复位GPIO就是按你代码里期望的状态运行的。有一点要提醒如果在调试器下运行复位后到断点之间的时间非常短可能只有几微秒引脚不受控的窗口期比真实运行时短很多所以某些在真实运行中会复现的问题调试器下可能复现不出来。遇到这种情况断开调试器用外部供电上电测试更能暴露真实问题。6. 常见问题速查与实操心得6.1 不同场景下的问题速查表问题现象可能原因排查方向解决方案复位时继电器/电机误动作引脚复位默认浮空外部电路电平不定示波器抓复位时序外部上下拉、RC延时使能、软件尽早配置复位后程序不进mainBOOT0被外部电路拉高测量BOOT0电平检查启动配置修正BOOT0上下拉避免复用BOOT0PA15/PB3配置为输出但电平不对内部JTAG上拉/下拉干扰查看AFIO寄存器配置禁用JTAG只保留SWD或全释放上电后LED微亮ODR复位值为0但引脚浮空且外部电路有微弱导通路径测量引脚电压外部上拉/下拉先写ODR再初始化复位时外设芯片EN引脚抖动MCU引脚浮空时EN被噪声干扰查看EN引脚接线EN引脚加10kΩ上下拉或加缓冲器6.2 不同系列的引脚默认状态差异虽然这篇文章主要以STM32F1系列为主线但实际项目中我接触过多个系列这里把常用的几个系列的差异总结一下STM32F1系列JTAG引脚默认占用GPIO无独立的PUPDR概念或者通过寄存器配置BOOT1与PB2复用。STM32F4系列GPIO有独立的上下拉配置PUPDRJTAG引脚与F1一致。复位后所有普通IO浮空输入。STM32G0系列BOOT0引脚可以通过选项字节配置为普通IO复位引脚也可以通过选项字节改变功能。如果项目要用G0建议仔细读一下选项字节部分。STM32L4系列引脚默认状态和F4类似但部分低功耗模式会改变引脚行为比如在Shutdown模式下多数引脚输出关断。每个系列芯片的数据手册里都有一个GPIO章节建议在硬件设计阶段就把该章节中关于复位默认状态的表格找出来把用到的引脚一个一个核对一遍。这个过程虽然繁琐但能在原理图阶段就消灭掉大部分隐患。6.3 我在实际项目中的几条经验先说一条“血泪”经验给外部设备做使能控制时一定要想清楚“上电瞬间外设会不会先动作”。很多工程师画原理图的时候只盯着逻辑功能画完就投板等到调试点亮时才发现问题。现在我在设计阶段就会在每个关键使能引脚旁边标注“复位期间期望电平”和“外部上下拉方案”让硬件工程师和软件工程师都能看到。第二条经验外部上下拉电阻不是越大越好。有些同事为了省电把上下拉做到100kΩ甚至更大结果引脚抗干扰能力急剧下降。对于3.3V系统10kΩ是绝大多数场合的安全值4.7kΩ用于需要更强抗干扰的场合100kΩ以上除非有功耗约束否则不建议。第三条经验如果项目对可靠性要求高不要只依赖软件配置去“抢时间”。软件优化只能把窗口缩短不能消除窗口。硬件上用一个RC延时或者复位监控芯片来控制外设电源才是真正根治的方案。RC延时的具体参数可以这样估算要让外设电源在MCU完成GPIO初始化之后再上电RC延时时间至少要大于复位释放到main函数GPIO配置完成的时间。如果这个时间不好估算按10ms来设计一般足够安全。RC延时的时间常数大约是R×C比如100kΩ和100μF的组合是10秒对大多数场景过长10kΩ和1μF是10ms比较合适。第四也是最后一条遇到复位相关的问题先不要怀疑芯片坏掉。STM32的上电复位和引脚默认行为是稳定的大多数“怪毛病”都出在外部电路和默认状态的相互作用上。用示波器把时序抓出来看到波形再分析比盲目的改代码、换芯片高效得多。复位释放期间IO引脚电平变化的问题说到底是硬件默认状态和用户期望状态之间的“真空期”造成的。理解了这个真空期的成因不管是做硬件对策还是软件优化心里都有底。希望这篇文章能给正在排查类似问题的朋友一些启发少走我当年走过的弯路。
返回列表