国民技术与stm32 ADC采集

news2024/11/26 21:33:19

一、国民技术芯片ADC采集配置

/*
PA1  ADC1_IN2  默认功能
DMA 通道1由ADC1触发
外部晶振16  系统时钟144M  AHB 2分频 HCLK=72M
HCLK  经APB1 4分频 pclk1 = 18M=HCLK/4
HCLK  经APB2 4分频 pclk2 = 18M=HCLK/4

ADCCLK不得超过14M


*/
void DMA_ADC_Config(void)
{
	  ADC_InitType ADC_InitStructure;
      DMA_InitType DMA_InitStructure;
	  GPIO_InitType GPIO_InitStructure;
	  
	  /* Enable peripheral clocks ------------------------------------------------*/	
	  /* Enable DMA1 and DMA2 clocks */	 
	  RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_DMA1 , ENABLE);   
	  /* Enable ADC1, ADC2, ADC3 and GPIOC clocks */	
	  // RCC_EnableAPB2PeriphClk(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 | RCC_APB2_PERIPH_GPIOC, ENABLE);    
	  /* Enable GPIOC clocks */	RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);    
	  /* Enable ADC1, ADC2, ADC3 and ADC4 clocks */	
	  RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_ADC1,ENABLE);	
	  /* RCC_ADCHCLK_DIV16 144/16  72/8*/	   
	  ADC_ConfigClk(ADC_CTRL3_CKMOD_AHB,RCC_ADCHCLK_DIV8);


     GPIO_InitStructure.Pin       = GPIO_PIN_1;    
	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;    
	 GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
	  
  /* DMA1 channel1 configuration ----------------------------------------------*/
    DMA_DeInit(DMA1_CH1);
    DMA_InitStructure.PeriphAddr     = (uint32_t)&ADC1->DAT;
    DMA_InitStructure.MemAddr        = (uint32_t)&ADCConvertedValue;
    DMA_InitStructure.Direction      = DMA_DIR_PERIPH_SRC;
    DMA_InitStructure.BufSize        = 1;
    DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
    DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_DISABLE;
    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(DMA1_CH1, &DMA_InitStructure);
    /* Enable DMA1 channel1 */
    DMA_EnableChannel(DMA1_CH1, ENABLE);

    /* ADC1 configuration ------------------------------------------------------*/
    ADC_InitStructure.WorkMode       = ADC_WORKMODE_INDEPENDENT;
    ADC_InitStructure.MultiChEn      = ENABLE;
    ADC_InitStructure.ContinueConvEn = ENABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIGCONV_NONE;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 1;
    ADC_Init(ADC1, &ADC_InitStructure);
   
	 //  配置ADC时钟分频因子  不超过14M    8分频得到
	 //  使用外部高速时钟
	 // RCC_ConfigAdc1mClk(RCC_ADC1MCLK_SRC_HSE, RCC_ADC1MCLK_DIV2);
	 
    /* ADC1 regular channel14 configuration */
		
    //ADC_ConfigRegularChannel(ADC1, ADC_CH_2, 1, ADC_SAMP_TIME_55CYCLES5);
		ADC_ConfigRegularChannel(ADC1, ADC1_Channel_02_PA1, 1, ADC_SAMP_TIME_55CYCLES5);
	
    /* Enable ADC1 DMA */
    ADC_EnableDMA(ADC1, ENABLE);

    /* Enable ADC1 */
    ADC_Enable(ADC1, ENABLE);
	
    /*Check ADC Ready*/
    while(ADC_GetFlagStatusNew(ADC1,ADC_FLAG_RDY) == RESET);
	
    /* Start ADC1 calibration */
    ADC_StartCalibration(ADC1);
	
    /* Check the end of ADC1 calibration */
    while (ADC_GetCalibrationStatus(ADC1));

    /* Start ADC1 Software Conversion */
    ADC_EnableSoftwareStartConv(ADC1, ENABLE);
}

二、stm32  ADC采集

// ADC多通道采集 
void ADC_IN_x_Config(void)
{
   ADC_InitTypeDef ADC_InitStructure;
	
	  //  使能ADC时钟
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	  
	 //  ADC结构体配置
	 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;   //  独立模式   ADC1/2/3/4只使用了一个
	 ADC_InitStructure.ADC_ScanConvMode = ENABLE;         //  扫描模式 
	 ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;     //  连续转换(多次转换ENABLE)   一次转换(disable) 
	 ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;  //  禁止触发检测、使用软件触发  ADC_ExternalTrigConv_None
	 ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; //   右对齐
	 ADC_InitStructure.ADC_NbrOfChannel=NOFCHANEL;                //  2个转换在规则序列中
	 ADC_Init(ADC1,&ADC_InitStructure);

	 //  配置ADC时钟分频因子  不超过14M     APB2=72M   APB2 8分频得到
	  RCC_ADCCLKConfig(RCC_PCLK2_Div8);
	
	 // 配置ADC通道的转换顺序和采样时间 Tconv = 采样时间 +  12.5 个周期   第三个参数为通道转换序列
   ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // 配置 ADC 通道转换顺序为 1,第一个转换,采样时间为 55.5 个时钟周期 
  
	 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); // 配置 ADC 通道转换顺序为 2,第二个转换,采样时间为 55.5 个时钟周期 
	
   //ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);              // ADC 转换结束产生中断,在中断服务程序中读取转换值 
	 ADC_DMACmd(ADC1,ENABLE);                               // 使能ADC DMA请求
	 
	 //  使能ADC并开始转换
	 ADC_Cmd(ADC1,ENABLE);
	 
	 //  初始化并校准寄存器
	 ADC_ResetCalibration(ADC1);
	 
	 //  等待校准寄存器初始化完成
	 while(ADC_GetResetCalibrationStatus(ADC1));
	 
	 //  ADC开始校准
	 ADC_StartCalibration(ADC1);
	 
	 //  等待校准完成
	 while(ADC_GetCalibrationStatus(ADC1));
	 
	 //  软件触发ADC转换,没有使用时外部触发
	 ADC_SoftwareStartConvCmd(ADC1, ENABLE);
	  
}
/*********************************************DMA配置*********************************************/
// 1、DMA_Chx  DMA通道  2、Dpba  外设地址  3、Dmba  存储器地址  4、Dbse  DMA通道的缓冲区大小
void DMA_Config(DMA_Channel_TypeDef* DMA_Chx,uint32_t Dpba,uint32_t Dmba,uint32_t Dbs)
{
	DMA_InitTypeDef DMA_InitStructure; 
  //  使能时钟
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
	
	//  复位DMA控制器  DMA 通道复位
	DMA_DeInit(DMA_Chx);
	
	//  配置结构体
	DMA_InitStructure.DMA_PeripheralBaseAddr=Dpba;  //  ADC数据寄存器地址
	DMA_InitStructure.DMA_MemoryBaseAddr=Dmba;      //  存储器地址  目标地址
	DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//  数据传输方向:数据来源于外设
	DMA_InitStructure.DMA_BufferSize=Dbs;           //  DMA缓冲区大小=数据目的地的大小
	
	DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;             //   指定外设地址寄存器是否递增.只有一个不递增
	DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;                      //   内存地址寄存器递增
	DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;  //   外设数据宽度为半字,即两个字节
	
	DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;          //   内存数据宽度为半字,与外设数据大小相同
  DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;                              //   DMA工作模式  循环输出模式    正常工作模式DMA_Mode_Normal
	DMA_InitStructure.DMA_Priority=DMA_Priority_High;                          //   优先级 DMA 传输通道优先级为高,当使用一个 DMA 通道时,优先级设置不影响 
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                               //   禁用内存到内存的传输模式   外设->内存
	
	DMA_Init(DMA_Chx,&DMA_InitStructure);
	DMA_Cmd(DMA_Chx,ENABLE);
}

初始化

#define ADC_X_PIN     GPIO_Pin_0
#define ADC_X_CHANNEL ADC_Channel_8

#define ADC_Y_PIN     GPIO_Pin_1
#define ADC_Y_CHANNEL ADC_Channel_9

// ADC1 对应 DMA1 通道 1,ADC3 对应 DMA2 通道 5,ADC2 没有 DMA 功能 
#define ADC_DMA_CHANNEL DMA1_Channel1 

ext short int ADC_CollectValue[NOFCHANEL];   //  需要ADC转换的电压值
#define NOFCHANEL  2

void ADC_XY_Init(void)
{
	
	//  x(PA0)、y轴 引脚初始化   模拟输入   AD
	// GPIOx_Config(RCC_APB2Periph_GPIOA,GPIOA,GPIO_Pin_0|GPIO_Pin_1,GPIO_Mode_AIN);
	  GPIO_InitTypeDef GPIO_InitStructure;
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
	  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; // 模拟输入
	  GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	//  ADC配置
	//  Tconv = 采样时间 + 12.5 个周期    55.5+12.5  Tconver=(55.5+12.5)*1/9=7.55us
	 ADC_IN_x_Config();
	//ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC通道,采样时间为239.5周期
	//  DMA配置    1、DMA通道   2、外设地址  3、存储器地址  4、缓冲区大小,应该等于数据目的地的大小
	DMA_Config(ADC_DMA_CHANNEL,(u32)(&( ADC1->DR )),(u32)ADC_CollectValue,NOFCHANEL);
	
}

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

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

相关文章

Unity报错:InvalidOperationException: Insecure connection not allowed的解决方法

问题描述 在导入Steam VR 插件后报错&#xff1a; InvalidOperationException: Insecure connection not allowed UnityEngine.Networking.UnityWebRequest.SendWebRequest () (at <4139bb31c03640e7b650db6ec39d5754>:0) UnityEngine.WWW..ctor (System.String url) (…

大模型上下文长度的超强扩展:从LongLora到LongQLora

前言 本文一开始是《七月论文审稿GPT第2版&#xff1a;从Meta Nougat、GPT4审稿到Mistral、LongLora Llama》中4.3节的内容&#xff0c;但考虑到 一方面&#xff0c;LongLora的实用性较高二方面&#xff0c;为了把LongLora和LongQLora更好的写清楚&#xff0c;而不至于受篇幅…

[数据结构 C++] AVL树的模拟实现

文章目录 1、AVL树1.1 AVL树的概念 2、AVL树节点的定义3、AVL树的插入和旋转3.1 左单旋左旋代码实现 3.2 右单旋右旋代码实现 3.3 右左双旋右左双旋的代码实现 3.4 左右双旋左右双旋的代码实现 3.5 insert接口实现 4、判断是否为AVL树判断AVL树的代码实现 5、AVL树的性能 问题引…

Maven Resources Compiler: Maven project configuration required for module

Maven Resources Compiler: Maven project configuration required for module ‘cc-pdf’ isn’t available. Compilation of Maven projects is supported only if external build is started from an IDE. 报错原因是&#xff0c;我在git建立一个新空仓库&#xff0c;然后把…

C++线程池的原理(画图)及简单实现+例子(加深理解)

1.为什么线程池会出现&#xff0c;解决什么问题&#xff1f; C线程池&#xff08;ThreadPool&#xff09;的出现主要是为了解决以下几个问题&#xff1a; 1.性能&#xff1a;创建和销毁线程都是相对昂贵的操作&#xff0c;特别是在高并发场景下&#xff0c;频繁地创建和销毁线…

Linux下误删除后的恢复操作测试之extundelete工具使用

一、工具介绍 extundelete命令的功能可用于系统删除文件的恢复。在使用前&#xff0c;需要先将要恢复的分区卸载&#xff0c;以防数据被意外覆盖。 语法格式&#xff1a;extundelete [参数] 文件或目录名 常用参数&#xff1a; --after 只恢复指定时间后被删除的文件 --bef…

Linux学习(9)——RAID与服务器的常见故障

目录 一、服务器常见故障 1、系统不停重启进入不了系统 2、卡在开机界面右下角有fA B2 H8 3、系统安装不上 4、如何进入服务器的bios 5、一般进入阵列卡的快捷键 6.网络不通 7.硬盘不识别 二、RAID相关知识 1、RAID的概念 2、RAID功能实现 3、RAID实现的方式 三、…

机器学习笔记 - 偏最小二乘回归 (PLSR)

一、偏最小二乘回归:简介 PLS 方法构成了一个非常大的方法族。虽然回归方法可能是最流行的 PLS 技术,但它绝不是唯一的一种。即使在 PLSR 中,也有多种不同的算法可以获得解决方案。PLS 回归主要由斯堪的纳维亚化学计量学家 Svante Wold 和 Harald Martens 在 20 世纪 80 年代…

海外服务器2核2G/4G/8G和4核8G配置16M公网带宽优惠价格表

腾讯云海外服务器租用优惠价格表&#xff0c;2核2G10M带宽、2核4G12M、2核8G14M、4核8G16M配置可选&#xff0c;可以选择Linux操作系统或Linux系统&#xff0c;相比较Linux服务器价格要更优惠一些&#xff0c;腾讯云服务器网txyfwq.com分享腾讯云国外服务器租用配置报价&#x…

ByteTrack算法流程的简单示例

ByteTrack ByteTrack算法是将t帧检测出来的检测框集合 D t {\mathcal{D}_{t}} Dt​ 和t-1帧预测轨迹集合 T ~ t − 1 {\tilde{T}_{t-1}} T~t−1​ 进行匹配关联得到t帧的轨迹集合 T t {T_{t}} Tt​。 首先使用检测器检测t帧的图像得到检测框集合 D t {\mathcal{D}_{t}} …

手机技巧:分享10个vivo手机实用小技巧技巧,值得收藏

目录 1. 快速切换应用 2、智能助手Jovi 3. 轻按唤醒屏幕 4. 快速启动相机 5. 分屏功能 6. 手势操作 7. 一键清理 8.忘记密码 9.玩游戏耗电快 10.手机丢失后该怎么办 1. 快速切换应用 向右或向左滑动底部的虚拟按键即可。 2、智能助手Jovi vivo手机自带智能助手Jovi…

【Java EE初阶八】多线程案例(计时器模型)

1. java标准库的计时器 1.1 关于计时器 计时器类似闹钟&#xff0c;有定时的功能&#xff0c;其主要是到时间就会执行某一操作&#xff0c;即可以指定时间&#xff0c;去执行某一逻辑&#xff08;某一代码&#xff09;。 1.2 计时器的简单介绍 在java标准库中&#xff0c;提供…

CMake入门教程【核心篇】添加应用程序(add_executable)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1. 概述2. 使用方法2…

【计算机视觉】常用图像数据集

图像数据集 模型需要好的数据才能训练出结果&#xff0c;本文总结了机器学习图像方面常用数据集。 MNIST 机器学习入门的标准数据集&#xff08;Hello World!&#xff09;&#xff0c;10个类别&#xff0c;0-9 手写数字。包含了60,000 张 28x28 的二值训练图像&#xff0c;10…

计算机网络(2)

计算机网络&#xff08;2&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 计算机网络和因特网&#xff08;2&#xff09;分组交换网中的时延、丢包和吞吐量时延丢包吞吐量总结 协议层次及其服务模型模型类型OSI模型分析TCP/IP模型分析 追溯历史 小程一言 我…

Graphics Control

Graphics Control提供了一个易于使用的图形设置管理解决方案,帮助您加快开发。它附带了一个常用设置库,如分辨率、垂直同步、全屏模式、光晕、颗粒、环境光遮挡等。我们的可自定义设置面板UI预制件为您提供了一个可用的UI面板,支持完整的游戏手柄和键盘输入。图形控制还附带…

【前沿技术杂谈:ChatGPT】ChatGPT——热潮背后的反思

【前沿技术杂谈&#xff1a;ChatGPT】ChatGPT——热潮背后的反思 缘起&#xff1a;无中生有&#xff0c;涅槃重生人工智能技术人工智能的发展史无中生有内容自动生成技术的发展代表企业OpenAI-GPT系列技术的发展历程ChatGPT新特点 热潮&#xff1a;万众瞩目&#xff0c;群雄逐鹿…

Unity | Shader基础知识番外(向量数学知识速成)

目录 一、向量定义 二、计算向量 三、向量的加法&#xff08;连续行走&#xff09; 四、向量的长度 五、单位向量 六、向量的点积 1 计算 2 作用 七、向量的叉乘 1 承上启下 2 叉乘结论 3 叉乘的计算&#xff08;这里看不懂就百度叉乘计算&#xff09; 八、欢迎收…

Vue3地图选点组件

Vue3地图选点组件 <template><div style"width: 100%; height: 500px"><div class"search-container"><el-autocompletev-model"suggestionKeyWord"class"search-container__input"clearable:fetch-suggestion…

【已解决】You have an error in your SQL syntax

报错讯息 java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘desc,target_url,sort,status,create_by,modify_by,created,last_update_time FROM…