声明:上图是STM32产品型号各字段含义,本文基于STM32F103
1、ADC的一些概念
常规通道(常规组)和注入通道(注入组)(regular channels and injected channels)
ADC支持的外部通道总共16个(且被3个ADC共享,ADC123),每个通道只能三种状态取其一:作为常规通道(最多能定义16个)、作为注入通道(最多能定义4个)、未配置。
划进常规组的通道即为最普通、最常用的通道,所有通道都是按程序员指定的顺序依次转换,不争不抢。
划进注入组的通道,优先级高,一旦触发,可以打断常规组中正在执行的A/D转换,并保存常规组的上下文,待注入组都转换完了,再切回常规组执行(可以按中断理解)。
独立模式和并行模式(Independent mode and Dual mode)
独立模式是指各个ADC独立运行,不与其他ADC的运行耦合。当然,一个ADC也可以整出很多模式。
并行模式是指两个ADC协作运行,STM32特指ADC1和ADC2协作运行,这又可以产生很多协作方式,当然,也产生了很多模式。
独立模式
单次转换模式(0)、扫描运行模式、扫描+连续运行模式、间断运行模式。
连续转换模式(1)。
注:单次转换模式和连续运行模式的使能共用一个Bit。0表示单次转换模式,1表示连续转换模式。
并行模式
常规并行模式、常规快速交叉模式、常规慢速交叉模式。
综上所述,独立模式中的单次转换模式最为普通,构建起来最为简单。
2、ADC 寄存器
ADC->SR:ADC status register,开发ADC必用的一个寄存器。
Address offset: 0x00 Reset value: 0x0000 0000
rc_w0含义:Software can read as well as clear this bit by writing 0. Writing ‘1’ has no effect on the bit value.
- Bit4 STRT:Regular channel Start flag,当规则通道开始转换时由硬件置位,由软件复位。用于查询。
0:无规则通道启动转换 1:有规则通道启动转换- Bit1 EOC:End of conversion,一个或一组通道转换完成时由硬件置位,由软件复位或通过读ADC->DR寄存器复位。用于查询。
0:转换未完成 1:转换已完成
ADC->CR1:ADC control register 1,开发ADC必用的一个寄存器。
Address offset: 0x04 Reset value: 0x0000 0000
- Bits19:16 DUALMOD[3:0]:Dual mode selection,全零就是独立模式。由软件设置。
0000: Independent mode.
0001: Combined regular simultaneous + injected simultaneous mode
0010: Combined regular simultaneous + alternate trigger mode
0011: Combined injected simultaneous + fast interleaved mode
0100: Combined injected simultaneous + slow Interleaved mode
0101: Injected simultaneous mode only
0110: Regular simultaneous mode only
0111: Fast interleaved mode only
1000: Slow interleaved mode only
1001: Alternate trigger mode only
ADC->CR2:ADC control register 2,开发ADC必用的一个寄存器。
Address offset: 0x08 Reset value: 0x0000 0000
Bit22 SWSTART:Start conversion of regular channels,软件触发通道转换,由软件置位,转换开始后由硬件复位。
0:复位值 1:启动常规通道转换Bit20 EXTTRIG:External trigger conversion mode for regular channels,外部事件触发常规通道开启转换的使能位,
由软件设置。0:禁止外部事件触发转换 1:允许外部事件对转换的触发。Bits19:17 EXTSEL[2:0]:External event select for regular group,选择外部事件,由软件设置。
以下仅给出ADC12的,ADC3不同但未给出,
000: Timer 1 CC1 event
001: Timer 1 CC2 event
010: Timer 1 CC3 event
011: Timer 2 CC2 event
100: Timer 3 TRGO event
101: Timer 4 CC4 event
110: EXTI line 11/TIM8_TRGO event (TIM8_TRGO is available only in high-density and XLdensity devices)
111: SWSTART(software start,由软件触发,即置位Bit22)Bit11 ALIGN:Data alignment,由软件设置。
0:12位数据右对齐 1:12位数据左对齐Bit 1 CONT:Continuous conversion,连续转换或单次转换模式选择位,由软件设置。
0:开启单次转换模式 1:开启连续转换模式
ADC->SMPR1: ADC sample time register 1,设置每个通道的采样时间,共18个通道,每通道3bit,因此使用了两个寄存器。
Address offset: 0x0C Reset value: 0x0000 0000
- 注:ADC1 ch17接内部温度传感器、ch16接内部VREFINT
ADC2 ch17 ch16都接内部VSS
ADC3 ch17 ch16 ch15 ch14都接VSSADC->SMPR2: ADC sample time register 1,开发ADC必用的寄存器。
Address offset: 0x10 Reset value: 0x0000 0000
- Bits29:0 SMPx[2:0]: Channel x Sample time selection,由软件设置。
000: 1.5 cycles
001: 7.5 cycles
010: 13.5 cycles
011: 28.5 cycles
100: 41.5 cycles
101: 55.5 cycles
110: 71.5 cycles
111: 239.5 cycles- 注:ADC3 ch9接到了VSS
ADC->JOFRx(x=1…4):ADC injected channel data offset register x,用不到,暂不作说明。
Address offset: 0x14-0x20 Reset value: 0x0000 0000
ADC->HTR:ADC watchdog High Threshold register,用不到,暂不作说明。
Address offset: 0x24 Reset value: 0x0000 0FFF
ADC->LTR:ADC watchdog low threshold register,用不到,暂不作说明。
Address offset: 0x28 Reset value: 0x0000 0000
ADC->SQR1:ADC regular sequence register 1,用于扫描模式下确认先后顺序,用不到,暂不作说明。
Address offset: 0x2C Reset value: 0x0000 0000
ADC->SQR2:ADC regular sequence register 2,每通道占5bit,因此用3个寄存器。
Address offset: 0x30 Reset value: 0x0000 0000
ADC->SQR3:ADC regular sequence register 3,
Address offset: 0x34 Reset value: 0x0000 0000
ADC->JSQR:ADC injected sequence register,注入通道在扫描模式下也要有先后顺序。用不到,暂不作说明。
Address offset: 0x38 Reset value: 0x0000 0000
ADC->JDRx(x=1…4):ADC injected data register x,划进注入组的每个通道独享数据寄存器。用不到,暂不作说明。
Address offset: 0x3C - 0x48 Reset value: 0x0000 0000
ADC->DR:ADC regular data register,常规通道共享一个数据寄存器,开发ADC必用的一个寄存器。
Address offset: 0x4C Reset value: 0x0000 0000
- Bits31:16 ADC2DATA[15:0]:ADC2 data
In ADC1:在并行模式下,存放ADC2的数据- Bits15:0 DATA[15:0]:Regular data,只读,
右对齐(ADC->CR2:ALIGN = 0):
左对齐(ADC->CR2:ALIGN = 1):
3、ADC 独立模式 常规通道 单次转换 配置步骤
- 设置ADC->CR1寄存器,Bit19:16(DUALMOD[3:0])为 0000,确保ADC处于独立模式;
其他位保持复位值。 - 向ADC->CR2的 Bit20(EXTTRIG)写1,以允许外部事件触发转换;
再设置ADC->CR2的 Bit19:17(EXTSEL[2:0])为111,选定触发事件为软件触发(即稍后通过向ADC->CR2的 Bit22(SWSTART)写1触发);
向ADC->CR2的 Bit11 (ALIGN)写0,以设置12位采样数据的对齐方式为右对齐;
最后向ADC->CR2的 Bit 1 (CONT)写0,以开启单次转换模式。
其他位保持复位值。 - 向ADC->SMPR2的 Bits5:3(SMP1[2:0])写 111,以设置通道1的采样时间为239.5 个周期。
其他位保持复位值。 - 向ADC->CR2的 Bit22(SWSTART)写1触发通道1的单次转换。
- 阻塞式查询ADC->SR的 Bit1(EOC)是否为1,为1则表明转换完成。
- 读取(uint16_t)ADC->DR寄存器。
- 重复 3~6