GD32F103使用DMA方式实现ADC0数据循环采集

2023-11-10

  1. 选择合适的DMA通道
    ADC0使用ch0
    在这里插入图片描述
/*!
    \brief      configure the DMA peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void dma_config(void)
{
    /* ADC_DMA_channel configuration */
    dma_parameter_struct dma_data_parameter;
 
    /* enable DMA0 clock */
    rcu_periph_clock_enable(RCU_DMA0);  
  
    /* ADC DMA_channel configuration */
    dma_deinit(DMA0, DMA_CH0);
    
    /* initialize DMA data mode */
    dma_data_parameter.periph_addr  = (uint32_t)(&ADC_RDATA(ADC0));
    dma_data_parameter.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
    dma_data_parameter.memory_addr  = (uint32_t)(&adc_value);
    dma_data_parameter.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
    dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
    dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;  
    dma_data_parameter.direction    = DMA_PERIPHERAL_TO_MEMORY;
    dma_data_parameter.number       = 100;		
    dma_data_parameter.priority     = DMA_PRIORITY_ULTRA_HIGH;
    dma_init(DMA0, DMA_CH0, &dma_data_parameter);

    dma_circulation_enable(DMA0, DMA_CH0);	//采集完100个之后,循环
    
    /* enable DMA transfer complete interrupt */
    dma_interrupt_enable(DMA0, DMA_CH0, DMA_INT_FTF);	//打开全部完成中断
    dma_interrupt_enable(DMA0, DMA_CH0, DMA_INT_HTF);	//打开一半完成中断
  
    /* enable DMA channel */
    dma_channel_enable(DMA0, DMA_CH0);
    
    nvic_irq_enable(DMA0_Channel0_IRQn, 0, 0);
}

/*!
    \brief      configure the TIMER peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void timer1_config(void)	//1ms采集一次
{
    timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;

    /* enable timer1 clock */
    rcu_periph_clock_enable(RCU_TIMER1);
  
    /* TIMER1 configuration */
    timer_initpara.prescaler         = 107;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 999;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER1,&timer_initpara);

    /* CH0 configuration in PWM mode1 */
    timer_ocintpara.ocpolarity  = TIMER_OC_POLARITY_HIGH;
    timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
    timer_channel_output_config(TIMER1, TIMER_CH_1, &timer_ocintpara);

    timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, 499);
    timer_channel_output_mode_config(TIMER1, TIMER_CH_1, TIMER_OC_MODE_PWM1);
    timer_channel_output_shadow_config(TIMER1, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE);
}

/*!
    \brief      configure the ADC peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void adc_config(void)
{
    /* enable ADC0 clock */
    rcu_periph_clock_enable(RCU_ADC0);
   /* reset ADC */
    adc_deinit(ADC0);
    /* ADC mode config */
    adc_mode_config(ADC_MODE_FREE); 
    /* ADC continous function enable */
    adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE); 
 
    /* ADC data alignment config */
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
    /* ADC channel length config */
    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);
  
  
    /* ADC regular channel config */
    adc_regular_channel_config(ADC0, 0, AD0_CH, ADC_SAMPLETIME_55POINT5);

    /* ADC trigger config */
    adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_T1_CH1);
        /* ADC external trigger enable */
    adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);

    /* enable ADC interface */
    adc_enable(ADC0);  
    delay_1ms(1);
    /* ADC calibration and reset calibration */
    adc_calibration_enable(ADC0);  

    /* ADC DMA function enable */
    adc_dma_mode_enable(ADC0);
}

/*!
    \brief      this function handles DMA_Channel3_IRQHandler interrupt
    \param[in]  none
    \param[out] none
    \retval     none
*/
void DMA0_Channel0_IRQHandler(void)
{
  if(dma_interrupt_flag_get(DMA0, DMA_CH0, DMA_INT_FLAG_FTF))
  {     
    dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_INT_FLAG_FTF);
//    dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_INT_FLAG_G);
   
  }
  else if(dma_interrupt_flag_get(DMA0, DMA_CH0, DMA_INT_FLAG_HTF))
  {
    dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_INT_FLAG_HTF);
//    dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_INT_FLAG_G);
    dmaHalfIntCnt ++;
//    uart_dma_start();

  }
}

void dma_start(void)
{
  timer1_config();
  dma_config();
  adc_config();
  /* enable TIMER1 */
  timer_enable(TIMER1);

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GD32F103使用DMA方式实现ADC0数据循环采集 的相关文章

  • @apinote_新的Javadoc标签@ apiNote,@ implSpec和@implNote

    apinote 如果您已经在使用Java 8 则可能会看到一些新的Javadoc标签 apiNote implSpec和 implNote 他们怎么了 如果要使用它们 该怎么办 总览 该帖子将快速查看标签的来源和当前状态 然后 它将解释它们
  • R语言中基本图形的绘制

    条形图 简单的垂直条形图和水平条形图 函数barplot gt library vcd 载入需要的程辑包 grid gt counts lt table Arthritis Improved gt counts None Some Mark
  • matlab插值:拉格朗日插值

    拉格朗日插值即对所要插值的函数进行拉格朗日多项式拟合 这是matlab插值系列的第二期 第一期 数值分析拟合 Matlab三次样条插值拟合数据 以后会有时间的时候再更新更多的插值方法 这篇文章我推导过程参考过了一些其他文章 代码是自己写的
  • HTML5滑动(swipe)事件,移动端触摸(touch)事件

    目有个交互需要实现手指滑动的交互 pc端使用mousedown mousemove mouseup监听实现 但在ios设备上mousemove是不好监听的 同类的方法是touchstart touchmove touchend 项目需求 需
  • 快速搞懂无偏估计及样本方差中的n-1

    期望EX 方差DX 我们知道任一样本和总体是同分布的 所以任一样本的期望即总体期望 均值 任一样本的方差即总体方差 所以对于任一样本X 有 E X E
  • 移动支付行业发展和商业模式迭代孕育新商机

    在短短十几年的时间当中 PC互联网 移动互联网 以及风头正盛的物联网所引发的三次技术浪潮彻底颠覆了人们沿袭数千年的交易支付模式 也让交易介质从实物货币 到数字流转 再到如今更为便捷和安全的刷脸支付 这便是科技改变社会 成为第一生产力的缩影
  • QTabWidget移除部分分页的方法

    1 将各分页保存起来 QList
  • Hands-On Hyperledger Fabric——Byzantine-fault tolerant(BFT)过程详解

    文章目录 拜占庭问题描述 分布式架构遭遇的问题 Practical Byzantine Fault Tolerance PBFT PBFT过程详解 拜占庭问题描述 拜占庭将军问题是分布式计算中的一个经典问题 拜占庭将军问题是Leslie L
  • http协议各个版本

    一 HTTP协议版本更替 http 0 9 1991 原型版本 功能简陋 只有一个命令GET GET index html 服务器只能回应HTML格式字符 串 不能回应别的格式 http 1 0 每个TCP连接只能发送一个请求 发送数据完毕
  • osgEarth的Rex引擎原理分析(六)earth文件如何解析成Config

    目标 解决 一 中的问题 构建地图节点的依据是Config osgEarthDrivers earth EarthFileSerialize2 cpp osg Node EarthFileSerializer2 deserialize co
  • 13. 实战:XPath法抓取某网站外包信息

    目录 前言 思路 代码实现 第一步 先获取页面源代码 第二步 交给XPath的HTML解释器进行解析 第三步 通过源代码检查并获取XPath路径 第四步 创建csv文件 准备写入数据 第五步 遍历所有的div 获取我们需要的信息 完整代码
  • linux:ubuntu mysql 、redis和Mongodb安装

    1 安装mysql sudo apt update sudo apt install mysql server 验证MySQL服务器正在运行 sudo systemctl status mysql 保护MySQL 安装随附一个名为的脚本my
  • 基于KOS系统超详细Aircrack-ng安装保姆级教程

    目录 1 概述 2 安装准备 2 1 操作系统环境 2 2 软件版本 3 安装运行 3 1 安装编译环境 3 2 获取Aircrack ng源码包 3 3 编译Aircrack ng 3 4 运行Aircrack ng 1 概述 浪潮信息K
  • 一些时序计算题

    最近在持续笔试中 今天见的题感觉难度又上升了 因此需要计算一下 首先来看一下题目 已知 输入延时 T in delay 1ns Inverter的延时 T inv max 1ns T inv min 0 5ns Buffer的延时 T bu
  • yolov2检测网数据集获取与预处理_采集健康和非健康猫狗数据

    yolov2检测网数据集获取与预处理 采集健康和非健康猫狗数据 一 网上公开数据集 二 获取并预处理数据集 2 1 获取非健康的猫狗数据 2 2 剔除重复的猫狗数据 2 3 淘宝购买猫狗救助视频 2 4 批量重命名猫狗 2 5 图像数据下采
  • PHP本地环境搭配——WAMP不能启动, 一直处于红色图标或者橙色图标的解决办法

    WAMP不能启动 一直处于红色图标 正常启动为绿色吧 考虑是端口的问题 我找到wamp文件夹中的wamp bin apache apache2 2 22 conf路径下的httpd conf文件 将 Listen 12 34 56 78 8
  • windows下进入DOS命令无法切换目录

    问题呈现 运行 gt cmd gt cd E redis redis2 8 此时无法切换指定目录 E redis redis2 8 解决办法 1 运行 gt cmd gt E 2 回车
  • JavaScript一次替换字符串中多个

    问题 在JavaScript中对字符串替换时可能出现想要替换的字符串strB在原字符串strA中出现多次 而string replace方法只能替换一个字符串strB 解决方法 多次使用replace替换 使用replace 正则表达式替换
  • Rust 编程: 条件编译-Features

    Rust 编程 条件编译 Features Rust 支持条件编译 可通过两种不同的操作实现 cfg 属性 在属性位置中使用 cfg cfg 宏 在布尔表达式中使用 cfg 根据操作系统引用不同文件的相同模块 cfg attr target

随机推荐

  • java-在数组中,用二分法查找一个数。返回下标,找不到则返回-1。

    编写程序 完成下列功能 1 输入 20 个整数到数组中 2 对 20 个数按从大到小的顺序排序 输出排序后的数组 3 输入一个整数 x 4 在数组中 用二分法查找 x 如果找到了输出 x 在数组中的下标 找不到输出 1 package la
  • python Image模块基本语法

    Python Image 基本的图像处理操作 有需要的朋友可以参考下 Python 里面最常用的图像操作库是 Image library PIL 功能上 虽然还不能跟Matlab比较 但是还是比较强大的 废话补多少 写点记录笔记 1 首先需
  • Power BI /Power BI Pro账户等基本概念介绍

    视频内容 Power BI 的基本概念 Power BI 的概念 Power BI 是一种商业分析解决方案 可帮助对数据进行可视化 共享可视化报表 或将报表嵌入应用或网站中 Microsoft Power BI 是一系列的软件服务 应用和连
  • 组件封装

    基本用法 在使用 vue cli 创建的项目中 组件的创建非常方便 只需要新建一个 vue 文件 然后在 template 中写好 HTML 代码 一个简单的组件就完成了 一个完整的组件 除了 template 以外 还有 script和
  • Cannot find module ‘@/views/test/index.vue‘ or its corresponding type declarations.ts(2307)的原因

    在Vue的TypeScript项目中 使用const test gt import views test index vue 语法动态导入模块时 可能会出现类型声明文件找不到的错误 这是由于TypeScript无法正确解析动态导入的路径而导
  • 五线舵机驱动程序_16路舵机驱动板程序使用说明

    用Arduino类库驱动舵机并不是一件难事 如果需要驱动很多电机 就需要要占用更多的引脚 也会影响到Arduino的处理能力 专门的舵机驱动板很好的解决了这个问题 此舵机驱动板使用PCA9685芯片 是16通道12bi tPWM舵机驱动 用
  • 2020年“泰迪杯”数据分析职业技能大赛A 题优秀报告:教育平台的线上课程智能推荐策略

    摘要 近年来 随着互联网与通信技术的高速发展 学习资源共享与建设呈现出新的发展趋势 多样化的线上教育平台如雨后春笋般争相涌入大众视野 尤其是在今年年初 受新冠肺炎疫情的冲击下 学生返校进行线下授课收到严重阻碍 由此 网络线上平台由此成为 互
  • 字节跳动精准测试实践,SmartEye背后的设计逻辑

    简介 在移动互联网高度发展下 移动APP趋近于大型化 功能也趋近于复杂化 诸如各种国民级应用 功能 玩法等迭代不停 其背后对应的研发协作团队也非常庞大 在此种场景下 依靠人力堆叠去保障产品质量 并非最优解 在软件规模达到某个临界点之后 问题
  • [论文] LIMA: Less Is More for Alignment

    文章目录 概要内容 关键方法 高质量样本获取 模型评估方法 结论 思考 Meta新模型LIMA 基于LLaMa 65B 精选1000个微调样本进行训练 对比GPT 4 Bard DaVinci003 表现出强大的性能 结果表明 大语言模型中
  • 程序员mac开发环境配置

    拿了一台新的macbook pro 作为一个程序员 我把自己的开发环境给贴出来 1 输入法 先把苹果的系统自带的中文输入法 换成自己习惯的搜狗输入法 2 略 3 jdk 7u71 直接下载dmg文件安装 4 git 在terminal中 直
  • 中国职场女性领导者专题访谈

    导读 书写中国职场女性领导者并不容易 一不小心就会落入成功学后验主义窠臼 狭隘单一的价值评判 亦或是隐形性别偏见 但我们还是坚定地提笔 因为每一位女性领导者的成长历程 无论高光时刻还是黑暗片段 都会通过文字与读者产生连接 为其带来启示 而我
  • 服务器计算机性能测试,服务器平台计算性能工具Linpack服务器性能测试利器_一_.pdf...

    服务器平台计算性能工具Linpack服务器性能测试利器 一 pdf 产 品 技 术 服务器平台 文 赵吉志 计算性能工具Linpack 服务器性能测试利器 一 计算机硬件的不断升级带来了系统处理性能的持续提高 如何对平台的性能作出正确的判断
  • Linux基础(命令学习) ———从入坑到放弃1.0

    Linux文件 一 系统层次图 Linux文件类型 在Linux中一切都是文件 但文件都得有类型 shell 对命令的解释 cd pwd 查看当前的工作目录 Is 列表显示目录内容 alias 设置别名 du 统计目录及文件空间占用情况 m
  • SpringBoot的基本使用

    SpringBoot 目录 SpringBoot 一 SpringBoot简介 1 什么是SpringBoot 2 SpringBoot的优点 3 SpringBoot的缺点 二 SpringBoot的创建方式 1 基于官网的Initial
  • 【vue运行报错】There are multiple modules with names... 报错原因和解决办法

    项目场景 There are multiple modules with names that only differ in casing 项目运行时候报错如下 There are multiple modules with names t
  • Python中的__init__.py的高级用法

    刚开始学习编程 我们很少会关注这个文件 只知道一个目录中存在该文件 该目录就是一个package 不存在就是普通的目录 普通的目录在导入包时 pycharm并不会智能提示 Python中每新建一个package都会默认生成一个 init p
  • (一)app自动化测试环境搭建(mac+ios+airtest )

    环境搭建的效果如下 IOS手机屏幕显示Automation Running 电脑端airtest设备窗口上可以看到手机屏幕 以下是在mac电脑的搭建过程 只演示连接IOS真机部分 安卓机较为简单暂时省略 1 APP自动化测试工具介绍 Air
  • 半监督目标检测

    有监督目标检测 拥有大规模带标签的数据 包括完整的实例级别的标注 即包含坐标和类别信息 弱监督目标检测 数据集中的标注仅包含类别信息 不包含坐标信息 如图一 b 所示 弱半监督目标检测 数据集中拥有部分实例级别的标注 大量弱标注数据 模型希
  • MCU刷写

    1 个人电脑安装python2 7 2 用调试线连接个人电脑与控制器 3 控制器断电 数秒后上电 4 bootload2 py update s19两个文件放在一个文件夹内 5 ubuntu系统下 在当前文件夹下打开终端 输入 chmod
  • GD32F103使用DMA方式实现ADC0数据循环采集

    选择合适的DMA通道 ADC0使用ch0 brief configure the DMA peripheral param in none param out none retval none void dma config void AD