MSPM0L1306例程学习-ADC部分(3)

MSPM0L1306例程学习系列
使用的TI的官方例程,即SDK里边包含的例程代码。
可以到TI官网下载并且安装SDK: https://www.ti.com.cn/tool/cn/download/MSPM0-SDK/

MCU使用的是MSPM0L1306, 对于ADC部分,有10个例程:
在这里插入图片描述
前边讲了4个例程,今天接着讲2个例程,通过DMA进行进行ADC转换结果的传输,其中一个例程是12位的分辨率,另一个例程是8位的分辨率。 两个例子的简单比较如下:

  1. 在AD的工作模式都选择了单通道 多次转换的工作模式,选择adc通道2(PA25),这个可以根据实际需要进行修改的;
  2. 参考电压的选择上,都直接使用了电源电压作为基准电压。 要特别注意,如果使用内部参考电压源,那么ADC的时钟上限为4MHz。
  3. 有个采样保持时间,通过定时计数器0或者1来设置。这个跟ADC的分辨率有关,具体可以查看手册,里边有个公式计算。12位分辨率,例程里是250ns;8位分辨率,例程设置的是62.5ns。
  4. 启用了FIFO寄存器,是一个32位的寄存器,将从这个寄存器读取ADC的转换结果。因为是32位的,所以会将两次的转换结果存放在一起。所以,如果转换了1000次,实际上只要读500次,因为每次能读取两个结果。目前是这么理解的,有错的话,后续再回来更正:)
  5. 需要重点理解的是,DMA触发的相关配置。
    a. DMA Samples Count,一次DMA触发要传输的ADC转换结果数;
    b. Enable DMA Triggers, 配置可以触发DMA进行传输的触发源。

第1个例程的注解如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
下边这一页的配置要重点理解下,总感觉例程有不是很合理的地方~
在这里插入图片描述
在这里插入图片描述
代码简单注释如下:

/** ADC转换的SDK例程* 文件名:adc12_max_freq_dma.c* 描述:*   ADC转换使用DMA来传输结果,12位分辨率。*   1、单通道、多次转换、自动采样模式、软件触发;*   2、启用FIFO,选择ADC输入通道2(PA25)*   3、直接使用电源电压做参考电压*   4、转换ADC_SAMPLE_SIZE=1024次,将通过DMA存放到数组gADCSamples[]中;*   5、代码中设有断点语句__BKPT(0),会自动进入断点,查看数据;** 操作描述:*   1、下载程序;*   2、添加观察变量gADCSamples,全速运行;*   3、系统会自动停在断点处,查看ADC的采样结果值;** 注意事项:*   1、注意系统时钟的配置,ADC的时钟为32MHz*   2、在SYSCONFIG图形配置工具中并没有完成所有的参数配置;*     部分的参数配置,在主程序通过调用库函数的形式进行重新配置;*   3、不能使用内部参考电压源VREF,启用内部电压,ADC时钟限制为4MHz;** 思考:*   1、程序只跑一遍,如果想要不断的执行,while(1)循环应该怎么修改?*   2、如果没有外部电压接入PA25, 把ADC的通道换成A15,内部源监控通道,VDD/3,数据比较规律?** 修改:*   基于官方的sdk例程增加注释,xie_sx@126.com*/#include "ti_msp_dl_config.h"//宏定义了ADC的转换次数
#define ADC_SAMPLE_SIZE (1024)//当启用FIFO时,2个转换结果会被压缩为一个32位存放在FIFODATA寄存器
//所以,读取FIFO的次数要减半,右移一位
#define ADC_FIFO_SAMPLES (ADC_SAMPLE_SIZE >> 1)//定义16位的数组来存放ADC的转换结果.
uint16_t gADCSamples[ADC_SAMPLE_SIZE];//标志变量,ADC的转换结果是否已经传输完成;
volatile bool gCheckADC;int main(void)
{//器件初始化SYSCFG_DL_init();//DMA的基本工作模式在SYSCONFIG里已经配置;//此处配置DMA的传输通道信息,一般要配置3个参数,从哪搬到哪,搬多少//1、源地址, FIFODATA寄存器的地址,从这个寄存器读取数据往外搬//2、目的地址, 存档转换结果的数组的起始地址, 直接将数据搬到数组中//3、传输大小,要搬运的次数DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID,(uint32_t) DL_ADC12_getFIFOAddress(ADC12_0_INST));DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) &gADCSamples[0]);DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, ADC_FIFO_SAMPLES);DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);//配置器件的中断NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);//ADC12的转换完成标志位清零gCheckADC = false;//软件启动ADC12转换DL_ADC12_startConversion(ADC12_0_INST);//等待ADC12的转换完成标志位变为true,该标志在中断里设置while (false == gCheckADC){__WFE();}//断点,程序运行到此处会自动进入断点,可查看ADC的转换结果__BKPT(0);while (1){__WFI();}
}/** ADC12中断处理函数* 通过DMA传输完成中断来判断ADC转换结束**/void ADC12_0_INST_IRQHandler(void)
{switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST)){case DL_ADC12_IIDX_DMA_DONE:gCheckADC = true;break;default:break;}
}

第2个例程的注解如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码简单注释如下:

/** ADC转换的SDK例程* 文件名:adc12_max_freq_dma_8bit.c* 描述:*   ADC转换使用DMA来传输结果,8位分辨率*   1、单通道、多次转换、自动采样模式、软件触发;*   2、启用FIFO,选择ADC输入通道2(PA25)*   3、直接使用电源电压做参考电压*   4、转换ADC_SAMPLE_SIZE=1024次,将通过DMA存放到数组gADCSamples[]中;*   5、代码中设有断点语句__BKPT(0),会自动进入断点,查看数据;** 操作描述:*   1、下载程序;*   2、添加观察变量gADCSamples,全速运行;*   3、系统会自动停在断点处,查看ADC的采样结果值;** 注意事项:*   1、注意ADC的时钟选择SYSOSC,工作在32MHz*   2、在SYSCONFIG图形配置工具中并没有完成所有的参数配置;*     部分的参数配置,在主程序通过调用库函数的形式进行重新配置;*   3、不能使用内部参考电压源VREF,启用内部电压,ADC时钟限制为4MHz;** 思考:*   1、代码有一定的优化空间.例如,两个中断里的标志没有具体区分开来** 修改:*   基于官方的sdk例程增加注释,xie_sx@126.com*/#include "ti_msp_dl_config.h"#define ADC_SAMPLE_SIZE (1024)//当启用FIFO时,2个转换结果会被压缩为一个32位的数据存放在FIFODATA寄存器
#define ADC_FIFO_SAMPLES (ADC_SAMPLE_SIZE >> 1)uint16_t gADCSamples[ADC_SAMPLE_SIZE];volatile bool gCheckADC;
volatile bool gADCError;int main(void)
{//器件初始化SYSCFG_DL_init();//DMA的基本工作模式在SYSCONFIG里已经配置;//此处配置DMA的传输通道信息,一般要配置3个参数,从哪搬到哪,搬多少//1、源地址, FIFODATA寄存器的地址,从这个寄存器读取数据往外搬//2、目的地址, 存档转换结果的数组的起始地址, 直接将数据搬到数组中//3、传输大小,要搬运的次数。 放到了while(1)循环中DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID,(uint32_t) DL_ADC12_getFIFOAddress(ADC12_0_INST));DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) &gADCSamples[0]);//配置器件的中断NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);gCheckADC = false;gADCError = false;while (1){DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, ADC_FIFO_SAMPLES);DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);DL_ADC12_enableDMA(ADC12_0_INST);DL_ADC12_startConversion(ADC12_0_INST);//查询ADC是否处于忙状态。//在单通道多次转换的模式下,一旦ADC被触发,无论转换是否停止,ADC将继续采样,直到完成相应次数的转换//??需要进一步探讨下,这个语句的具体作用if (DL_ADC12_STATUS_CONVERSION_ACTIVE == DL_ADC12_getStatus(ADC12_0_INST)){DL_ADC12_stopConversion(ADC12_0_INST);}while ((false == gCheckADC) && (false == gADCError)){//只有两个条件都满足,才在这里等待__WFE();}//为什么要先禁用,有启用? 感觉没必要??DL_ADC12_disableConversions(ADC12_0_INST);DL_ADC12_enableConversions(ADC12_0_INST);//断点,程序运行到此处会自动进入断点,可查看ADC的转换结果__BKPT(0);gCheckADC = false;gADCError = false;}
}/** ADC12中断处理函数**/void ADC12_0_INST_IRQHandler(void)
{switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST)){case DL_ADC12_IIDX_DMA_DONE:gCheckADC = true;break;case DL_ADC12_IIDX_UNDERFLOW:gADCError = true;break;default:break;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/290362.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式开发是否会重复Java的结果?

今日话题,嵌入式开发是否会重复Java的结果?嵌入式开发与Java开发在性质和稳定性上有一些不同,因此不太容易出现与Java相似的结果。嵌入式开发通常属于第二产业,主要涉及制造业领域,如电子、机械(汽车&#…

干洗店预约上门取货小程序与互联网洗鞋店小程序开发制作功能方案

干洗店预约上门取货小程序与互联网洗鞋店小程序开发制作功能方案 一、洗衣洗鞋店小程序功能 1. 预约订单:忙碌时,您可以使用预约功能轻松获取洗衣服务。 2. 在线下单:用户可直接通过小程序在线下单,享受专人上门取货与配送服务。…

众和策略:2900点失而复得!A50盘中拉升

A股商场今天上午整体低位轰动,沪指2900点合浦还珠。富时我国A50指数期货盘中涨幅继续扩展至1%,此前一度跌0.5%。 现在商场整体仍相对弱势,但活跃要素在进一步累积。就在昨晚,不少上市公司宣布增持或回购信息。此外,外…

Java毕业设计——springboot+vue电影院会员管理系统

1,项目背景 随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个B/S结构的电影院会员管理系统;电影院会员管理系统的管理工作系统化、规范化,也会提高影院形象…

Javascript 开发html网页读写IC卡源码

本示例使用设备&#xff1a; Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/智能海报/-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">…

基于SpringBoot的医院门诊预约挂号系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2 科室医生档案模块2.1.3 预约挂号模块2.1.4 医院时政模块 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 维护性 三、数据库设计3.1 用户表3.2 科室档案表3.3 医生档案表3.4 医生放号…

springboot整合rabbitmq附源码

前提是对rabbitmq有一定的了解&#xff0c;比如虚拟主机&#xff0c;交换机&#xff0c;队列&#xff0c;信道&#xff0c;绑定&#xff0c;路由键&#xff0c;direct&#xff0c;fanout&#xff0c;topic等 我使用的是docker部署的rabbitmq&#xff0c;看到简书的这个&#x…

Python知识(1/20):变量、表达式、什么是程序?

23年是AI井喷的一年&#xff0c;我对AI的态度是恐惧的&#xff0c;以往我只需要CRUD就能需要的工作&#xff0c;AI能够编写出来&#xff0c;虽然现在还有很多缺陷&#xff0c;但是我比较喜欢向前看&#xff0c;在我未来我感觉我能遇到我被AI替代的那天。 我该怎能么办呢&#…

【VisualStudio 2022】常见配置合集(持续更新)

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ 编辑Tab变空格空格显示为点点点 2️⃣ 注释相关注释补一个空格空行也可以添加注释 &#x1f4d6; 参考资料 &#x1f6eb; 导读 需求 感觉好久没有写C了&#xff0c;或者说新版本的IDE&#xff0c;新增了很多特性&#xff0c…

魔众知识付费系统:赋能知识变现,打造高效在线培训新模式

在这个信息爆炸的时代&#xff0c;知识付费已经成为越来越多人的选择。魔众知识付费系统正是为了满足这一需求而诞生的。它提供了一个全面、高效的知识付费 / 在线培训解决方案&#xff0c;帮助知识生产者将知识变现&#xff0c;同时也为学习者提供了一个便捷、专业的在线学习平…

ssm基于vue.js的连锁干洗店后台管理系统论文

摘 要 使用旧方法对连锁干洗店后台管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在连锁干洗店后台管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次…

FBI:BlackCat 勒索软件狂“薅” 3 亿美元

Bleeping Computer 网站消息&#xff0c;美国联邦调查局&#xff08;FBI&#xff09;近期宣称&#xff0c;截至 2023 年 9 月&#xff0c;ALPHV/BlackCat 勒索软件团伙已成功袭击全球 1000 多名受害者&#xff0c;狂“薅”了超过 3 亿美元的赎金&#xff0c;其中近 75% 受害者来…