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

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);


}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【大数据之Flume】三、Flume进阶之Flume Agent 内部原理和拓扑结构

1 Flume事务 2 Flume Agent 内部原理 重要组件&#xff1a; 1、ChannelSelector&#xff08;选择器&#xff09;   ChannelSelector 的作用就是选出 Event 将要被发往哪个 Channel。   &#xff08;1&#xff09;Replicating ChannelSelector&#xff08;复制或副本&#x…

【面试题】芯片中的IR drop现象是什么?

这里是尼德兰的喵芯片面试相关文章,欢迎您的访问! 如果文章对您有所帮助,期待您的点赞收藏,也欢迎您对文中存在的问题和疑惑进行评论 此外,gitee仓库尼德兰的喵 (gjm9999) - Gitee.com与微信公众平台也期待您的访问 让我们一起为芯片前端全栈工程师而努力!!!! 今天突然…

C++模拟实现stack

1.前言 stack 遵循的原则是先进后出&#xff0c;那到底是用list 还是 vector呢&#xff1f;其实都可以&#xff0c;但是队列queue就不一样了&#xff0c;他甚至不可以支付vector&#xff0c;因为效率太低了。 但是库里面用了一种新的类型&#xff0c;deque&#xff0c;它的实现…

实战项目——基于多设计模式下的同步异步日志系统

系列文章目录 1.项目介绍 2.相关技术补充 3.日志系统框架 4.代码设计 5.功能测试 6.性能测试 文章目录 目录 系列文章目录 1.项目介绍 2.相关技术补充 3.日志系统框架 4.代码设计 5.功能测试 6.性能测试 文章目录 前言 一、项目介绍 二、开发环境 三、核心技…

BTTES,2101505-88-6,是各种化学生物实验中生物偶联的理想选择

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 规格单位&#xff1a;g |货期&#xff1a;按照具体的库存进行提供 | 纯度&#xff1a;95% PART1----​试剂描述&#xff1a; BTTES是铜&#xff08;I&#xff09;催化的叠氮化物-炔烃环加成&#xff08;CuAAC&#x…

佰维存储面向旗舰智能手机推出UFS3.1高速闪存

手机“性能铁三角”——SoC、运行内存、闪存决定了一款手机的用户体验和定位&#xff0c;其中存储器性能和容量对用户体验的影响越来越大。 针对旗舰智能手机&#xff0c;佰维推出了UFS3.1高速闪存&#xff0c;写入速度最高可达1800MB/s&#xff0c;是上一代通用闪存存储的4倍以…

机器学习实战11-基于K-means算法的文本聚类分析,生成文本聚类后的文件

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍机器学习实战11-基于K-means算法的文本聚类分析&#xff0c;生成文本聚类后的文件。文本聚类分析是NLP领域的一个核心任务&#xff0c;通过将相似的文本样本分组&#xff0c;可以帮助我们发现隐藏在文本数据中的模式和结…

springboot运行报错Failed to load ApplicationContext for xxx

Failed to load ApplicationContext for报错解决方法 报错Failed to load ApplicationContext for 报错Failed to load ApplicationContext for 网上找了一堆方法都尝试了还是没用 包括添加mapperScan&#xff0c;添加配置类 配置pom文件 [外链图片转存失败,源站可能有防盗链机…

前端技术搭建(动态图片)拖拽拼图!!(内含实现原理)

文章目录 前端技术搭建&#xff08;动态图片&#xff09;拖拽拼图(内含实现原理)导言功能介绍效果演示链接&#xff08;觉得不错的&#xff0c;请一键三连嘤嘤嘤&#xff09;项目目录页面搭建css样式设置工具函数游戏实现逻辑 开源地址总结 前端技术搭建&#xff08;动态图片&a…

数据结构【排序】

第七章 排序 一、排序 1.定义&#xff1a;将无序的数排好序 &#xff1b; 2.稳定性&#xff1a; Kᵢ和Kⱼ中&#xff0c;Kᵢ优先于Kⱼ那么在排序后的记录中仍然保持Kᵢ优先&#xff1b; 3.评价标准&#xff1a;执行时间和所需的辅助空间&#xff0c;其次是算法的稳定性&#xf…

不用科学操作!Google Play谷歌商店App下载使用小技巧,超详细指南

昨天文章发出后&#xff0c;有朋友在群里说&#xff0c;不如出个如何使用谷歌商店的教程。 注&#xff1a;谷歌商店、Google Play、Play商店均表示同一个APP&#xff0c;只是叫法不同而已。 我发现这是一个艰难的任务&#xff0c;受限于手机品牌及操作系统版本&#xff0c;即使…

【C语言】文件操作(二)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3; 目录 &#x1f4cc;补充1.sprintf2.…

Android NDK工具使用

快速定位到NDK安装目录 打开你的 .bash_profile vim &#xff5e;/.bash_profile 设置ndk的环境变量 ANDROID_HOME"/Users/xxxx/Library/Android/sdk" export NDK${PATH}:${ANDROID_HOME}/ndk/21.3.6528147 //这个就是你的快捷指令 alias ndkalias ndk${ANDROID_…

安装支持vs2019的MFC(解决MSBuild 错误 MSB8041、MSB8042)

安装支持MFC的vs2019&#xff08;解决MSBuild 错误 MSB8041、MSB8042&#xff09; 常用安装选项解决MSBuild 错误 常用安装选项 解决MSBuild 错误 安装上述勾选内容后&#xff0c;即可解决MSBuild 错误 MSB8041 MSB8041&#xff1a;此项目需要 MFC/ATL 库。 https://learn.mic…

力扣算法 704 35 34 69 367二分查找

704.二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 二分查找法 class Solution { public:int search(vecto…

Langchain 和 Chroma 的集成

Langchain 和 Chroma 的集成 1. Chroma2. 基本示例​3. 基本示例(包括保存到磁盘)4. 将 Chroma Client 传递到 Langchain ​5. 基本示例(使用 Docker 容器)6. 更新和删除7. 带分数的相似性搜索​ 1. Chroma Chroma 是一个人工智能原生开源矢量数据库&#xff0c;专注于开发人员…

Linux Ubuntu crontab 添加错误 提示:no crontab for root - using an empty one 888

资料 错误提示&#xff1a; no crontab for root - using an empty one 888 原因剖析&#xff1a; 第一次使用crontab -e 命令时会让我们选择编辑器&#xff0c;很多人会不小心选择默认的nano&#xff08;不好用&#xff09;&#xff0c;或则提示no crontab for root - usin…

数据库对象

二十、数据库对象-视图 二十一、数据库对象-索引 age字段没有索引&#xff0c;查找需要扫描全表&#xff1a; name字段做了唯一索引&#xff0c;查找一次&#xff1a; 二十二、数据库对象-事务 事务的隔离级别和问题&#xff1a;

HTML渐变效果:线性渐变与径向渐变详解

简介 在HTML中,你可以使用CSS来创建渐变效果,给元素添加丰富的背景样式。本文将详细介绍HTML中的渐变效果,并提供示例代码帮助你理解和应用。 线性渐变(Linear Gradient) 线性渐变通过沿一条直线给元素应用颜色的渐变效果。你可以定义起始点和结束点之间的颜色过渡方式。…

深度学习-第R1周心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境&#xff1a; 语言环境&#xff1a;Python3.10.7编译器&#xff1a;VScode深度学习环境&#xff1a;TensorFlow 2.13.0 一、前期工作&#xff1a; …