GPIO、定时器与总线外设实践要点
本专题合并星球中 GPIO 配置、定时器用法与 I2C/SPI 总线外设的问答,作为《STM32启动流程与存储常见问题速查》的姊妹篇。
一、GPIO 复用与重映射
复用与重映射的关系一句话讲清:重映射 = 先决定外设信号走到哪个引脚;复用 = 再让该引脚切到外设功能。凡是要改映射/EXTI 路由类寄存器,就要开对应的 AFIO/SYSCFG/AF 时钟;单纯把 GPIO 设为输入输出只需 GPIO 时钟。工程上最稳妥的顺序是:先配 remap/mux → 再配 GPIO AF → 再开外设输出,避免"波形跑到别的脚"或"脚还没接上外设就开始翻转"(1.重映射 = 先决定这外设信,深蓝 提问 / Jack 答)。
调试口与 GPIO 冲突是量产板常见问题:
- SWD 复用引脚的信号方向:TDI 由 JLink 发出,TDO 由 MCU 回复,TRST 复位 DAP;没有 TRST 时 TMS/SWDIO 长时间低电平也能复位 DAP。本质是两个独立外设单元,对频前不能配置或读写该 GPIO(问题1: gpio如果是复用成swd用做jlink烧录,它在建立通信的时候,Jack)。
- 烧录引脚与 GPIO 共用的软件对策:初始化时先读该引脚电平,为高(接了下载器)就不配置留作下载口,为低才正常配置成 GPIO(烧录引脚和GPIO共用了咋整?,Jack)。
二、定时器与延时
- 裸机多任务定时的取巧:多个周期任务(如 5s/10s/15s)取最大公约数设一个 5s 定时器,在同一回调里调度三个任务;任务多了就定义多个"公约数定时器"。代价是要求任务执行时间不能太长(还有一种射线回调就是: 比如说,Jack)。
- 死等微秒延时:另开一个定时器做微秒级延时是可行方案(如果需要做死等的延时,用什么方案更好,我现在一般是再开一个定时器来做微秒级延时,Jack)。
- RTOS 周期任务用 osDelayUntil:osDelay 是相对延时(从调用时刻起算,任务执行超时会漂移),osDelayUntil 是绝对延时(记录上次唤醒时间,强制固定周期,自动补偿执行时间)。首次调用前要设基准
xLastWakeTime = osKernelGetTickCount()。传感器采样等严格定时任务优先 osDelayUntil(osDelay是相对延时(从调用时刻开始计时,Jack)。 - CubeMX 里定时器输出 PWM 时 clock source 都选内部时钟,是网上教程的通行做法(为什么网上cubemx配置定时器输出pwn波,圣井户御代 提问)。
- 两个定时器中断优先级相同且同时触发:NVIC 按 IRQ 号小者先执行(老师,如果这两个定时器的中断优先级设置的一样,如果同时触发是定时器6会先执行,Jack,详见 中断与DMA使用要点与常见坑)。
三、I2C 与 I3C
- 基础:I2C 要加上拉电阻的原因、面试回答思路见 1、 IIC通信简介(立芯嵌入式);仲裁机制:两主机同时发送,电平不同时发送高电平的一方检测到冲突退出、转接收模式,发送低电平的一方继续完成传输(IIC仲裁简单描述是怎么样的?,Jack)。
- I3C(MIPI 接班人)关键差异(很多人都会用 I2C,目前 I3C 也正在普及和落地,带大家前沿看一下 I3C,Jason):带内中断 IBI 省掉独立中断引脚;默认 SDR 12.5Mbps,HDR 最高 37.5Mbps;主机动态分配地址、兼容老 I2C 从机(不支持 10 位扩展地址);推挽输出增强驱动、不支持时钟拉伸。Linux 5.10 起原生有 I3C 驱动(/drivers/i3c/),靠 BCR/DCR/LVR 寄存器和 CCC 通用指令管理设备。
- 总线争用:RTOS 下硬件 IIC 被中断和主循环同时使用会互相阻塞(平衡车项目真实案例:中断里读陀螺仪时屏幕正占用 IIC,想问一个问题: 最近我在做一个,少年、潜行 提问)——这正是 BSP 层 Handler 统一管理总线互斥的意义,参见 BSP分层设计与驱动架构。
四、SPI
- 从机无法主动发数据:SPI 机制上从机不能主动给主机发消息,要用额外 GPIO 拉低通知主机"数据就绪",主机配置成中断再过来取(老师,公司里面一个项目:spi从设备想主动发数据给主机的话,可以怎么实现,Jack)。
- 多从机模式:多 NSS 与菊花链各有适用场景,与 I2C 多从机的对比是进阶问题(jack老师,您好,请问SPI中的多从机模式,多NSS和菊花链,😌 提问);SPI 控制器驱动在 RTOS 下做同步/异步收发的框架思路可复用 BSP 分层(大佬,如果是spi控制器驱动要怎么以怎么样的思路和框架写好,无能狂怒人 提问)。
- SPI+DMA 混用时注意数据位宽匹配(图解见 SPI和DMA混合应用数据位宽,Jack)。
五、器件与硬件小抄
- 三极管 vs MOS 管:三极管电流控制、便宜、发热大;MOS 电压控制、阻抗高驱动电流小、开关快、集成度高,IO 驱动能力弱(如 0.1mA)或高速场景(电机控制)优先 MOS(三极管和MOS管的区别? 简,Jack)。
- 0 欧电阻当飞线:多层板走线交叉用过孔绕层,可替换为 0 欧电阻(老师,0欧电阻应用中:其中有一个作用是“代替跨孔”,这个跨孔指的是什么:,Jack)。
- 传感器精度靠标定:产线上用测试仪器把传感器输出微调到一致叫标定;量产时因装配公差、批次差异,每个传感器要在多个温度点单独标定,标定数据写入外部 Flash/EEPROM(传感器测出来的值,是怎么确定正确的还是错误的?如何标定、老师好哇,话说那个咱们温湿度传感器量产的时候要达到这么高的精度,Jack)。
来源笔记
- 1.重映射 = 先决定这外设信 | 深蓝 / Jack 答
- 问题1: gpio如果是复用成swd用做jlink烧录,它在建立通信的时候 | Jack
- 烧录引脚和GPIO共用了咋整? | Jack
- 还有一种射线回调就是: 比如说 | Jack
- 如果需要做死等的延时,用什么方案更好,我现在一般是再开一个定时器来做微秒级延时 | Jack
- osDelay是相对延时(从调用时刻开始计时 | Jack
- 为什么网上cubemx配置定时器输出pwn波 | 圣井户御代
- 老师,如果这两个定时器的中断优先级设置的一样,如果同时触发是定时器6会先执行 | Jack
- 1、 IIC通信简介 | 立芯嵌入式
- IIC仲裁简单描述是怎么样的? | Jack
- 很多人都会用 I2C,目前 I3C 也正在普及和落地,带大家前沿看一下 I3C | Jason
- 想问一个问题: 最近我在做一个 | 少年、潜行
- 老师,公司里面一个项目:spi从设备想主动发数据给主机的话,可以怎么实现 | Jack
- jack老师,您好,请问SPI中的多从机模式,多NSS和菊花链 | 😌
- 大佬,如果是spi控制器驱动要怎么以怎么样的思路和框架写好 | 无能狂怒人
- SPI和DMA混合应用数据位宽 | Jack
- 三极管和MOS管的区别? 简 | Jack
- 老师,0欧电阻应用中:其中有一个作用是“代替跨孔”,这个跨孔指的是什么: | Jack
- 传感器测出来的值,是怎么确定正确的还是错误的?如何标定 | Jack
- 老师好哇,话说那个咱们温湿度传感器量产的时候要达到这么高的精度 | Jack