STM32萌新学习笔记 | 您所在的位置:网站首页 › 校准adc › STM32萌新学习笔记 |
本月初找了个公司实习,所以暂时放下了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 实验室设备网 版权所有 |