stm32 ADC 精讲(基于HAL库)

这篇具有很好参考价值的文章主要介绍了stm32 ADC 精讲(基于HAL库)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.ADC的介绍

adc dma hal库,stm32,嵌入式硬件,单片机
首先ADC是将模拟量信号转化为数字信号,简单来说就是把一些连续信号转化为 010101。

1.原理讲解

adc dma hal库,stm32,嵌入式硬件,单片机典型的ADC叫做逐次逼近型ADC,接下来我们来分模块讲解上述电路图

adc dma hal库,stm32,嵌入式硬件,单片机
上图所示,是一个 电压比较器,将待测电压Vin输入到比较器的正端上去,当正端电压大于负端电压时,在输出端输出1,反之则输出0
adc dma hal库,stm32,嵌入式硬件,单片机

然后将0/1送入到计数器中,0/1决定clk是增还是减,1是增,0是减,最后将计数的结果传给DAC,DAC会输出一个电压VDAC跟vin 去进行比较。

比如一开始的时候,比较器的”-”端电压是0 ,当待测电压输入进来的时候,此时,“﹢”端电压大于”-”端电压,就输出1 ,clk计数器就+1,VDAC的电压就逐渐增大,当VDC电压增大到与vin电压大概相等的时候,放大器的“﹢”端与“-”端的电压值谁大谁小就会交替变化,因此clk就会在+和-之间交替变化,最后达到一个稳定的状态,达到稳定之后再将计数器的值传给CPU

adc dma hal库,stm32,嵌入式硬件,单片机

在上图中 ,Latch就是CPU,将数据传进去之后,经CPU处理,再将数据输出出来。

接下来我们来看一个动态的过程
adc dma hal库,stm32,嵌入式硬件,单片机通过上图我们不难发现,VADC的值上升到与 待测电压Vin 的值大小相等的时候,是需要一定的时间的,这里我们来引进一个新的概念,ADC 的转换时间。

2.ADC的转换时间

adc dma hal库,stm32,嵌入式硬件,单片机
转换时间我们用Tc 表示,我们从ADC的转换原理可以知道VADC上升到与vin需要的一定的时间,这个时间我们记为Tc1,然后将计数器得到的数据传给CPU进行处理的时候又需要一定的时间,这个时间我们计为Td,因此,T = Tc1+Td。

二.STM32原理图讲解

adc dma hal库,stm32,嵌入式硬件,单片机

1 .ADC的主要功能

  1. 最大位数为12位,分辨率为2的12次方,数据格式可以选为左对齐还是右对齐,(一般我们在配置之中都是选择右对齐)
  2. 转换模式分为独立跟多重,我们stm32之中不止有一个ADC通道,当选择两个以上的ADC通道时,则为多重模式,选择一个ADC通道时就是独立模式。
  3. 单次模式,触发一次,采样一次,连续模式,只需要触发一次即可。
  4. F429的ADC 的时钟一定是<= 36MHZ ,T min = 0.41us,实际上一般是达不到0.41us,比如我们的主频率是180MHZ , 我们ADC的时钟频率来自APB2,对其2分频得到PCLK2 = 90MHZ ,这个时候你只能对其进行4分频,这个时候,ADC的时钟频率就是22.5MHZ,如果你对其2分频的话,这个时候ADC的时钟频率就等于45MHZ,就不符合要求了。
  5. 2次采样时间要隔 5- 10 clk。
  6. 规则组跟注入组的区别, 规则组最多可以存16个通道,CH0 - CH15,但是数据寄存器只有一个,也就是说,数据会被覆盖掉,这个时候就只能存一个通道的数据了,那又什么办法解决没有呢,答案是有的,就是使用DMA 来进行数据转运,这个我们留到后面来讲,接下来我们来说一说注入组,注入组最多可以存4个通道。有上图可知,注入组的数据寄存器有4个,因此不用担心数据覆盖问题。然后注入组是类似于中断(一般少用)。

2.基本设计规则

adc dma hal库,stm32,嵌入式硬件,单片机
在配置的时候,我们要在采样率跟分辨率之间做取舍。
ADCCLK 就是从APB2分频过来的比如我们在上面讲解ADC原理的时候,配置的ADC时钟是22.5MHZ ,这个时候,ADCCLK = 1 / 22.5 MHZ = 0.4444444444us,
Tsam可以在程序中进行配置 (后面配置时会细讲)。
![在这里插入图片描述](https://img-blog.csdnimg.cn/0bf10243ea1e4b9198a0c099cc016965.pngadc dma hal库,stm32,嵌入式硬件,单片机

ADC单通道:

要求进行一次ADC转换:配置为单次模式使能,扫描模式失能。这样ADC的这个通道,转换一次后,就停止转换。

要求进行连续ADC转换:配置为连续模式使能,扫描模式失能。这样ADC的这个通道,转换一次后,接着进行下一次转换,不断连续。

ADC多通道:必须是扫描模式

要求进行一次ADC转换:配置为单次模式使能,扫描模式使能。这样ADC的多个通道,按照配置的顺序依次转换一次后,就停止转换。

要求进行连续ADC转换:配置为连续模式使能,扫描模式使能。这样ADC的多个通道,按照配置的顺序依次转换一次后,接着进行下一次转换,不断连续。

因此,得出结论:扫描模式只在多通道的条件下有效,来使得各个通道按照配置循序依次转换。而单次模式无论在单通道还是多通道下只对这些或者这个通道进行一次转换,连续模式无论是在单通道还是多通道下都对这些或者这个通道不断进行连续的转换。

3.ADC多重通道

adc dma hal库,stm32,嵌入式硬件,单片机

1.交替模式,简单来说,就是开启多个ADC,对同一通道进行采样,则合格最大的好久就是可以提高采样率。由上图可知,采集三个adc数据的时间,比采集一个adc数据的时间只多大概1.5倍而已,大大提高了采样率。
adc dma hal库,stm32,嵌入式硬件,单片机

2.同步模式,开启多个ADC对不同通道进行采样,得到多个采样值 ,具体的ADC IO口配置得参考数据手册。

4.DMA 的讲解

  1. DMA 是一个公用的数据转运工具 ,可用于spi ,uart, DA ,ADC .
  2. 是一个自动化的数据搬运工,不占用cpu 资源。
  3. 使用DMA 跟不使用DMA 的区别
    adc dma hal库,stm32,嵌入式硬件,单片机
    不使用DMA 的时候,这个时候我们需要写一个运行程序给cpu让他去读取adc的值,这里我们取一个极端的情况,假如ADC的采样频率跟CPU的频率相等,这个时候CPU的运行周期跟ADC的周期就一样,这样子CPU 就只能一直在读取ADC的值了,干不了其他的事情。
    adc dma hal库,stm32,嵌入式硬件,单片机

使用DMA时 ,我们只需要在主函数初始化一下DMA ,在配置ADC的时候,将ADC转换后数据用DMA 转移到一个特定的区域,这样子,我们只需要配置一下CPU 对数据储存的程序即可。

三.cubemx的配置

1.ADC的三种工作模式

1)阻塞模式(也叫查询模式)

Step1 : 启用ADC
Step2: 等待EOC标志位
Step3:读取寄存器的数据 、<-- 查询环节
缺点:占用cpu的使用率

主要使用到的函数
HAL_StatusTypeDef HAL_ADC_Start (ADC_HandleTypeDefhadc); //打开ADC的转换通道
HAL_StatusTypeDef HAL_ADC_Stop (ADC_HandleTypeDef
hadc) //关闭ADC
HAL_StatusTypeDef HAL_ADC_PollForConversion (ADC_HandleTypeDef*hadc,uint32_t Timeout); // 查询函数,等着ADC 转换,查询转换的标志位,TImeout为超时时间,当超过这个时间时,直接退出函数,防止程序死机。

cubemx 的主要配置
  1. 时钟频率的配置,PCLK2 我配置的是90MHZ,因此,这里我设置的是四分频,出来的ADCCLK = 22.5MHZ(小于36即可)
    adc dma hal库,stm32,嵌入式硬件,单片机
  2. ADC采样时间的配置
    adc dma hal库,stm32,嵌入式硬件,单片机
    这里我们配置 Sampling time = 56 cycles .
    根据 Tadc = Sam + 12Tadcclk 可得 Tadc =(12 +56 Tadcclk = 68 * (1 / 22.5) ≈3us
主要代码
  1. cubemx 配置生成的ADC_Init 代码
void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */

  /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_56CYCLES;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}
  1. get adc_value ADC转换得到的电压 Vadc = cpu得到的计数值 * 3.3 / 4096
float get_adc_value(void)
{
	HAL_ADC_Start (&hadc1);//第一步,开启ADC
	HAL_ADC_PollForConversion (&hadc1,50);// 查询函数,等着ADC 转换,查询转换的标志位.
	if (HAL_IS_BIT_SET (HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)) //判断ADC是否转换完成,判断EOC标志位
	{
		return HAL_ADC_GetValue(&hadc1) * 3.3 /4096; //  获取ADC的值,并转换为对应的电压
	}
	else return 0;
}

  1. 主程序
int main(void)
{
  /* USER CODE BEGIN 1 */
char text [20];
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_FMC_Init();
  /* USER CODE BEGIN 2 */
  lcd_init();  
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  
	  adc_value = get_adc_value();
	  sprintf (text, "v = %f", adc_value );// 将adc_value打印成字符串存在text里
	   lcd_show_string(200,400,200,200,16,text,BLACK);//显示adc_value
	  HAL_Delay(0);
  }
  /* USER CODE END 3 */
}

现象
adc dma hal库,stm32,嵌入式硬件,单片机

adc dma hal库,stm32,嵌入式硬件,单片机

2).中断模式

Step1 : 启用ADC,使能中断
Step2: 等待EOC自动触发中断
Step3:在中断中读取寄存器的数据
主要函数
HAL_StatusTypeDef HAL_ADC_Start_IT (ADC_HandleTypeDefhadc) //使能ADC,打开中断标志位
HAL_StatusTypeDef HAL_ADC_Stop——IT (ADC_HandleTypeDef
hadc)
HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)//回调函数

cubemx 的主要配置

adc dma hal库,stm32,嵌入式硬件,单片机
打开NVIC中断使能标志
其他配置与查询模式一样

主要代码
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_FMC_Init();
  /* USER CODE BEGIN 2 */
    lcd_init();  
   
 
 

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	    HAL_ADC_Start_IT(&hadc1);
	    sprintf (tex11, "v = %f", adc_value1 );
	   lcd_show_string(200,400,200,200,16,tex11,BLACK);
	 
  }
  /* USER CODE END 3 */
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)//回调函数
{
	 adc_value1 =  HAL_ADC_GetValue(&hadc1) * 3.3 /4096;
}

3)DMA 模式

首先,说一下DMA 的工作模式,DMA 的工作模式一般分为正常模式跟循环模式,循环模式就是当你的DMA缓冲区填满之后还会自动回到起始地址,配置我们一般配置为循环模式。然后我们在使用DMA 的时候一般会涉及外设地址跟存储器地址,如图
adc dma hal库,stm32,嵌入式硬件,单片机

cubemx的主要配置

这里我们配置了双通道。
step 1 :使能扫描转换模式(Scan Conversion Mode),使能连续转换模式(ContinuousConversion Mode)。
step 2 : ADC规则组选择转换通道数为2(Number Of Conversion)。
step 3 :配置Rank的输入通道。设置为连续传输模式,数据长度为字。

在配置的时候存储器地址自增,因为ADC1的地址只有一个,所以外设地址我们不自增,因为ADC我们配置的时候是12位,因此我们需要选择的 Data Width 为 half Word 也就是16位数据.因为是有两个通道,所以必须开启扫描模式,然后开启连续模式,这样子只需要触发一次,ADC就能不断的采集数据。

adc dma hal库,stm32,嵌入式硬件,单片机
adc dma hal库,stm32,嵌入式硬件,单片机

主要代码
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_FMC_Init();
  /* USER CODE BEGIN 2 */
lcd_init();
HAL_ADC_Start_DMA (&hadc1,(uint32_t *)adc_value,4);//因为此函数第二位必须是32位的指针,所以这里必须强制类型转换
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  get_adc_value();
	   
	  	  sprintf (tex12, "v2 = %f", ad2 *3.3 / 4096 );
	   lcd_show_string(200,400,200,200,16,tex12,BLACK);
	   sprintf (tex11, "v1 = %f",ad1 *3.3 / 4096 );
	   lcd_show_string(200,300,200,200,16,tex11,BLACK);
  }
  /* USER CODE END 3 */
}
/*由于DMA采用了连续传输的模式,ADC采集到的数据会不断传到到存储器中(此处即为数组ADC_Value)。
ADC采集的数据从ADC_Value[0]一直存储到ADC_Value[99],然后采集到的数据又重新存储到ADC_Value[0],
一直到ADC_Value[99]。所以ADC_Value数组里面的数据会不断被刷新。这个过程中是通过DMA控制的,不需
要CPU参与。我们只需读取ADC_Value里面的数据即可得到ADC采集到的数据。其中ADC_Value[0]为通道0(PA0)
采集的数据,ADC_Value[1]为通道1(PA1)采集的数据,ADC_Value[2]为通道0采集的数据,如此类推。数组偶
数下标的数据为通道0采集数据,数组奇数下标的数据为通道1采集数据 , 在get_adc_value中 ,我们将通道0
跟通道1采集到的数据,除以50,达到滤波的效果*/
uint32_t get_adc_value()
{
	 for(i =0,ad1= 0,ad2= 0; i < 100 ; ) 
		 {
			  ad1+= adc_value[i++];
			   ad2 += adc_value[i++];
		 }
		 ad1= adc_value[0];
			   ad2 = adc_value[1];
		 lcd_show_num(1,1,ad2,6,16,BLACK);
		  lcd_show_num(1,20,ad1,6,16,BLACK);
		 ad1 /= 50;
		 ad2 /= 50;
	
	 
}

现象
adc dma hal库,stm32,嵌入式硬件,单片机
adc dma hal库,stm32,嵌入式硬件,单片机

2、总结

1.查询模式:查询模式下,占用CPU时间较多,CPU效率较低。

2.中断模式:相比查询模式大大释放了CPU,提高了CPU的利用率。

3.DMA模式:该模式下基本不占用CPU,能直接将ADC采集的数据存储到存储器。文章来源地址https://www.toymoban.com/news/detail-626867.html

到了这里,关于stm32 ADC 精讲(基于HAL库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • STM32CubeMx实现ADC多通道+DMA读取(HAL库)

    STM32CubeMx实现ADC多通道+DMA读取(HAL库)

    目录 一、实验结果  二、STM32CubeMx配置 三、main.c测试代码 1、RCC配置 (外部晶振选择8MHz。设置相应的分频器M=8,倍频器倍频系数N=336,分频器分频系数P=2,那么主PLL生成的第一个输出高速时钟PLLP为:168MHz)  2、SYS配置  3、ADC(规则)通道配置(独立模式,预分频4分频,1

    2024年02月15日
    浏览(17)
  • [HAL库]STM32 ADC功能和DMA读数据的方法

    [HAL库]STM32 ADC功能和DMA读数据的方法

    这篇博客记录下 STM32F103R8T6 是怎么开ADC、用DMA搬数据的方法。方便日后使用的时候查资料。 DMA其实就是个搬运工,专门负责搬数据,没有DMA之前,搬数据是由MCU核心来负责,虽说都能完成搬数据的动作,但是MCU干这件事浪费资源且效率低,所以有DMA的场合尽量使用DMA来负责搬

    2024年02月14日
    浏览(7)
  • STM32CubeMx配置ADC(多通道采集+DMA读取数据)(HAL库开发)

    STM32CubeMx配置ADC(多通道采集+DMA读取数据)(HAL库开发)

    目录 1、函数配置过程(这是标准库配置过程): 2、STM32CubeMx配置过程  3、main函数源文件 采集5路ADC数据,并用串口printf()函数打印出来。 实验现象:  ADC转换的初始条件: 1、使能 2、触发源条件完成(这个需要自己配置)利用:HAL_ADC_Start_DMA()函数; ADC中HAL开发优势就是,

    2023年04月08日
    浏览(12)
  • STM32 hal库使用笔记(五)ADC—单通道/双通道DMA传输

    STM32 hal库使用笔记(五)ADC—单通道/双通道DMA传输

    实现目的:利用ADC采集光敏传感器/烟雾传感器的值,并利用串口打印 实验平台:正点原子精英版 一、简介 1.DMA的介绍 参考:STM32 hal库使用笔记(四)DMA—内存到内存/内存到外设_乱码小伙的博客-CSDN博客 2.ADC简介      ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚

    2024年02月03日
    浏览(13)
  • 【STM32F407 ADC+DMA采集压力变送器数据(HAL库)】

    【STM32F407 ADC+DMA采集压力变送器数据(HAL库)】

    之前项目中需要对麦克传感器的mpm480隔爆压力变送器(4-20ma输出)的数据进行实时采集,使用STM32F407作为控制器,使用信号转换模块将压力变送器4-20ma的输出转换为0-3.3v的信号量,输入到STM32F407板子的ADC1的通道10,并使用DMA2通道0数据流0将采集的多个值从外设直接存入存储器

    2024年02月16日
    浏览(10)
  • STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL库开发)

    STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL库开发)

     时钟配置HSI主频配置64M  勾选打开8个通道的ADC  使能连续转换模式  添加DMA  DMA模式选择循环模式  使能DMA连续请求 采样时间配置160.5 转换次数为8  配置好8次转换的顺序  配置好串口,选择异步模式 配置好需要的开发环境并获取代码  修改main.c 串口重定向  串口重定向

    2024年02月08日
    浏览(18)
  • STM32 CubeMX ADC采集 单通道,多通道,内部温度(轮询,DMA,中断)(HAL库)

    STM32 CubeMX ADC采集 单通道,多通道,内部温度(轮询,DMA,中断)(HAL库)

    12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部 信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定

    2024年02月06日
    浏览(15)
  • 【STM32+HAL+Proteus】系列学习教程---ADC(查询、中断、DMA模式下的电压采集)

    【STM32+HAL+Proteus】系列学习教程---ADC(查询、中断、DMA模式下的电压采集)

    1、学会STM32CubeMX软件关于ADC的配置 2、掌握ADC三种模式(查询、中断、DMA)编程 3、具体目标:1、将开发板单片机采集到的电压值上传至上位机串口调试助手显示。 ADC(Analog to Digital Converter)即模数转换器,用来将模拟信号转换为数字信号。 A/D转换过程 分辨率:  A/D转换器对

    2024年04月26日
    浏览(13)
  • 基于stm32+HAL库的ADC电压采集实验

    基于stm32+HAL库的ADC电压采集实验

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 只会用if的大神提醒您,敌军还有30秒到达战场,碾碎他们!白银局不要怕! 软件:keil5、stm32cubemx、串口调试助手 硬件:stm32f103系列的开发板、杜邦线*1、串口工具 仅此而已!!!正好6神 1、打开cube

    2023年04月15日
    浏览(10)
  • STM32F4 HAL库使用DMA进行ADC采样实时发送波形到串口显示(包含傅里叶变换)

    STM32F4 HAL库使用DMA进行ADC采样实时发送波形到串口显示(包含傅里叶变换)

    按下 STM32F4 的 KEY0 按键,通过外部中断的方式对按键进行检测,然后进行一次固定点数的 DMA ADC 采集,采集完成后在 DMA 的中断发送采集到的数据,然后清空数据区准备下一次的按键中断。电脑接受到串口数据后对数据进行简单处理和傅里叶变化,然后实时显示在电脑上。 开

    2024年02月14日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包