STM32萌新学习笔记 您所在的位置:网站首页 校准adc STM32萌新学习笔记

STM32萌新学习笔记

2023-09-14 14:15| 来源: 网络整理| 查看: 265

       本月初找了个公司实习,所以暂时放下了STM32,而且由于公司有用Linux,所以接下来准备学一下Linux,STM32自己也会接着学,只是学习机会没之前那么多了。本次学习笔记的内容包含DMA、ADC及内部温度传感器,实验设计内容为利用双ADC同步规则模式,通过DMA将温度传感器、内部参照电压、ADC通道10及ADC通道11的测量值传输到变量中,并将数值处理后通过串口1进行显示。

一、DMA直接存储器访问

适用平台:STM32F1XX

学习视频:正点原子、野火

参考资料:

《STM32中文参考手册V10》第10章-DMA控制器

DMA:

    ·主要功能是把数据从一个地方搬到另一个地方,而且不占用CPU。

    ·可以实现P(外设)->M(内存)、M->P、M->M。

    ·两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。

    ·M->M下所有DMA通道都能使用。

存储器:

1.易失性存储器:

RAM:

    ·DRAM(动态、同步):SDRAM、DDR SDRAM、DDRII SDRAM、DDRIII SDRAM

    ·SRAM(静态、异步)

2.非易失性存储器:

1)ROM:

    ·MASK ROM

    ·PROM:OTPROM、EPROM、EEPROM

2)FLASH:NOR FLASH、NAND FLASH

3)光盘

4)软盘

5)机械硬盘

易失性与非易失性存储器区别:

    ·易失性存储器掉电数据丢失,读写速度快

    ·非易失性存储器掉电数据不丢失,读写速度慢

DMA通道对应请求表:

DMA功能框图:

多个DMA请求处理:

    ·软件:每个通道的优先权可以通过DMA_CCRx的PL[1:0]设置,有4个等级:最高优先级、高优先级、中等优先级、低优先级。

    ·硬件:如果2个请求有相同的软件优先级,则较低编号的通道比高编号的通道优先权高,DMA1的优先级高于DMA2。

常用库函数:

时钟使能函数:RCC_AHBPeriphClockCmd()

初始化函数:DMA_Init()

typedef struct{

uint32_t DMA_PeripheralBaseAddr;//外设地址

uint32_t DMA_MemoryBaseAddr;//存储器地址

uint32_t DMA_DIR;//传输方向

uint32_t DMA_BufferSize;//传输数目

uint32_t DMA_PeripheralInc;//外设地址增量模式

uint32_t DMA_MemoryInc;//存储器地址增量模式

uint32_t DMA_PeripheralDataSize;//外设数据宽度

uint32_t DMA_MemoryDataSize;//存储器数据宽度

uint32_t DMA_Mode;//模式选择

uint32_t DMA_Priority;//通道优先级

uint32_t DMA_M2M;//存储器到存储器模式

}DMA_InitTypeDef;

DMA状态获取函数:DMA_GetFlagStatus()

DMA中断控制函数:DMA_ITConfig()

DMA使能函数:DMA_Cmd()

当前传输数目设置:DMA_SetCurrDataCounter()

当前剩余未传输数目获取:DMA_GetCurrDataCounter()

初始化配置参数讲解:

    1.配置数据从哪来到哪去:

DMA_PeripheralBaseAddr//外设地址->DMA_CPAR

DMA_MemoryBaseAddr//存储器地址->DMA_CMAR

DMA_DIR//传输方向->DMA_CCR:DIR

注:DST代表目的地,SRC代表源

    2.配置数据要传多少,传的单位是什么:

DMA_BufferSize//传输数目->DMA_CNDTR

DMA_PeripheralInc//外设地址是否递增->DMA_CCRx:PINC

DMA_MemoryInc//存储器地址是否递增->DMA_CCRx:MINC

DMA_PeripheralDataSize//外设数据宽度->DMA_CCRx:PSIZE

DMA_MemoryDataSize//存储器数据宽度->DMA_CCRx:MSIZE

    3.配置什么时候传输结束:

DMA_Mode//模式选择->DMA_CCRx:CIRC

    4.三种状态:传输过半、传输完成、传输出错->DMA_IS。

说明:

    1.传输数目最大为65535(2^16-1)

    2.当数据传输宽度不相同时,对齐方式查看《STM32中文参考手册V10》10.3.4

    3.闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。

实验设计:

    M->M:FLASH->SRAM,将内部FLASH的数据(常量)传输到内部的SRAM(变量)。

    M->P:SRAM->串口

二、ADC基本配置讲解

参考资料:

《STM32F1开发指南-库函数版本》第22章-ADC实验

《STM32中文参考手册V10》第11章-模拟/数字转换(ADC)

ADC(模数转换):

    将连续变化的模拟量转换为离散的数字信号,如将模拟信号转换为表示一定比例电压值的数字信号。

ADC原理框图:

STM32F10X ADC特点:

    ·12位逐次逼近型的模拟数字转换器

    ·ADC转换时间:最大转换速率1us->1MHz(ADCCLK=14MHz,采样周期1.5个ADC时钟)

    ·采样间隔可以按通道分别编程

规则通道组:

    相当于正常运行的程序,最多16个通道。规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则组转换的总数应写入ADC_SQR1寄存器的L[3:0]中。

注入通道组:

    相当于中断,最多4个通道。注入组转换的总数应写入ADC_JSQR寄存器的L[1:0]中。如果ADC_SQRx或ADC_JSQR寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉冲将发送到ADC以转换新选择的组。

STM32F1的ADC通道可以单次、连续、扫描或间断模式执行:

    单次转换模式

    连续转换模式

    扫描模式

    ADC中断

ADC引脚对应表:

    扫描模式下,由ADC_SQRx或ADC_JSQRx选中的通道被转换。若设置了EOCIE或JEOCIE,在最后一个通道转换完毕后才会产生EOC或JEOC中断。

ADC时钟配置:

    寄存器(RCC_CFGR)、RCC_ADCConfig(),不要让ADC时钟超过14MHz,否则可能不准。

ADC开关控制:

    ·通过设置ADC_CR2寄存器的ADON位可给ADC上电。当第一次设置ADON位时,它将ADC从断电状态下唤醒。

    ·ADC在开始精确转换前需要一个稳定时间tSTAB,延迟一段时间后(tSTAB),再次设置ADON位时开始进行转换。

    ·通过清除ADON位可以停止转换,并将ADC置于断电模式。在这个模式中,ADC几乎不耗电(仅几个μA)。

校准:

    1.建议在每次上电后执行一次校准。

    2.启动校准前,ADC必须处于关电状态(ADON=0)超过至少两个ADC时钟周期。

转换时间 = 采样时间 + 12.5个周期

DMA请求:

    ·当转换多个规则通道时需要使用DMA,这可以避免丢失已经存储在ADC_DR寄存器中的数据。

    ·只有在规则通道的转换结束时才产生DMA请求,并将转换的数据从ADC_DR寄存器传输到用户指定的目的地址。

    ·只有ADC1和ADC3拥有DMA功能。由ADC2转化的数据可以通过双ADC模式,利用ADC1的DMA功能传输。

双DMA模式:

    ·同步注入模式

    ·同步规则模式:

    外部触发来自ADC1的规则组多路开关(由ADC1_CR2寄存器的EXTSEL[2:0]选择),它同时给ADC2提供同步触发。在ADC1或ADC2的转换结束时:

    1.产生一个32位DMA传输请求(若设置了DMA位),32位的ADC1_DR寄存器内容传输到SRAM中,高半个字包含ADC2的转换数据,低半个字包含ADC1的转换数据。

    2.当所有ADC1/ADC2规则通道都被转换完时,产生EOC中断(若任一ADC接口开放了中断)。

    ·快速交叉模式

    ·慢速交叉模式

    ·交替触发模式

    ·独立模式:双ADC同步不工作,每个ADC接口独立工作。

    ·同步注入模式 + 同步规则模式

    ·同步规则模式 + 交替触发模式

    ·同步注入模式 + 交叉模式

注意:

    1.在双ADC模式里,当转换配置成由外部事件触发时,用户必须将其设置成仅触发主ADC,从ADC设置成软件触发,这样可以防止意外的触发从转换。但是,主和从ADC的外部触发必须同时被激活。

    2.在双ADC模式里,为了在主数据寄存器上读取从转换数据,必须使能DMA位,即使不使用DMA传输规则通道数据。

    3.不要在2个ADC上转换相同的通道(两个ADC在同一个通道上的采样时间不能重叠)。

    4.在同步模式中,必须转换具有相同时间长度的序列,或保证触发的间隔比2个序列中较长的序列长,否则当较长序列的转换还未完成时,具有较短序列的ADC转换可能会被重启。

 常用寄存器:

ADC_CR1

ADC_CR2

ADC_SMPR1

ADC_SMPR2

ADC_SQRx规则序列寄存器

ADC_JSQR注入序列寄存器

ADC_DR规则通道数据寄存器

ADC_SR状态寄存器

常用库函数:

ADC_Init():

typedef struct{

uint32_t ADC_Mode;//ADC模式

FunctionalState ADC_ScanConvMode;//是否使用扫描模式

FunctionalState ADC_ContinuousConvMode;//单次转换/连续转换

uint32_t ADC_ExternalTrigConv;//触发方式

uint32_t ADC_DataAlign;//对齐方式(左/右)

uint32_t ADC_NbrOfChannel;//规则通道序列长度

}ADC_InitTypeDef;

ADC_DeInit()

ADC_Cmd()

ADC_ITConfig()

ADC_SoftwareStartConvCmd()//使能软件启动转换    

ADC_RegularChannelConfig():

    uint8_t ADC_Channel //规则通道选择

    uint8_t Rank//转换顺序设置(1-16)

    uint8_t ADC_SampleTime//采样时间选择

ADC_GetConversionValue()//获取转换值

ADC_ResetCalibration()//复位校准

ADC_GetResetCalibrationStatus()//复位校准结束标志

ADC_StartCalibration()//启动校准

ADC_GetCalibrationStatus()//启动校准结束标志

实验设计

·ADC通道单次转化:

    1.开启IO口时钟和ADC时钟,设置IO为模拟输入

    2.复位ADC,同时设置ADC1分频因子:RCC_ADCCLKConfig()、ADC_DeInit()

    3.初始化ADC参数,设置ADC的工作模式以及规则序列的相关信息:ADC_Init()

    4.使能ADC并校准

    5.配置规则通道参数:ADC_RegularChannelConfig()

    6.触发软件转换:ADC_SoftwareStartConvCmd()

    7.等待转换完成,读取ADC值:ADC_GetConversionValue()

·独立模式-多通道-DMA读取:

    1.使能总线时钟(GPIO+DMA+ADC)

    2.GPIO初始化

    3.DMA复位及初始化(循环传输模式)

    4.开启DMA

    5.ADC复位+ADC输入时钟分频设置(延时2个及以上ADC时钟周期)

    6.ADC初始化(扫描模式+连续转换+软件触发)

    7.ADC通道配置(通道选择+采样顺序+采样频率)

    8.使能ADC的DMA请求

    9.唤醒ADC

    10.ADC校准

    11.开启软件触发

·双重模式-规则同步-DMA读取:

    1.使能总线时钟(GPIO+DMA+ADC)

    2.GPIO初始化

    3.DMA复位及初始化(循环传输模式、4字节传输、传输数目=单个ADC通道数)

    4.开启DMA

    5.ADC复位+ADC输入时钟分频

    6.ADC1、2初始化(规则同步模式RegSimult+连续转换+软件触发)

    7.ADC1、2通道配置(通道选择+采样顺序+采样频率)

    8.使能ADC1的DMA请求

    9.唤醒ADC1

    10.ADC1校准

    11.唤醒ADC2

    12.ADC2校准

    13.ADC2开启外部触发转换:ADC_ExternalTrigConvCmd()

    14.ADC1开启软件触发转换

    注:双ADC的转换数据存放在主ADC的DR寄存器中

三、内部温度传感器

适用平台:STM32F1XX

参考资料:

《STM32F1开发指南-库函数版本》第23章-内部温度传感器实验

《STM32不完全手册-库函数版本》第21章-内部温度传感器实验

《STM32中文参考手册V10》第11章10小节-温度传感器

 说明:

    1.温度传感器可以用来测量器件周围的温度(TA)。

    2.温度传感器在内部和ADC1_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值。

    3.温度传感器模拟输入推荐采样时间是17.1μs。

    4.STM32的内部温度传感器支持的温度范围为:-40-125度,精度较差,为±1.5度左右。

    5.内部温度传感器更适合于检测温度的变化,而不是测量绝对的温度。如果需要测量精确的温度,应该使用一个外置的温度传感器。

    6.温度传感器和通道ADC1_IN16相连接,内部参照电压VREFINT和ADC1_IN17相连接。

 注意:

    1.必须设置ADC_CR2的TSVREFE位(bit23)激活内部通道:ADC1_IN16(温度传感器)和ADC1_IN17(VREFINT)的转换。

    2.温度=(V25-VSENSE)/Avg_Slope+25:V25=VSENSE在25度时的数值(典型值:1.43);Avg_Slope=温度与VSENSE曲线的平均斜率(单位mV/度或μV/度)(典型值:4.3mV/度)。

开启步骤:

    1.选择ADC1_IN16输入通道

    2.选择采样时间为17.1μs

    3.设置ADC控制寄存器2(ADC_CR2)的TSVREFE位,以唤醒关电模式下的温度传感器

    4.通过设置ADON位启动ADC转换(或用外部触发)

    5.读ADC数据寄存器上的VSENSE数据结果

    6.利用公式得出温度

    注:传感器从关电模式唤醒后到可以输出正确水平的VSENSE前,有一个建立时间。ADC在上电后也有一个建立时间,因此为了缩短延时,应该同时设置ADON和TSVREFE位。

四、实验程序

    设置ADC为规则同步模式、通过DMA读取内部温度传感器和内部参考电压的采集值,同时读取PC0、PC1引脚的采集值,通过串口将处理后的各通道采集值显示出来。

1.DMA初始化:

2.ADC初始化:

3.main函数:

五、实验结果

PC0、PC1悬空:

PC0接3.3V:

PC1接3.3V:

       我的芯片一上电温度就涨得很快,触摸后感觉测量的温度与实际差不多(我没有测温用的仪器,只能凭感觉了)。

 

 

 

 

 

 

 

 

 

以下是我写给未来的我看的日记,是仅给我自己看的,其他人直接忽略掉滑到底即可。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

菴珨棒堤懂馱釬ㄛ呥輛腔岆珨模璃鼠侗ㄛ筍岆聆彸詣弇ㄛ赻撩俇羶諉揖徹ㄛ

鼠侗珩羶鑠捄ㄛ圉跺堎賸ㄛ蟀昢飲羶ㄛ赻撩艘鑠捄訧蹋赻悝ㄛ褫鼠侗腔鑠捄訧蹋

疑擭ㄛ肮詣弇腔肮岈衱飲俋巖堤賸ㄛ砑恀衱祥詫恀ㄛ涴笚赻撩衱秪峈恀賸祥蜆恀

腔陘蠶賸ㄛ赻撩遜岆跺俶跡嗽﹜囀砃腔ㄛ隻ㄛ赻撩嘛數岆俇粥賸﹝囀砃﹜祥

卍蝠霜腔岆拸楊婓扦頗奻汜湔腔ㄛ扂奻苤悝奀憩掩涴繫佽ㄛ扂珩婓郭彸蜊曹ㄛ褫

洇珋妗祥埰勍陛ㄛ苤悝掩嗽蕾腔ㄛ場笢﹜詢笢珩頗掩嗽蕾ㄛ湮悝眻諉赻敕ㄛ壺賸悝

炾晞羶賸汜湔腔砩砱ㄛ嗽黃妠賸扂媼坋嗣爛ㄛ涴爺嗽旮嘎咍ㄛ藩棒毀吽赻旯飲

婓勤扂咂佽覂ㄛ扂眒冪羶寰賸ㄛ麼勍涴憩岆蚥吨輾怑﹜巠氪汜湔勘ㄛ蔚嗽腔輾脹

杬怑裁﹝竭惕婓涴爵佽涴虳秏憤腔趕ㄛ筍扂淩腔覜橇赻撩辦推壓賸ㄛ扂祥眭耋赻撩

遜夔澄厥嗣壅ㄛ帤懂腔扂陛ㄛ斕遜魂覂鎘ˋ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有