杰发科技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定时器触发的简单使用
使用场景 在需要多次采样结果的情况下,比如1s需要10w次的采样结果,可以考虑使用定时器触发采样,定时器设置多少的时间就会多久采样转换一次。 再加上使用dma,采样的结果直接放在dma的数组里面。 实现了自动采样,自动…...
VTK知识学习(8)-坐标系统
1、概述 计算机图形学里常用的坐标系统有4种: 1)、Model坐标系统。定义模型时所采用的坐标系统,通常是局部的笛卡儿坐标系。 2)、World坐标系统。是放置Actor的三维空间坐标系。 Actor(vtkActor类&am…...
IO流部分串讲
一、IO流的概念简析: java将输入与输出比喻为"流",英文:Stream. 就像生活中的"电流","水流"一样,它是以同一个方向顺序移动的过程.只不过这里流动的是字节(2进制数据).所以在IO中有输入流和输出流之分,我们理解他们是连接…...
Excel——宏教程(2)
Excel——宏教程(2) 一)、处理单元格 1、直接赋值与引用 将变量、常量值直接赋给单元格、或将单元格的值直接赋给变量、常量,这是在excel中最简单的单元格赋值及引用方法。 如下例将工作表"Sheet1"A1单元格的值赋给Integer变量I,并将I1的值…...
unity 中 RectTransform 的常用几个属性
RectTransform rectTransform this.GetComponent<RectTransform>(); rectTransform this.transform as RectTransform; Vector3 vector1 rectTransform.position; //自身轴心点相对于锚点的位置(编译器显示的pos) …...
项目-摄像
树莓派摄像头使用方法 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的区别?
影像处理器是现代数字相机、手机等电子设备中极其重要的一部分,它能够对传感器采集的图像进行多种操作,从而得到更高质量的图像。常见的两种影像处理芯片有ISP(Image Signal Processor)和DSP(Digital Signal Processor…...
Ubuntu24安装配置NDK
1、下载NDK 下载压缩包,下载地址如下,建议下载LTS支持版本。 https://developer.android.google.cn/ndk/downloads?hlcs 2、解压缩 将NDK解压到指定文件夹。如:/opt 或者先解压,再移动到指定目录下。 3、配置环境变量 找到…...
【Next】中间件
概述 Next.js 的 中间件 (Middleware) 是一种在请求完成之前运行的函数,用于对入站请求进行处理和操作。它可以在路由匹配前执行逻辑,用于身份验证、请求重写、重定向、设置响应头等任务。 使用场景 身份验证:在用户访问页面前检查登录状态…...
Vulnhub靶场案例渗透[11]- Momentum2
文章目录 一、靶场搭建1. 靶场描述2. 下载靶机环境3. 靶场搭建 二、渗透靶场1. 确定靶机IP2. 探测靶场开放端口及对应服务3. 扫描网络目录结构4. 代码审计5. 反弹shell6. 提权 一、靶场搭建 1. 靶场描述 - Difficulty : medium - Keywords : curl, bash, code reviewThis wor…...
STM32设计防丢防摔智能行李箱-分享
目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着科技的不断发展,嵌入式系统、物联网技术、智能设备…...
Vue Mixin混入机制
在 Vue.js 中,Mixin(混入)是一种可复用代码的机制,用于在多个组件之间共享逻辑。通过混入,可以将通用功能提取到一个独立的文件中,然后在组件中引入并使用,而无需重复代码。 基本概念 Mixin 是…...
数据库类型建表
接着上次的数据库笔记: 初始数据库 (是博主自己写的) 1.数据库类型 1.1数值类型 数据类型大小说明对应JAVA类型BIT[(M)]M指定位数,默认值为1二进制数,M的范围从1—64,存储数值范围从0—2^M-1常用Bool…...
iOS 18 导航栏插入动画会导致背景短暂变白的解决
问题现象 在最新的 iOS 18 系统中,如果我们执行导航栏的插入动画,可能会造成导航栏背景短暂地变为白色: 如上图所示:我们分别向主视图和 Sheet 弹出视图的导航栏插入了消息,并应用了动画效果。可以看到,前者的导航栏背景会在消息插入那一霎那“变白”,而后者则没有任何…...
深度学习之人脸检测
在目标检测领域可以划分为了人脸检测与通用目标检测,往往人脸这方面会有专门的算法(包括人脸检测、人脸识别、人脸其他属性的识别等等),并且和通用目标检测(识别)会有一定的差别,着主要来源于人…...
解决前后端发版本时候,手动清除浏览器缓存
在.html页面中添加标签 后端配置nginx,让index.html不缓存 location /index.html { add_header Cache-Control “no-cache, no-store”; }在vite.config.ts中添加 rollupOpyions: { output: { // 输出编译后的文件名称:【文件名称.时间戳】、【文件名称.版本号.…...
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开发-用户通知服务的封装和文件下载通知
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...
RHCE——系统的延迟任务及定时任务
延迟任务的发起 在系统中我们可以使用 at 命令来发起延迟任务 at 命令执行是调用的是 atd 服务,即使系统最小化安装 atd 也会被安装到系统中 at 任务信息存放在系统中 /var/spool/at 目录中 at 任务的日志文件被存放到 /var/log/cron 中 at 任务执行时如果遇…...
ForEach刷新UI机制
官网地址:ForEach 在ArkUI中,提供了ForEach循环语句,用来初始化一个列表数据,我们知道,当ForEach中的数组发生变化时,会引起UI的刷新,但是究竟如何变化,会引起UI怎样的刷新…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
