文章参考资料江协科技stm32pptSTM32F10XXX参考手册中文在我们使用cubemx时很多选项我们并不知道是什么意思我们就只能照着网上的教程来进行一步步的配置尽管最后配置完成后达到了我们想要的效果但我们可能还是不理解为什么是这样今天我就来讲一下cubemx的配置我这里的讲解适合有一定基础的这是我们cubemx的配置界面有很多选项我们就按照顺序来讲先从System Core开始讲起System CoreDMADMA的控制框图可以在我们的数据手册中找到如下所示DMA 是 STM32 芯片内置的专用控制器通过抢占系统总线AHB/APB的使用权在外设寄存器、SRAM、FLASH三者之间直接传输数据全程无需 CPU 参与仅需 CPU 在初始化阶段配置传输规则。我们通过具体的cubemx配置图来看我们来看具体的设置DMA请求源这里的源就是设置让哪个外设触发DMA请求源会有好几种在我这个芯片STM32C8T6中请求源一共有四种1. ADC12. MEMTOMEM内存到内存3. USART1_RX串口的RX引脚4. USART1_TX串口的TX引脚DMA通道就是我们前面的DMA框图中显示出的通道1通道2等就是设置让哪个通道负责数据的传输传输方向有下面三种1.Peripheral To Memory外设→内存最常用ADC、UART 接收、SPI 接收等。2.Memory To Peripheral内存→外设也常用UART 发送、SPI 发送、DAC 输出等。3.Memory To Memory内存→内存仅 DMA1 支持用于数组拷贝、数据搬运。传输优先级有四种1.低2.中等3.高级4.非常高传输优先级是为了在有多个设备请求DMA时决定哪个设备先进行传输传输模式分为两种1.Noraml:传输完一次就停止需要手动重启2.Circular循环传输传输完自动从头开始适合连续采集Increment Address地址增量模式决定DMA在传输数据时源地址和目标地址是否会自动向后移动作用是让DMA连续搬运数据而不是每次都搬运到同一个位置图中的外设地址自增是否打开取决于外设是否有多个地址比如像ADC1外设数据转运完成后都是存到一个寄存器里那么就不能自增否则会引发错误内存地址自增是否打开取决于我们需不需要多组数据比如我们使用ADC的时候可能取多组数据然后取平均值这时候我们就可以定义一个数组那么每次转运完成后下一次的数据会自动存到数组的下一个位置比如第一次存到a[0]第二次就存到a[1]数据宽度则是我们每次转运数据的长度如何决定就要看我们具体的使用场景了这是cubemx里DMA的基础配置接下来我就要讲一下DMA的工作流程以及如何让DMA开始转运DMA转运过程分为五步如下图所示初始化配置就是我们cubemx里的配置外设触发DMA请求这个地方可能有些人会有疑惑我们明明没有在cubemx里配置外设触发DMA请求的具体条件比如判断外设的状态位等等那么外设是怎么触发DMA请求的呢答案就是DMA的请求规则是厂家生产出来芯片后固定死的条件是固定的我们无法修改的当某个外设的标志位置了某一位后外设就会自动发DMA请求但是发了请求后就不意味着开始转发数据了我们需要执行一条语句才会开始转发就是HAL_ADC_Start_DMA这里不一定是ADC_Start也可能是其它的外设语句语句但是我们要注意已发出的DMA请求不会“缓存”也就是我们不能先等DMA请求发送再执行语句也就是不能使用下面的时间线时间线ADC完成转换 → 发DMA请求但DMA未启动请求被忽略你执行HAL_ADC_Start_DMA→ DMA初始化完成、解锁权限ADC完成下一次转换 → 发DMA请求 → DMA开始传输而是先执行语句再等待外设发送DMA请求这也是最常用最稳定的用法也就是使用下面的时间线时间线你执行HAL_ADC_Start_DMA→ DMA初始化完成、待命ADC完成转换 → 发DMA请求 → DMA立刻开始传输然后就到了DMA控制器接管总线这时DMA控制器会占用总线占用总线之后就开始自动完成数据搬运最后就是传输完成了GPIOGPIO是一个很庞大的内容GPIO的定义如下GPIO 是单片机 / 微控制器提供的通用数字引脚通过软件编程配置可工作在输入模式或输出模式用于芯片与外部电路之间进行数字电平信号的输入采集与输出控制是单片机与外部设备交互最基础的硬件接口。GPIO的内容非常庞大总的来说GPIO就两个功能输入输出。输入输出功能使得我们的单片机能够与外界进行交涉如果没有GPIO口我们单片机的一些功能比如ADC串口等都无法使用单片机应用的基础就是建立在GPIO之上如果没有和外部通信的方法那么单片机就一点作用没有输出功能就是让单片机主动发出高电平/低电平去驱动外部设备常见用法点亮 / 熄灭 LED控制蜂鸣器响不响驱动继电器、电机控制模块电源开关输入功能则是让单片机读取外部电压是高电平还是低电平让我们知道外面发生了什么常见用法读取按键是否按下读取传感器输出信号读取限位开关、红外对管GPIO选项1. Reset_State复位状态芯片刚上电 / 复位时的默认引脚状态一般为高阻输入模式未被任何外设占用。2. ADC1_IN0ADC1 通道 0将 PA0 作为 ADC1 的模拟输入通道用于采集外部模拟电压0~3.3V需要配合 GPIO_Analog 模式使用。3. ADC2_IN0ADC2 通道 0若芯片有 ADC2PA0 也可作为 ADC2 的模拟输入通道功能和 ADC1_IN0 一致只是归属不同 ADC 外设。4. SYS_WKUP系统唤醒引脚用于从停止 / 待机模式唤醒单片机外部电平变化如上升沿可触发系统从低功耗模式恢复运行。5. TIM2_CH1定时器 2 通道 1作为 TIM2 的输入捕获 / 输出比较 / PWM 通道可用于测量脉冲宽度、输出 PWM 波、编码计数等。6. TIM2_ETR定时器 2 外部触发输入作为 TIM2 的外部时钟源或触发信号输入用来同步定时器动作比如外部脉冲触发计数。7. USART2_CTS串口 2 清除发送信号硬件流控引脚用于串口通信时通知对方 “我可以接收数据了”一般配合 RTS 引脚使用。8. GPIO_Input通用数字输入读取外部数字电平高 / 低可用于按键、传感器数字信号等。9. GPIO_Output通用数字输出控制外部设备如 LED、继电器输出高 / 低电平。10. GPIO_Analog模拟模式关闭数字电路为 ADC/DAC 等模拟外设提供纯净信号通路使用 ADC 时必须选择此模式。11. EVENTOUT事件输出将内部事件如定时器触发、EXTI 事件通过引脚输出用于同步外部电路。12. GPIO_EXTI0外部中断 0将 PA0 配置为外部中断触发引脚外部电平变化上升 / 下降 / 双边沿可触发中断服务函数。我们这里主要讲的是GPIO的输入和输入功能置于后面的那些功能之后会讲到ADC串口到时候再具体讲这里的GPIO模式我们可以大致分为两种一种是输入一种是输出GPIO_Input输入模式因为我这里用的是GPIO_Input所以只有一个Input mode如果后续遇到别的输入选项我再讲我们GPIO_Input关于上拉和下拉有三个选项GPIO Pull-up/Pull-down上拉 / 下拉配置No pull-up and no pull-down浮空 / 无上下拉引脚电平完全由外部电路决定悬空时电平不确定容易受干扰。Pull-up上拉内部接一个到 VCC 的电阻悬空时默认高电平常用于按键按下为低电平。Pull-down下拉内部接一个到 GND 的电阻悬空时默认低电平。关于用户自定义标签我们可以自己定义一个名字这样在写代码的时候可以更加清楚这个GPIO接口是干什么的GPIO_Output当我们将一个GPIO口配置为GPIO_Output时我们需要配置下面的信息GPIO output level决定引脚上电/初始化完成后输入高电平还是低电平GPIO mode输出模式有两种推挽输出和开漏输出电路图如下推挽输出既能主动推高也能主动拉低驱动能力强开漏输出只能主动拉低高电平必须靠外部上拉电阻支持 “线与” 和电平转换。从图中我们也能看出推挽输出有一对互补的MOS管上拉MOS管和下拉MOS管可以主动输出高电平和低电平而开漏输出只有下拉MOS管所以开漏输出要想输出高电平就只能依靠上拉电阻这也是为什么我们配置了GPIO output level后还需要配置上拉或下拉电阻因为当我们使用开漏输出时如果没有上拉电阻就算我们把level设置为高电平但也是输出不了高电平上拉或下拉设置和前面讲输入的时候是一样的输出速率1.本质含义它不是 “每秒能翻转多少次”而是电平跳变的上升 / 下降沿斜率速度越高 → 边沿越陡 → 电平变化越快速度越低 → 边沿越缓 → 电平变化越慢这个配置限制了 GPIO 输出的最高切换频率比如Low speed适合低频如点灯、按键功耗低、干扰小High speed适合高频如 SPI、串口高速通信用户自定义标签和前面是一样的GPIO还有模拟输入和复用输出模拟输入用于ADC复用输出则用于串口SPI和PWM这个我们后面再讲但是电路图却差不多IWDG独立看门狗IWDG 看门狗定义IWDGIndependent Watchdog Dog独立看门狗 是 STM32 内置的一个独立于系统时钟的硬件定时器用于在程序跑飞、死锁或进入低功耗死循环时自动复位单片机保证系统安全。工作原理重载计数器程序正常运行时需要定期往看门狗计数器里写入重装载值喂狗。倒计时看门狗计数器会由硬件自动减 1。复位触发如果计数器减到 0 还没被重新装载说明程序卡死了看门狗就会产生一个硬件复位信号让单片机重启。我们如何计算超时时间呢就需要预分频系数和重装载值比如在stm32中默认的时钟频率是40kHz可以看到我们的计数器加或者是减需要通过预分频器来判断每过1/40000秒预分频器里面的值会加1如果这时我们的预分频系数为1也就是不分频那么计数器就会加1或者减1在看门狗里是减1如果预分频系数为2也就是2分频那么过2/40000秒预分频器里面的值为2这时计数器才会做出相应的动作按照我们cubemx的默认设置预分频系数为4重装载值为4095那么我们的超时时间就是 4095*4/40000≈0.4095秒再来讲讲用户自定义的标签实际效果是这样我去问AIAI说定义这个是为了方便修改比如初始化的时候是这样的hiwdg.Init.Prescaler IWDG_PREhiwdg.Init.Reload IWDG_RELOAD;但是我实际看了代码还是没变所以我自己也不清楚这个到底有什么作用可能是我现在还没接触到吧如果以后知道了用处我会补上再来讲讲开启看门狗和喂狗的函数在初始化的时候就会自动开启了所以开启的函数是下面这个voidMX_IWDG_Init(void)喂狗的函数是这个// 喂狗核心函数直接调用即可HAL_IWDG_Refresh(hiwdg);这是独立看门狗其实并不复杂很容易理解NVICNVIC是 Nested Vectored Interrupt Controller 的缩写中文全称是 嵌套向量中断控制器。可以先拆成 3 个关键词理解控制器 (Controller)STM32 芯片内部的一个硬件模块专门管理所有中断的 “调度”向量 (Vectored)每个中断都有自己的 “专属地址”中断向量触发后能直接跳转到对应的处理函数不用逐个查找嵌套 (Nested)高优先级的中断可以 “打断” 低优先级中断的执行比如串口中断执行中定时器紧急中断来了会先处理定时器再回来处理串口—— 这是 NVIC 最核心的能力。我们这里要注意的就是抢占优先级因为在stm32中优先级分为抢占优先级和响应优先级这两个一共占了四位如果我们将抢占优先级设置为四位的话响应优先级就是零位如果将抢占优先级设置位一位的话那么响应优先级则是三位。抢占优先级越高越先响应而响应优先级是在当两个中断抢占优先级相同的情况下谁先响应比如我们抢占优先级都是一位但是这两个中断同时触发这时就需要判断响应优先级了而图中的按抢占优先级和子优先级排序以及按中断名称排序指的是在配置界面的排序不会改变中断向量表里面的顺序因为中断向量表是固定好的这里的排序只是为了我们方便进行查看强制启用DMA通道中断效果是即使你在 CubeMX 里没手动开启某个 DMA 通道的中断NVIC 里没打勾生成代码时也会强制把HAL_NVIC_EnableIRQ()写进去。中断的流程我们可以在数据手册中找到要注意并不是所有的中断都要经过这个流程图这个流程图只有GPIO 外部中断比如按键、外部电平跳变触发的中断和软件触发的EXTI 中断 / 事件通过 SWIER 寄存器手动触发绝大多数的中断都绕开EXIT直接由各自外设产生比如下面这些定时器中断更新中断、捕获比较中断由 TIM 外设内部产生直接连到 NVICUART 中断接收完成、发送完成、空闲中断由 USART 外设内部产生直接连到 NVICADC 中断转换完成、看门狗中断由 ADC 外设内部产生直接连到 NVICDMA 中断传输完成、半传输、错误中断由 DMA 控制器内部产生直接连到 NVICSysTick 中断内核系统定时器直接连到 NVICRCC 中断、I2C 中断、SPI 中断 等其他外设中断这些中断到后面配置的时候再讲现在先讲图中流程的中断图中的流程可以分为几步要让引脚的电平变化被边沿检测电路看到必须先做两件事引脚配置为输入模式浮空 / 上拉 / 下拉都可以通过 SYSCFG或 AFIO外部中断线路复用寄存器把该引脚映射到某条 EXTI 线比如把 PA0 映射到 EXTI0PB1 映射到 EXTI1 等这两步缺一不可将引脚配置为EXTI模式在GPIO里提到过就是将GPIO设置为下图这样当我们设置好EXTI时中断的触发就可以分为几步进行我们这里举例按键触发中断1.外部电平变化按下按键PA0电平从高到低2.边沿选择寄存器决定“检测哪种边沿”这个检测电路只对符合配置的跳变做出反应3.或门合并硬件/软件触发如果边沿检测电路输出了脉冲的话这里不论是否触发了软件中断或门都会输出14.请求挂起寄存器置1表示有符合规则的边沿触发请求5.中断屏蔽寄存器放行然后与门输出1将中断信号送到NVIC6.NVIC-CPU响应中断NVIC按照优先级仲裁并且通知CPUCPU保存现场跳转到响应的中断处理函数7.中断处理请挂起位在中断处理时最后中断会执行我们自己写的中断回调函数中断回调函数里面就是我们的处理逻辑在这里我们要注意必须手动清PR请求挂机寄存器的标志位最后我再来讲讲HAL库的中断调用的代码逻辑当我们cubemx配置好中断后到HAL库里面去看的时候会发现中断函数一层层调用有好几层容易搞晕这里我就讲清楚点我们这里以串口中断函数为例1. USART1_IRQHandler(void) ← 中断入口↓2. HAL_UART_IRQHandler(huart1) ← 总调度↓3. UART_Receive_IT(huart) ← 真正干活↓4. HAL_UART_RxCpltCallback(huart)← 你的代码1.USART1_IRQHandler(void)在中断入口函数那里只有一行voidUSART1_IRQHandler(void){HAL_UART_IRQHandler(huart1);}这个函数不做判断不处理不调用回调只是做了给转发这是ARM内核规定的中断向量函数名字固定不能改2. HAL_UART_IRQHandler(huart1)作用中断总调度员它只干 3 件事读状态寄存器看到底发生了什么中断判断哪个中断被使能了调用对应的子函数收到数据 → 调用 UART_Receive_IT(huart)发送寄存器空 → 调用 UART_Transmit_IT(huart)发送完成 → 调用 UART_EndTransmit_IT(huart)3. UART_Receive_IT(huart)作用真正处理接收逻辑的干活函数它干这些从 DR 寄存器把数据读出来存到你指定的缓存数组里计数还有多少字节没接收判断是否接收完成当最后一帧数据接收完成后它最后会调用这一行代码HAL_UART_RxCpltCallback(huart);4. HAL_UART_RxCpltCallback(huart)作用这是留给你写业务代码的钩子。我们所说的用户处理逻辑就是在这里写的在HAL库里面它是空的弱函数当我们自己重新写一个的时候就会覆盖它讲到这里有些人可能还是不懂没关系先有个印象然后后面到了具体的外设比如ADC串口DMA等我再详细讲它们的中断配置以及代码到时候再回过头来看可能就有点理解了RCCRCC Reset and Clock Control复位与时钟控制它是 STM32 芯片里负责 “给整个芯片供电时钟 重启系统” 的核心模块可以理解为单片机的“电源总闸 心跳发生器 复位按钮”。看到这张图我们可能会很懵这一堆名词是什么意思有什么作用接下来我就一步步讲解我们按照这个图从上往下解释缩写全称速度来源核心用途HSEHigh Speed External高速外部晶振高精度系统时钟、PLL 倍频源HSIHigh Speed Internal高速内部 RC 振荡器系统时钟备用、低成本场景LSELow Speed External低速外部晶振高精度 RTC实时时钟LSILow Speed Internal低速内部 RC 振荡器IWDG独立看门狗、RTC 备用然后我们拿cubemx里的时钟树来看我们先看图中的最上面的部分我们可以看到RTC的时钟来源有三种一种是HSE分频一种是LSE另一种是LSIRTC 是STM32内部集成的一个实时时钟主要用于计时和日期功能。RTC可以在微控制器的停机或待机模式下继续工作因此常用于唤醒系统或执行定时任务。RTC需要一个稳定的时钟源通常是一个低速的外部晶振如32.768 kHz的LSE晶振也可以是内部的低速RC振荡器如LSI RC。通过RCC配置RTC的时钟源后RTC可以提供精确的时间基准用于实现闹钟、日历等功能。LSI和LSE这两个低速时钟的频率不能满足我们外设的要求比如GPIO串口ADC等所以这两个低速时钟用来满足对时钟精度要求每那么高的外设比如RTC和看门狗然后再往下看就来到了HSI和HSE我们可以看到这两个时钟源关键的作用是给系统时钟SYSCLK提供时钟源然后系统时钟源再给具体的外设进一步提供时钟源SYSCLK的时钟源可以来源于三个地方一个是内部的高速时钟HSI但是这个时钟源相较于外部高速时钟源也就是外部晶振精度较低不适合作为主要的系统时钟来源HSE时钟来源于外部晶振的时钟源可以由外部晶振/陶瓷谐振器或外部用户时钟提供。HSE时钟相比HSI时钟具有更高的精度和稳定性主PLL时钟由HSE或HSI振荡器提供时钟信号具有两个不同的输出。这个PLL主要是倍频的作用本来我们的HSE输入8MHz肯定不满足某些外设72MHz的要求于是就需要倍频也就是图中的这一部分当我们调好了我们的系统时钟SYSCLK时就可以根据我们外设的具体需求去设置我们的系统频率也就是下面图中的部分接下来再看看cubemx里关于RCC的一些配置VDD voltage (V) 3.3 V含义芯片供电电压STM32F1 标准供电是 3.3V少数版本兼容 5V。Prefetch Buffer Enabled全称指令预取缓冲Prefetch Buffer作用相当于FLASH里面的一个小的高速缓存用来提前把CPU接下来要执行的指令读出来Flash Latency(WS) 2 WS (3 CPU cycle)全称Flash 等待周期Wait States, WS含义CPU 从 Flash 读取指令 / 数据时需要等待的时钟周期数。HSI Calibration Value 16全称HSI 时钟校准值含义内部高速 RC 振荡器HSI的微调参数出厂时由 ST 校准到 8MHz。HSE Startup Timeout Value (ms) 100含义外部高速晶振HSE启动时软件等待它稳定的最大超时时间毫秒。场景如果你的晶振启动特别慢比如低频晶振可以适当调高这个值如果晶振很快稳定也可以调低。LSE Startup Timeout Value (ms) 5000含义外部低速晶振LSE32.768kHz启动的最大超时时间毫秒。注意LSE 启动慢是正常现象不要把这个值设得太小否则会误判启动失败。图中的中断大部分情况下我们都用不到只有在某些场景才能用得到它的触发事件主要有三类STM32F1 系列CSS 中断Clock Security System 当你开启了CSS时钟安全系统如果 HSE 晶振失效 / 停振RCC 会立刻触发中断同时自动把系统时钟切回 HSI防止系统死机。PLL就绪中断 PLL 锁相环稳定后通知 CPU“PLL 已经准备好了可以切换系统时钟了”。时钟源就绪中断HSE/HSI/LSE/LSI 这些时钟源启动稳定后通知 CPU“我准备好了可以用了”。如果还想要看更加具体的话就需要去看数据手册了RCC是一个很重要的内容如果我们RCC没有配置好的话整个系统很可能出现莫名其妙的问题SYSSYS配置界面主要只有两个选项第一个选项是Debug选项也就是外面通过什么方式进行代码的下载和调试只有这几个选项时基源Timebase Source选择 HAL 库的系统延时基准定时器通常选 SysTick内核自带的滴答定时器也可以选其他定时器如 TIM1、TIM2这个定时器是 HAL_Delay()、HAL_GetTick() 等延时函数的基础WWDG窗口看门狗这几个选项我分别讲解一下WWDG counter clock prescaler这个东西是窗口看门狗计数器的时钟分频系数分频系数越大计数器越慢看门狗超时时间就越长WWDG window value这是窗口下限值只有当自由运行计数器的值小于窗口值的时候才允许喂狗WWDG free-running downcounter value这是计数器初始值当WWDG启动后这个值会从初始值开始递减计数Early wakeup interrupt ** 这是早期唤醒中断作用是当计数器减到某个值的前一刻会触发这个中断比如这个芯片的值好像是63所以这个窗口看门狗不像IWDG独立看门狗** 计数器减到0才复位窗口看门狗是减到某个值就复位了。如果打开这个选项我们可以在中断离做紧急处理之后再决定是否喂狗如果关闭的话计数器减到64就直接芯片复位了窗口看门狗通常用于对时序要求极高的场景AnalogADC它是 STM32 芯片里把「连续变化的模拟电压」转换成「离散的数字值」 的硬件模块 —— 简单说就是 “把模拟电信号翻译成数字信号让 CPU 能看懂” 的核心外设。我们需要一个参考电压比如3.3v然后ADC就会把变化的模拟电压转换成一个数值3.3v对应一个数值然后将转换的数值与3.3v的数值进行比较我们就可以知道大概的输出电压为多少先来看一下数据手册中关于ADC的框图这个图我们拆成几部分来讲输入部分模拟信号采集电压参考VREF/VREF- 是 ADC 的参考电压决定测量量程通常 VREF3.3VVREF-0VVDD/VSSA 是模拟电源保证精度。GPIO 端口ADCx_IN0~IN15 是 16 个外部模拟输入通道对应 GPIO 引脚比如 PA0ADC1_IN0用来接传感器、电位器等这里就接我们需要测量电压的设备。内部通道温度传感器内部连接测芯片核心温度VREFINT内部参考电压用来校准 ADC。模拟多路开关把 16 个外部通道 内部通道切换到 ADC 转换器同一时间只能选一个通道。这里我讲一下温度传感器这是stm32芯片自带的为了测量芯片温度所带的它不是独立外设而是ADC 的一个内部模拟输入通道对应 ADC1_IN16它不需要接任何外接只需配置为ADC就能读取它的输出当我们配置为ADC模式是温度传感器会把芯片温度转换成对应的电压任何我们需要根据ST提供的的公式计算实际温度。流程如下通道分组规则通道 vs 注入通道这是 STM32F1 ADC 最特别的设计分成两组规则通道Regular Channel最多 16 个正常转换用像 “普通任务队列”适合连续采样。注入通道Injected Channel最多 4 个优先级更高像 “中断任务”可以打断规则转换适合紧急场景比如突发故障检测。两者共享同一个 模拟至数字转换器只是调度优先级不同。转换核心模拟→数字模拟至数字转换器把输入的模拟电压转换成 12 位数字值0~4095。ADCCLK转换器的工作时钟来自 RCC 的 ADC 预分频器最大 14MHz分频自 PCLK2。它决定转换的速度如果频率越快的话单次转换消耗的时间越短转换结果规则通道 → 存入 规则通道数据寄存器16 位注入通道 → 存入 注入通道数据寄存器4×16 位最多 4 个通道结果。触发源谁来启动转换ADC 不会自己随便转需要触发信号才能开始规则组触发EXTTRIG定时器触发TIM1_CH1~CH3、TIM2_CH2、TIM3_TRGO 等外部中断EXTI_11软件触发直接写寄存器手动启动。注入组触发JEXTTRIG定时器触发TIM1_TRGO、TIM1_CH4、TIM2_TRGO 等外部中断EXTI_15软件触发。作用让 ADC 和定时器 / 外部事件同步比如 “每 10ms 测一次温度”。中断与事件转换完成通知EOCEnd Of Conversion规则通道转换结束标志位JEOCInjected EOC注入通道转换结束标志位AWDAnalog Watchdog模拟看门狗事件检测电压超出阈值。对应中断使能位EOCIE规则转换完成中断JEOCIE注入转换完成中断AWDIE模拟看门狗中断。这些中断会送到 NVIC让 CPU 及时处理新数据 / 异常。数据输出与高级功能DMA 请求规则通道转换完成后可以触发 DMA自动把数据搬到内存不用 CPU 干预适合高速连续采样。模拟看门狗设定阈值高低限HT/LT当 ADC 采样电压超出范围时触发 AWD 中断 / 事件用来做过压 / 欠压保护。再来看看 cubemx里的配置Mode Independent mode含义独立模式作用多 ADC 芯片如 STM32F103 有 ADC1/ADC2时选择 ADC 的工作模式Independent mode两个 ADC 各自独立工作互不干扰是最常用的模式其他模式如双 ADC 同步、交错模式用于高速采样普通开发基本用不到。ADC_SettingsADC 基础设置Data Alignment Right alignment含义数据对齐方式作用ADC 是 12 位精度但数据寄存器是 16 位需要选择对齐方式Right alignment右对齐12 位结果存在寄存器低 12 位高位补 0是最常用、最直观的方式直接读取就是 0~4095Left alignment左对齐12 位结果存在寄存器高 12 位低位补 0适合直接当 16 位值处理需要右移 4 位才是真实值。Scan Conversion Mode Disabled含义扫描转换模式作用开启后ADC 会自动按顺序扫描你配置的多个规则通道比如 CH0→CH1→CH2关闭时只转换单个规则通道场景需要同时采集多个传感器时必须开启 Scan Mode配合 DMA 自动搬运数据。Continuous Conversion Mode Disabled含义连续转换模式作用开启后ADC 会自动循环转换一次转换完成后立刻开始下一次关闭时单次转换触发一次只转一次转完就停场景需要持续采样如音频、波形采集时开启普通单次测量保持关闭。Discontinuous Conversion Mode Disabled含义间断转换模式作用开启后把多通道扫描序列拆成小段每次触发只转换1 个通道需要多次触发才能完成整个序列关闭时一次触发完成整个扫描序列场景非常少见只有需要精细控制转换节奏时才用普通开发保持关闭。Enable Regular Conversions Enable含义使能规则通道转换作用开启后规则通道才能被触发转换关闭则规则通道完全失效。Number Of Conversion 1含义规则通道转换次数作用定义规则通道序列的长度比如填 3 就代表要连续转换 3 个通道必须和 Scan Conversion Mode 配合次数 1 时Scan Mode 必须开启否则只转第一个通道。External Trigger Conversion Source Regular Conversion launched by software含义规则通道外部触发源作用选择 “谁来启动规则转换”Regular Conversion launched by software软件触发代码里调用函数手动启动转换是最简单的方式其他选项定时器通道如 TIM1_CH1、EXTI 外部中断用于同步触发比如每 10ms 自动转一次。Rank 1含义规则通道序列的优先级 / 顺序作用定义多通道扫描时的转换顺序Rank 1 是第一个转Rank 2 是第二个以此类推你现在次数 1所以只有 Rank 1对应你选择的 ADC 通道比如 ADC1_IN0。Enable Injected Conversions Disable含义使能注入通道转换作用开启后才能配置注入通道关闭则注入通道完全失效你现在保持 Disable说明只使用规则通道不需要紧急插队采样。Number Of Conversion含义注入通道转换次数作用定义规则通道序列的长度比如填 3 就代表要连续转换 3 个通道必须和 Scan Conversion Mode 配合次数 1 时Scan Mode 必须开启否则只转第一个通道。Enable Analog WatchDog Mode 未勾选含义使能模拟看门狗模式作用开启后ADC 会实时监测转换结果当电压超出你设定的阈值范围时触发中断 / 复位用于过压 / 欠压保护比如监测电池电压低于 2.5V 就报警再摆四个图更加直观的看扫描和非扫描单次转换和连续转换的区别最后再讲一点如果我们使用了多个通道那么打开的测量引脚数也有一样否则转换就会出错对应的就是下面这张图TimersRTC