【N32L40X】学习笔记11-ADC规则通道采集+dma数据传输

news2024/11/28 2:28:49

ADC规则通道转换

概述

  • 支持 1 个 ADC,支持单端输入和差分输入,最多可测量 16 个外部和 3 个内部源。
  • 支持 12 位、10 位、8 位、6 位分辨率。
  • ADC 时钟源分为工作时钟源、采样时钟源和计时时钟源
    • 仅可配置 AHB_CLK 作为工作时钟源
    • 可配置 PLL 作为采样时钟源,最高可到 64MHz,支持分频 1,2,4,6,8,10,12,16,32,64,128,256。
    • 可配置 AHB_CLK 作为采样时钟源,最高可到 64MHz,支持分频 1,2,4,6,8,10,12,16,32。
    • 计时时钟用于内部计时功能,频率必须配置成 1MHz
  • 支持触发采样,包括 EXTI/TIMER。
  • 各通道的采样时间间隔可编程
  • ADC 的工作电压在 1.8V 到 3.6V 之间。
  • ADC 支持转换的电压在 VREF-和 VREF+之间。
  • 内部通道支持 TempSensor、VREFINT(内部 1.2V BG)、VREFBUFF(2.048V)
  • 支持内部参考电压(2.048V)
  • 注入通道最多4个
  • 规则通道最多16个

时钟

在这里插入图片描述

内部通道

  • 温度传感器和通道 ADC_IN17 相连接。
  • VREFINT 和通道 ADC_IN0 相连接。
  • VREFBUFF和 ADC_IN18 相连接。
  • VOP1(运放)OUT输出和通道 ADC_IN3 相连接。
  • VOP2(运放)OUT输出和通道 ADC_IN7 相连接。

单次采集就是每次采集一个通道

连续采集就是采集这个规则组或注入组

扫描模式就是一轮接着一轮的扫描,扫描模式就是讲一个规则组转换完成后,又进行下一轮转换,注入组不支持扫描模式

模拟看门狗

  • 模拟看门狗的高阈值

  • 模拟看门狗的低阈值

  • 当 ADC 转换的值高于模拟看门狗的高阈值或低于模拟看门狗的低阈值时,如果 ADC_CTRL1.AWDGIEN 已配置,则模拟看门狗标志 (ADC_STS.AWDG) 将 被 置 为 1 , 此 时 会 产 生 中 断

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ozJtAUS-1689953222576)(./picture/image-20230718190636870.png)]

间断模式

规则组:每次触发后转换 n 个通道

注入组:每次触发后转换 1个通道

实例

使用规则通道+dma数据传输+连续转换+软件触发

bsp_adc_regular.h

#ifndef _BSP_ADC_H_
#define _BSP_ADC_H_

#include <stdint.h>
#include "n32l40x.h"

typedef struct{
		GPIO_Module* gpiox;
		uint16_t pin;
		uint8_t adc_ch;
 
 }adc_ch_t;
 typedef enum 
 {
	 AIR_PRESS,//气压值
	 BATTERY,//电池电压
	 ADC_CH_NUM
 }ADC_ID;
/**
 *  adc 相关的gpio初始化
 */
void bsp_adc_init(void);
/*
	获取adc的采样值
	返回:0xff,参数错误
*/
uint16_t bsp_adc_get_value(ADC_ID id);

#endif


bsp_adc_regular.c

#include"adc/bsp_adc.h"



adc_ch_t adc_chanles[ADC_CH_NUM]= {
    {GPIOA,GPIO_PIN_3,ADC_CH_4_PA3},
    {GPIOA,GPIO_PIN_4,ADC_CH_5_PA4},
};

static uint16_t ADCConvertedValue[ADC_CH_NUM];

/*
	获取adc的采样值
	返回:0xff,参数错误
*/
uint16_t bsp_adc_get_value(ADC_ID id)
{
    if(id<ADC_CH_NUM)
    {
        return ADCConvertedValue[id];
    }
    else
    {
        return 0xffff;
    }
}

//配置dma通道
static void bsp_adc_dma_config(void)
{
    DMA_InitType DMA_InitStructure;

    RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_DMA, ENABLE);

    DMA_DeInit(DMA_CH1);
    DMA_InitStructure.PeriphAddr     = (uint32_t)&ADC->DAT;
    DMA_InitStructure.MemAddr        = (uint32_t)ADCConvertedValue;
    DMA_InitStructure.Direction      = DMA_DIR_PERIPH_SRC;
    DMA_InitStructure.BufSize        = ADC_CH_NUM;//adc传输数量
    DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
    DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;
    DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;
    DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;
    DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
    DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;
    DMA_Init(DMA_CH1, &DMA_InitStructure);
    DMA_RequestRemap(DMA_REMAP_ADC1, DMA, DMA_CH1, ENABLE);

    /* Enable DMA channel1 */
    DMA_EnableChannel(DMA_CH1, ENABLE);


    /* Enable ADC DMA */
    ADC_EnableDMA(ADC, ENABLE);
}



/**
 * @brief  adc 相关的gpio初始化
 */
static void bsp_adc_gpio_config(adc_ch_t *padc)
{
    if(padc->gpiox==GPIOA)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
    }
    else if(padc->gpiox==GPIOB)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
    }
    if(padc->gpiox==GPIOC)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC, ENABLE);
    }
    if(padc->gpiox==GPIOD)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOD, ENABLE);
    }

    GPIO_InitType GPIO_InitStructure;

    GPIO_InitStruct(&GPIO_InitStructure);
    /* Configure PC.02 (in12)as analog input -------------------------*/
    GPIO_InitStructure.Pin       = padc->pin;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Analog;
    GPIO_InitPeripheral(padc->gpiox, &GPIO_InitStructure);
}


/**
 * @brief   adc初始化
 */
void bsp_adc_init()
{
    ADC_InitType ADC_InitStructure;


    /* adc 时钟初始化*/
    RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_ADC, ENABLE);
    ADC_ConfigClk(ADC_CTRL3_CKMOD_AHB, RCC_ADCHCLK_DIV16);
    RCC_ConfigAdc1mClk(RCC_ADC1MCLK_SRC_HSE, RCC_ADC1MCLK_DIV8);  //selsect HSE as RCC ADC1M CLK Source

    /* GPIO 配置 */
    for(int i=0; i<ADC_CH_NUM; i++)
    {
        bsp_adc_gpio_config(adc_chanles+i);
    }
    ADC_DeInit(ADC);
    /* adc基本参数配置*/
    ADC_InitStructure.MultiChEn      = ENABLE;
    ADC_InitStructure.ContinueConvEn = ENABLE; //持续转换
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIGCONV_NONE; //ADC触发选择
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = ADC_CH_NUM;//adc规则通道数量
    ADC_Init(ADC, &ADC_InitStructure);

    //DMA相关的配置
    bsp_adc_dma_config();

    /* ADC1 规则通道配置 */
    for(int i=0; i<ADC_CH_NUM; i++)
    {
        ADC_ConfigRegularChannel(ADC, adc_chanles[i].adc_ch, i+1, ADC_SAMP_TIME_71CYCLES5);
    }

    /* 使能 ADC */
    ADC_Enable(ADC, ENABLE);
    /* Check ADC Ready */
    while(ADC_GetFlagStatusNew(ADC,ADC_FLAG_RDY) == RESET)
        ;
    /* 开始标定ADC */
    ADC_StartCalibration(ADC);
    /* 等待ADC标定结束 */
    while (ADC_GetCalibrationStatus(ADC))
        ;

    /* 软件启动ADC转换*/
    ADC_EnableSoftwareStartConv(ADC, ENABLE);


}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【安全】Sqllabs(1-4) 多种情况浅析

目录 环境⭐ 先要 ⭐⭐⭐⭐⭐ Less - 1 (information_shcema) Less - 2 (假设没有information_schema) Less - 3 (无列名注入) Less - 4 环境⭐ MySQL8.0.12 Nginx1.15.11 先要 ⭐⭐⭐⭐⭐ MySQL5.0以上有这几个数据库mysql, sys&#xff0c;information_schema informa…

前端性能优化——图片优化

一、图片优化措施 优化图片是 Web 前端优化的重要一环&#xff0c;因为图片是 Web 页面中最耗费带宽和加载时间的资源之一。以下是一些通过优化图片来优化 Web 前端的方法&#xff1a; 压缩图片&#xff1a;压缩图片可以减少图片的文件大小&#xff0c;从而减少加载时间。 使…

【数学建模】相关是一个距离指标吗?

一、说明 本文探讨最平凡的数学模型--距离模型。我们知道&#xff0c;任何数学模型如果是个距离模型&#xff0c;那么它是&#xff1a;放心的、自动的、不加任意条件的指标项目。然而另一些度量参数不是距离空间&#xff0c;因此&#xff0c;使用起来必须外加若干条件&#xff…

苹果iOS 16.6 RC发布:或为iPhone X/8系列养老版本

今天苹果向iPhone用户推送了iOS 16.6 RC更新(内部版本号&#xff1a;20G75)&#xff0c;这是时隔两个月的首次更新。 按照惯例RC版基本不会有什么问题&#xff0c;会在最近一段时间内直接变成正式版&#xff0c;向所有用户推送。 需要注意的是&#xff0c;鉴于iOS 17正式版即将…

【CN-Docker】window11下Docker下开启kubernetes

1. 安装Docker 安装docker步骤如下&#xff1a; 下载Docker启用hyper-v 2.1.powershell&#xff0c;管理员运行Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All安装wsl配置Docker镜像加速地址(阿里云) 4.1. "registry-mirrors": [&quo…

Qt/C++音视频开发48-推流到rtsp服务器

一、前言 之前已经打通了rtmp的推流&#xff0c;理论上按照同样的代码&#xff0c;只要将rtmp推流地址换成rtsp推流地址&#xff0c;然后格式将flv换成rtsp就行&#xff0c;无奈直接遇到协议不支持的错误提示&#xff0c;网上说要换成rtp&#xff0c;换了也没用&#xff0c;而…

C++之mutable关键字实例(一百六十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【C++链表】

目录 前言一、搭建链表实现的框架二、链表的构造函数三、链表的尾插四、链表的遍历(重点)迭代器的遍历const修饰的迭代器 五、代码实现 前言 最近用C写了一下list的基本功能&#xff0c;感触颇深。本以为会跟之前用C写list一样会很轻松&#xff0c;没想到更难了。要考虑的东西…

【数据结构】C--单链表(小白入门基础知识)

前段时间写了一篇关于顺序表的博客&#xff0c;http://t.csdn.cn/0gCRp 顺序表在某些时候存在着一些不可避免的缺点: 问题&#xff1a; 1. 中间 / 头部的插入删除&#xff0c;时间复杂度为 O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不…

第110天:免杀对抗-GOC#反VT沙盒逆向调试参数加载资源分离混淆加密

知识点 #知识点&#xff1a; 1、C#-混淆&分离&反调试 2、GO-混淆&分离&反调试 3、成品程序-包含反调试VT#章节点&#xff1a; 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修改 程序文件面-加壳…

Progressive Dual-Branch Network for Low-Light Image Enhancement 论文阅读笔记

这是22年中科院2区期刊的一篇有监督暗图增强的论文 网络结构如下图所示&#xff1a; ARM模块如下图所示&#xff1a; CAB模块如下图所示&#xff1a; LKA模块其实就是放进去了一些大卷积核&#xff1a; AFB模块如下图所示&#xff1a; 这些网络结构没什么特别的&#xf…

【团队协作开发】将Gitee项目导入到本地IDEA中出现根目录不完整的问题解决(已解决)

前言&#xff1a;在团队协作开发过程中&#xff0c;通常我们的Gitee完整项目中会包含很多内容&#xff1a;后端代码、前端代码、项目结构图、项目文档等一系列资产。 将Gitee项目导入到本地IDEA中&#xff0c;通常会出现根目录不完整的问题。这是因为项目里面包含了后端代码、前…

Matlab的GUI设计

文章目录 AppDesigner各个版本的特点mlapp文件基本格式AppDesigner的回调函数常见控件的属性MVC模式MVC模式设计GUIMVC简单使用 其他让app designer置顶将Guide的GUI导出为m文件将app编译为exe将app中的多个控件组合在一起 AppDesigner 20200328 各个版本的特点 在2017b版本中…

用 Node.js 手写 WebSocket 协议

目录 引言 从 http 到 websocekt 的切换 Sec-WebSocket-Key 与 Sec-WebSocket-Accept 全新的二进制协议 自己实现一个 websocket 服务器 按照协议格式解析收到的Buffer 取出opcode 取出MASK与payload长度 根据mask key读取数据 根据类型处理数据 frame 帧 数据的发…

【C++模拟实现】string的模拟实现

【C模拟实现】string的模拟实现 目录 【C模拟实现】string的模拟实现string模拟实现的标准代码string模拟实现中的要点string构造函数的实现赋值运算符重载迭代器的实现对流插入和流提取运算符的重载find函数的实现insert函数的实现 作者&#xff1a;爱写代码的刚子 时间&#…

MySQL视图概念及作用、操作语法

1.什么是视图 在数据库中有一些用户的敏感数据字段不方便展示&#xff0c;需要隐藏时&#xff0c;这时候就可以利用视图这个概念来实现。 2.视图操作 如何对视图里的数据进行增删改操作呢&#xff1f; 可以直接通过insert语句向视图里面插入数据&#xff0c;语法和向表里插…

移动测试(二)

功能测试点 用户使用习惯 权限问题 硬件问题 比如双卡双待、摄像头、GPU等。 操作习惯 用户常用的有菜单键、Home键、返回键、Home键长按&#xff08;显示当前进程列表&#xff09;、调整音量、待机等。相应的作为测试工程师我们需要考虑的项就变成了&#xff1a; • 应用中的…

Docker——基本管理

Docker 基本管理 Docker——基本管理 一、Docker 概述1.Docker的设计理念2.容器的优势3.Docker与虚拟机的区别4.容器在内核中支持2种重要技术5.Docker核心概念5.1 镜像5.2 容器5.3 仓库 二、安装 Docker1.关机防火墙2.安装依赖包3.设置阿里云镜像源4.安装 Docker-CE并设置为开…

PostgreSQL 的事务管理和并发控制机制解析

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Istio Pilot源码学习(三):xDS的异步分发

本文基于Istio 1.18.0版本进行源码学习 5、xDS的异步分发 DiscoveryService主要包含下述逻辑&#xff1a; 启动GRPC Server并接收来自Envoy端的连接请求接收Envoy端的xDS请求&#xff0c;从ConfigController和ServiceController中获取配置和服务信息&#xff0c;生成响应消息…