当前位置: 首页 > news >正文

杰发科技AC7801——ADC定时器触发的简单使用

使用场景

在需要多次采样结果的情况下,比如1s需要10w次的采样结果,可以考虑使用定时器触发采样,定时器设置多少的时间就会多久采样转换一次。

再加上使用dma,采样的结果直接放在dma的数组里面。

实现了自动采样,自动保存,使用非常方便。

需要用到CTU模块

代码如下

代码不是很完整  可以参考sample里面adc的定时器触发代码

/*********<Variable>********/
uint8_t g_dmaFinish = 0;//DMA传输完成
uint8_t g_halfDmaFinish = 0; //DMA传输半完成
uint8_t g_dmaTransError = 0; //DMA传输错误
uint32_t g_ADCValueBuffer[DMA_TRANSFER_NUM + 1] = {0};
uint32_t g_timerCnt = 0;
uint32_t g_averageSampleValue = 0;#define Delay50us                      (APB_BUS_FREQ/2000-1)
#define Delay5ms                      (APB_BUS_FREQ/200-1)
#define Delay1s                       (APB_BUS_FREQ-1)
#define DMA_TRANSFER_NUM               100void ADC_DMACallback(void *device, uint32_t wpara, uint32_t lpara)
{/*wparam为DMA通道状态,状态含义可参考CHANNELx_STATUS寄存器,CHANNELx_STATUS[2] 传输错误CHANNELx_STATUS[1] 半传输完成(相对设置的transferNum,如果半传输中断有使能,transferNum设为6,则DATA_TRANS_NUM为3时产生中断,进入回调)CHANNELx_STATUS[0] 传输完成*/if ((wpara & 0x01) == 0x1){g_dmaFinish = 1;}if ((wpara & 0x02) == 0x2){g_halfDmaFinish = 1;}if ((wpara & 0x04) == 0x4){g_dmaTransError = 1;}
}void ADC_DMAInit(void)
{uint32_t tmpMemStartAddr = (uint32_t)&g_ADCValueBuffer[0];uint32_t tmpMemEndAddr = (uint32_t)&g_ADCValueBuffer[DMA_TRANSFER_NUM + 1]; ///<Setting memory DMA addressDMA_ConfigType tmpDMAConfig;memset(&tmpDMAConfig, 0x00, sizeof(DMA_ConfigType));tmpDMAConfig.memStartAddr = tmpMemStartAddr; //设置DMA开始地址tmpDMAConfig.memEndAddr = tmpMemEndAddr;//设置DMA结束地址tmpDMAConfig.periphStartAddr = (uint32_t)(&(ADC0->RDR)); ///<Move ADC DR to memorytmpDMAConfig.channelEn = ENABLE;                     ///<使能DMAx通道tmpDMAConfig.finishInterruptEn = ENABLE;                   ///<使能DMA传输完成中断tmpDMAConfig.halfFinishInterruptEn = DISABLE;               ///<去能DMA半传输完成中断tmpDMAConfig.errorInterruptEn = ENABLE;                    ///<使能DMA传输错误中断tmpDMAConfig.channelPriority = DMA_PRIORITY_VERY_HIGH;///<设置DMA通道优先级,0~3 :优先级由低到高tmpDMAConfig.circular = ENABLE;                      ///<使能循环模式,如果只想工作一次,设为0即可。tmpDMAConfig.direction = DMA_READ_FROM_PERIPH;          ///<0: 从外设读取,1:从存储器读取tmpDMAConfig.MEM2MEM = DISABLE;                     ///<0:在非存储器与存储器之间传输,1:在存储器与存储器之间传输tmpDMAConfig.memByteMode = DMA_MEM_BYTE_MODE_1TIME;  ///<MEM字分割传输数,0:32-bit,1:16-bit[15:0]; 2:16-bit[23:16][7:0];3:8-bit。详情可参考AC781X芯片手册  表20-2 可编程数据宽度&数据对齐 tmpDMAConfig.memIncrement = ENABLE;                  ///<1:MEM地址增加tmpDMAConfig.periphIncrement = DISABLE;               ///<0:外设地址固定tmpDMAConfig.memSize = DMA_MEM_SIZE_32BIT;           ///<0:8-bit,1:16-bit,2:32-bittmpDMAConfig.periphSize = DMA_PERIPH_SIZE_16BIT;     ///<0:8-bit,1:16-bit,2:32-bittmpDMAConfig.transferNum = DMA_TRANSFER_NUM;         ///<DMA通道传输长度tmpDMAConfig.periphSelect = DMA_PEPIRH_ADC0;  //外设选择tmpDMAConfig.callBack = ADC_DMACallback; ///<设置DMA中断回调DMA_Init(DMA0_CHANNEL0, &tmpDMAConfig);                     ///<ADC 使用DMA1通道,每个模块对应的DMA通道,可参考 AC781X芯片手册 表20-1 DMA请求列表NVIC_EnableIRQ(DMA0_CHANNEL0_IRQn);                              ///<使能DMA1中断请求
}
/*** CTU_Config** @param[in] void* @return void** @brief 配置CTU模块,Timer0触发ADC规则组采样。*/
void CTU_Config(void)
{CTU_ConfigType ctuConfig;memset(&ctuConfig, 0x00, sizeof(ctuConfig));ctuConfig.uart0RxFilterEn = DISABLE;  //去能UART0_RX滤波ctuConfig.rtcCaptureEn = DISABLE;  //去能RTC捕获ctuConfig.acmpCaptureEn = DISABLE;  //去能ACMP捕获ctuConfig.uart0RxCaptureEn = DISABLE;  //去能UART0_RX捕获ctuConfig.uartTxModulateEn = DISABLE;  //去能UART0_TX调制ctuConfig.clkPsc = CTU_CLK_PRESCALER_1;  //分频ctuConfig.adcRegularTriggerSource = CTU_TRIGGER_ADC_TIMER_CH0_OVERFLOW; //Timer0触发ADC规则组采样。ctuConfig.delay0Time = 0;  //触发延迟CTU_Init(&ctuConfig);
}void TIMER_Callback(void *device, uint32_t wpara, uint32_t lpara)
{if (TIMER_CHANNEL0 == device){g_timerCnt++;}
}void TIMER0_Init(void)
{TIMER_ConfigType timerConfig = {0};timerConfig.periodValue = Delay50us;//5ms定时timerConfig.interruptEn = ENABLE;//使能中断timerConfig.linkModeEn = DISABLE;//级联模式去能timerConfig.callBack = TIMER_Callback;//设置中断回调函数timerConfig.timerEn = ENABLE;//使能定时器TIMER_Init(TIMER_CHANNEL0, &timerConfig);
}void ADC_init()
{ADC_ConfigType tempAdcConfig;ADC_ConfigType* adcConfig;adcConfig = &tempAdcConfig;//配置PINMUXGPIO_SetFunc(GPIOA, GPIO_PIN2, GPIO_FUN2);///<ADC_IN8 Analog function enableGPIO_SetFunc(GPIOA, GPIO_PIN8, GPIO_FUN2);///<ADC_IN8 Analog function enableadcConfig->clkPsc = ADC_CLK_PRESCALER_1; ///<Set ADC Clk = 24M/2/(0+1)adcConfig->scanModeEn = ENABLE;                   //扫描模式adcConfig->continousModeEn = DISABLE;             //连续模式adcConfig->regularDiscontinousModeEn = DISABLE;   //1:打开规则组间断转换模式adcConfig->injectDiscontinousModeEn = DISABLE;    //1:打开注入组间断转换模式adcConfig->injectAutoModeEn = DISABLE;            //1:自动注入模式adcConfig->intervalModeEn = DISABLE;              //1:注入组为间隔转换模式adcConfig->regularDiscontinousNum = 0;            //adcConfig->EOCInterruptEn = DISABLE;              //EOC中断去能adcConfig->IEOCInterruptEn = DISABLE;             //IEOC中断去能adcConfig->interruptEn = DISABLE;                 //去能中断adcConfig->regularDMAEn = ENABLE;                 //使能ADC DMAadcConfig->regularTriggerMode = ADC_TRIGGER_EXTERNAL;//ADC触发源,外部触发adcConfig->injectTriggerMode = ADC_TRIGGER_INTERNAL; //ADC触发源,内部触发adcConfig->regularSequenceLength = 2;               //规则组长度设为1adcConfig->injectSequenceLength = 0;               //注入组长度设为0adcConfig->dataAlign = ADC_DATA_ALIGN_RIGHT;       //右对齐adcConfig->powerMode = ADC_POWER_ON;               //上电ADC_Init(ADC0, adcConfig);                      ///<ADC works Mode Config/*ADC转换率计算公式:转换时间= 采样时间+转换时间+同步时间转换时间= (SPT+12)/ADC模块时钟频率+5/APB时钟频率备注:1.同步时间为5个APB CLK。2.ADC时钟频率 = APB时钟频率 /(分频系数+1)*///ADC_SetRegularGroupChannel(ADC0, ADC_CH_8, ADC_SPT_CLK_7, 0);  //采样&转换时间= (7+12)/24000000 + 5/24000000 = 1usADC_SetRegularGroupChannel(ADC0, ADC_CH_8, ADC_SPT_CLK_64, 0);  //采样&转换时间= (7+12)/24000000 + 5/24000000 = 1usADC_SetRegularGroupChannel(ADC0, ADC_CH_3, ADC_SPT_CLK_64, 1);  //采样&转换时间= (7+12)/24000000 + 5/24000000 = 1usADC_DMAInit();   //ADC DMA初始化
}void sampleValueDeal(void)
{int i;uint32_t sumValue = 0;for (i = 0; i < DMA_TRANSFER_NUM; i++){sumValue += g_ADCValueBuffer[i];}g_averageSampleValue = sumValue / DMA_TRANSFER_NUM;}void ADC_SampleTimerTrigerRegular(void)
{CTU_Config();ADC_init();TIMER0_Init();///<开始ADC规则组转换,转换值根据规则组通道顺序存储在g_ADCValueBuffer数组中。while(1){//nothing todo mdelay(500);sampleValueDeal();printf("Timer Triger ADC Regular Sample value: %d\r\n", g_averageSampleValue);}
}/**********<End>*********/

采样频率用这个时间来控制

需要用到CTU模块来连接定时器和ADC'

需要多个ADC通道在这里添加,注意修改规则组长度

DMA的配置用示例的就行

配置了2个通道的时候,采样的结果会按照顺序存储在DMA数组里面

相关文章:

杰发科技AC7801——ADC定时器触发的简单使用

使用场景 在需要多次采样结果的情况下&#xff0c;比如1s需要10w次的采样结果&#xff0c;可以考虑使用定时器触发采样&#xff0c;定时器设置多少的时间就会多久采样转换一次。 再加上使用dma&#xff0c;采样的结果直接放在dma的数组里面。 实现了自动采样&#xff0c;自动…...

VTK知识学习(8)-坐标系统

1、概述 计算机图形学里常用的坐标系统有4种&#xff1a; 1&#xff09;、Model坐标系统。定义模型时所采用的坐标系统&#xff0c;通常是局部的笛卡儿坐标系。 2&#xff09;、World坐标系统。是放置Actor的三维空间坐标系。 Actor&#xff08;vtkActor类&am…...

IO流部分串讲

一、IO流的概念简析&#xff1a; java将输入与输出比喻为"流"&#xff0c;英文:Stream. 就像生活中的"电流","水流"一样,它是以同一个方向顺序移动的过程.只不过这里流动的是字节(2进制数据).所以在IO中有输入流和输出流之分,我们理解他们是连接…...

Excel——宏教程(2)

Excel——宏教程(2) 一)、处理单元格 1、直接赋值与引用 将变量、常量值直接赋给单元格、或将单元格的值直接赋给变量、常量&#xff0c;这是在excel中最简单的单元格赋值及引用方法。 如下例将工作表"Sheet1"A1单元格的值赋给Integer变量I&#xff0c;并将I1的值…...

unity 中 RectTransform 的常用几个属性

RectTransform rectTransform this.GetComponent<RectTransform>(); rectTransform this.transform as RectTransform; Vector3 vector1 rectTransform.position; //自身轴心点相对于锚点的位置&#xff08;编译器显示的pos&#xff09; …...

项目-摄像

树莓派摄像头使用方法 Camera教程 https://www.raspi.cc/index.php?cread&id53&page1 nanopc-t4 ​https://www.raspi.cc/index.php?cread&id53&page1 摄像头型号 Raspberry Pi Camera Rev 1.3 检测故障 dmesg | grep -i mipi piNanoPC-T4:~$ dmesg | …...

摄像机ISP和DSP的区别?

影像处理器是现代数字相机、手机等电子设备中极其重要的一部分&#xff0c;它能够对传感器采集的图像进行多种操作&#xff0c;从而得到更高质量的图像。常见的两种影像处理芯片有ISP&#xff08;Image Signal Processor&#xff09;和DSP&#xff08;Digital Signal Processor…...

Ubuntu24安装配置NDK

1、下载NDK 下载压缩包&#xff0c;下载地址如下&#xff0c;建议下载LTS支持版本。 https://developer.android.google.cn/ndk/downloads?hlcs 2、解压缩 将NDK解压到指定文件夹。如&#xff1a;/opt 或者先解压&#xff0c;再移动到指定目录下。 3、配置环境变量 找到…...

【Next】中间件

概述 Next.js 的 中间件 (Middleware) 是一种在请求完成之前运行的函数&#xff0c;用于对入站请求进行处理和操作。它可以在路由匹配前执行逻辑&#xff0c;用于身份验证、请求重写、重定向、设置响应头等任务。 使用场景 身份验证&#xff1a;在用户访问页面前检查登录状态…...

Vulnhub靶场案例渗透[11]- Momentum2

文章目录 一、靶场搭建1. 靶场描述2. 下载靶机环境3. 靶场搭建 二、渗透靶场1. 确定靶机IP2. 探测靶场开放端口及对应服务3. 扫描网络目录结构4. 代码审计5. 反弹shell6. 提权 一、靶场搭建 1. 靶场描述 - Difficulty : medium - Keywords : curl, bash, code reviewThis wor…...

STM32设计防丢防摔智能行李箱-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着科技的不断发展&#xff0c;嵌入式系统、物联网技术、智能设备…...

Vue Mixin混入机制

在 Vue.js 中&#xff0c;Mixin&#xff08;混入&#xff09;是一种可复用代码的机制&#xff0c;用于在多个组件之间共享逻辑。通过混入&#xff0c;可以将通用功能提取到一个独立的文件中&#xff0c;然后在组件中引入并使用&#xff0c;而无需重复代码。 基本概念 Mixin 是…...

数据库类型建表

接着上次的数据库笔记&#xff1a; 初始数据库 &#xff08;是博主自己写的&#xff09; 1.数据库类型 1.1数值类型 数据类型大小说明对应JAVA类型BIT[(M)]M指定位数&#xff0c;默认值为1二进制数&#xff0c;M的范围从1—64&#xff0c;存储数值范围从0—2^M-1常用Bool…...

iOS 18 导航栏插入动画会导致背景短暂变白的解决

问题现象 在最新的 iOS 18 系统中,如果我们执行导航栏的插入动画,可能会造成导航栏背景短暂地变为白色: 如上图所示:我们分别向主视图和 Sheet 弹出视图的导航栏插入了消息,并应用了动画效果。可以看到,前者的导航栏背景会在消息插入那一霎那“变白”,而后者则没有任何…...

深度学习之人脸检测

在目标检测领域可以划分为了人脸检测与通用目标检测&#xff0c;往往人脸这方面会有专门的算法&#xff08;包括人脸检测、人脸识别、人脸其他属性的识别等等&#xff09;&#xff0c;并且和通用目标检测&#xff08;识别&#xff09;会有一定的差别&#xff0c;着主要来源于人…...

解决前后端发版本时候,手动清除浏览器缓存

在.html页面中添加标签 后端配置nginx,让index.html不缓存 location /index.html { add_header Cache-Control “no-cache, no-store”; }在vite.config.ts中添加 rollupOpyions: { output: { // 输出编译后的文件名称&#xff1a;【文件名称.时间戳】、【文件名称.版本号.…...

mysql8.4+mysql router读写分离

以下为容器环境内搭建 准备工作: 拉取镜像: 镜像版本mysql8.4container-registry.oracle.com/mysql/community-router8.4 下载mysql_shell mysql-shell-9.0.1-linux-glibc2.17-x86-64bit.tar.gz 下载地址: https://downloads.mysql.com/archives/shell/ 参考 这里对这篇文章…...

鸿蒙NEXT开发-用户通知服务的封装和文件下载通知

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...

RHCE——系统的延迟任务及定时任务

延迟任务的发起 在系统中我们可以使用 at 命令来发起延迟任务 at 命令执行是调用的是 atd 服务&#xff0c;即使系统最小化安装 atd 也会被安装到系统中 at 任务信息存放在系统中 /var/spool/at 目录中 at 任务的日志文件被存放到 /var/log/cron 中 at 任务执行时如果遇…...

ForEach刷新UI机制

官网地址&#xff1a;ForEach 在ArkUI中&#xff0c;提供了ForEach循环语句&#xff0c;用来初始化一个列表数据&#xff0c;我们知道&#xff0c;当ForEach中的数组发生变化时&#xff0c;会引起UI的刷新&#xff0c;但是究竟如何变化&#xff0c;会引起UI怎样的刷新&#xf…...

机器学习(贝叶斯算法,决策树)

朴素贝叶斯分类 贝叶斯分类理论 假设现有两个数据集&#xff0c;分为两类 我们现在用p1(x,y)表示数据点(x,y)属于类别1(图中红色圆点表示的类别)的概率&#xff0c;用p2(x,y)表示数据点(x,y)属于类别2(图中蓝色三角形表示的类别)的概率&#xff0c;那么对于一个新数据点(x,y)…...

实验十三 生态安全评价

1 背景及目的 生态安全是生态系统完整性和健康性的整体反映&#xff0c;完整健康的生态系统具有调节气候净化污染、涵养水源、保持水土、防风固沙、减轻灾害、保护生物多样性等功能。维护生态安全对于人类生产、生活、健康及可持续发展至关重要。随着城市化进程的不断推进&…...

二级等保要求及设备有哪些?

《网络安全法》规定我国信息系统实际等级保护制度&#xff0c;不同等保等级要求不同&#xff1a; 二级等保&#xff08;指导保护级&#xff09;&#xff1a;等级保护对象受到破坏后&#xff0c;会对公民、法人和其他组织的合法权益产生严重损害&#xff0c;或者对社会秩序和公…...

无人机的动力系统节能——CKESC电调小课堂12

1.优化电机和螺旋桨配置 精准匹配&#xff1a;根据无人机的设计用途和负载要求&#xff0c;精确选择电机和螺旋桨。确保电机的功率、扭矩等参数与螺旋桨的尺寸、螺距等完美匹配。例如&#xff0c;对于轻型航拍无人机&#xff0c;选用功率合适的小尺寸电机搭配高效的小螺旋桨&a…...

人机打怪小游戏(非常人机)

按q攻击 按箭头进行控制 玩家是 怪是* 攻击是^ ​ ​ #include<bits/stdc.h> #include<Windows.h> #include<conio.h> #define fr(i,a,b) for(int ia;i<b;i) #define rd(a,b) rand()%(b-a1)a using namespace std; int x16,y21,dx[4]{-1,0,1,0},dy[4]{0,…...

SpringBoot 集成 Sharding-JDBC(一):数据分片

在深入探讨 Sharding-JDBC 之前&#xff0c;建议读者先了解数据库分库分表的基本概念和应用场景。如果您还没有阅读过相关的内容&#xff0c;可以先阅读我们之前的文章&#xff1a; 关系型数据库海量数据存储策略-CSDN博客 这篇文章将帮助您更好地理解分库分表的基本原理和实现…...

django-ninja 实现cors跨域请求

要在Django-Ninja项目中实现跨域&#xff08;CORS&#xff09;&#xff0c;你可以使用django-cors-headers库&#xff0c;这是一个专门用于处理跨域资源共享&#xff08;CORS&#xff09;问题的Django应用程序。以下是具体的步骤和配置&#xff1a; 安装依赖&#xff1a; 使用p…...

【论文阅读】InstructPix2Pix: Learning to Follow Image Editing Instructions

摘要&#xff1a; 提出了一种方法&#xff0c;用于教导生成模型根据人类编写的指令进行图像编辑&#xff1a;给定一张输入图像和一条书面指令&#xff0c;模型按照指令对图像进行编辑。 由于为此任务获取大规模训练数据非常困难&#xff0c;我们提出了一种生成配对数据集的方…...

常用在汽车PKE无钥匙进入系统的高度集成SOC芯片:CSM2433

CSM2433是一款集成2.4GHz频段发射器、125KHz接收器和8位RISC&#xff08;精简指令集&#xff09;MCU的SOC芯片&#xff0c;用在汽车PKE无钥匙进入系统里。 什么是汽车PKE无钥匙进入系统&#xff1f; 无钥匙进入系统具有无钥匙进入并且启动的功能&#xff0c;英文名称是PKE&…...

【第四课】rust声明式宏理解与实战

目录 前言 理解宏 实战宏 前言 上一课在介绍vector时&#xff0c;我们再一次提到了rust中的宏&#xff0c;在初始化vector时使用了vec!宏&#xff0c;当时补了一句有机会会好好说明一下rust中的宏&#xff0c;并且写一个hashmap宏来初始化hashmap。想了想一直介绍基本语法还…...

百度云服务器做网站稳定吗/宁德市委书记

在编程过程中&#xff0c;经常会遇到四种修饰符来控制访问权限。之前对这个知识点没有研究过&#xff0c;一直是一知半解&#xff0c;每次遇到问题都模棱两可&#xff0c;不能给出一个确切的答案。近几天系统的看了看&#xff0c;也有了自己的一点心得体会。 正文&#xff1a; …...

在线兼容测试网站/网页广告

点击上方“计算机视觉life”&#xff0c;选择“星标”快速获得最新干货作者李迎松授权发布&#xff0c;武汉大学 摄影测量与遥感专业 博士https://ethanli.blog.csdn.net/article/details/105065660详解立体匹配系列经典SGM: (1) 框架与类设计详解立体匹配系列经典SGM: (2) 代价…...

wordpress 响应式企业主题/如何做推广

转载自&#xff1a;http://blog.csdn.net/hello9050/article/details/7889658链接&#xff1a;http://www.oschina.net/project/tag/264/segment 开源中国社区 ‍ 1、IKAnalyzer IKAnalyzer是一个开源的&#xff0c;基于java语言开发的轻量级的中文分词工具包。从2006年12月推…...

什么网站是做电机控制的/个人怎么做百度竞价

解决 ssh 链接慢 sed -i s/GSSAPIAuthentication yes/GSSAPIAuthentication no/ /etc/ssh/sshd_config sed -i /#UseDNS yes/a\UseDNS no /etc/ssh/sshd_config /etc/init.d/sshd restart 转载于:https://www.cnblogs.com/sharesdk/p/8689027.html...

Wordpress 域名授权插件/网络营销的优化和推广方式

第 PAGE 1页共 NUMPAGES 3页华北水院高级语言程序设计(C语言)实验报告(五)-- 学年 第 学期级 专业&#xff1a; 学号&#xff1a; 姓名&#xff1a;………………………………………………………………………………………………一、实验题目&#xff1a;函数二、实验目的&#x…...

物流公司网站制作模板/建立一个企业网站需要多少钱

try catch-当try块里发生错误时&#xff0c;catch块就会被执行 finally-用来执行一些清理代码&#xff0c;无论是否有错误发生 catch块-对错误进行处理/重新抛出异常 finally块总是会被执行 可以有多个catch&#xff0c;每个catch会捕获特定类型的异常 catch子句指定了要捕获…...