Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步)

这篇具有很好参考价值的文章主要介绍了Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文的初衷一方面是将我的一些关于STM32开发方面浅显的个人经验分享给初学者、并期望得到大佬的批评指正,另一方面是记录自己的实验过程便于回顾。

我预感应该要写很多,不过鉴于之前的数篇笔迹中,对于SPI/DMA/ADXL3XX系列加表的使用已经详细描述过了,所以这篇博客只记录系统构建的整体流程。

摘要:

通过STM32H743VIT6驱动两片adxl355和1片adxl375,采用SYNC信号同步控制方式实现3个传感器的数据,采用FIFO流模式,采用3组SPI+DMA实现数据的同步采集,采用串口1+DMA进行数据传输,采用串口2+中断 构建指令系统,具体指令及对应的功能如下图。通过 定时器+计数 实现了频率可调的方波信号和周期可调的中断,通过RTC产生的秒中断实现定时采样、实际采样率检测 的功能,此外还可以自定义帧标记、获取温度 等功能。

Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步),研究生阶段学习笔记,stm32,c语言,Powered by 金山文档

0 硬件电路介绍

本文基于紫色的板子进行介绍,原理图和细节就不放了,需要用到的时候会指明,总体用到的外设有哪些呢?见下面cubeMX的引脚分配图

Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步),研究生阶段学习笔记,stm32,c语言,Powered by 金山文档
Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步),研究生阶段学习笔记,stm32,c语言,Powered by 金山文档

1 实现3组SPI+DMA,并进行数据采集

3组SPI+DMA的基本配置都很简单(且相同),前面的文章都详细介绍过,因此直接上图,

Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步),研究生阶段学习笔记,stm32,c语言,Powered by 金山文档
Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步),研究生阶段学习笔记,stm32,c语言,Powered by 金山文档
Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步),研究生阶段学习笔记,stm32,c语言,Powered by 金山文档

由于SPI+DMA的传输是非阻塞的,意思就是,如果我写了“SPI接收”,然后“片选拉高”,程序执行完SPI接收后,不管DMA是否传输完毕,都会继续执行“片选拉高”,这是不科学的,一种常见的解决方案是增加延时,但是这样做就失去了DMA的意义,既然有时间延时,为啥要用DMA?而且这种方式无法实现3组SPI同时接收(会差数个机器周期,忽略不计吧)

我的解决方案是:采用标志位的思想,如下,当spix(指spi1或2或3)在发送或接收的时候,将对应的标志位置位,3组spi在同时工作,这个时候,我不断查询标志位,如果3个标志位都回到 0 ,就可以继续使用SPI了,否则等待。

volatile uint8_t DMA_FLAG=0x7f;
//Reserved | usart | spi1TX | spi2TX | spi3TX | spi1RX | spi2RX | spi3RX

因此,3个传感器的数据同步采集函数如下,具体细节:SAMPLE_START;SAMPLE_ADDRESS;...这些抽象的东西是宏定义,即 拉高3个片选, 分别对3片传感器发送数据读取的地址,...,Delay_us是微秒延时函数,在前面的文章有介绍。

void data_sample(){    
    SAMPLE_START;
    Delay_us(5);
    DMA_FLAG&=0xc7;//spi send busy ,bit 0 is busy
    SAMPLE_ADDRESS;
    while((DMA_FLAG&0x38)!=0x38){Delay_us(5);}//    wait until address is sent
    DMA_FLAG&=0xf8;//spi receive busy
    SAMPLE_RECEIVE;
    while((DMA_FLAG&0x07)!=0x07){Delay_us(5);}//    wait until data is received
    SAMPLE_END;
    while((DMA_FLAG&0x40)!=0x40){Delay_us(5);} //    wait until uasrt1 is ready
    DMA_FLAG&=0xbf;                                    //usart1 set busy
    HAL_UART_Transmit_DMA(&huart1,SPI_RX_Buffer, 29);
    Delay_us(80);
}

为了怕难以理解,宏定义如下:

#define SAMPLE_START    HAL_GPIO_WritePin(XL355_CS_GPIO_Port, XL355_CS_Pin, GPIO_PIN_RESET);\
HAL_GPIO_WritePin(XL355_2_CS_GPIO_Port, XL355_2_CS_Pin, GPIO_PIN_RESET);\
HAL_GPIO_WritePin(XL357_CS_GPIO_Port, XL357_CS_Pin, GPIO_PIN_RESET)    
#define SAMPLE_END    HAL_GPIO_WritePin(XL355_CS_GPIO_Port, XL355_CS_Pin, GPIO_PIN_SET);\
HAL_GPIO_WritePin(XL355_2_CS_GPIO_Port, XL355_2_CS_Pin, GPIO_PIN_SET);\
HAL_GPIO_WritePin(XL357_CS_GPIO_Port, XL357_CS_Pin, GPIO_PIN_SET)
#define SAMPLE_ADDRESS    HAL_SPI_Transmit_DMA(&hspi1, &SPI_READ_DATA_Address, 1);\
HAL_SPI_Transmit_DMA(&hspi2, &SPI_READ_DATA_Address, 1);\
HAL_SPI_Transmit_DMA(&hspi3, &SPI_READ_DATA_Address, 1)
#define SAMPLE_RECEIVE    HAL_SPI_Receive_DMA(&hspi1, &SPI_RX_Buffer[0], 9);\
HAL_SPI_Receive_DMA(&hspi2, &SPI_RX_Buffer[9], 9);\
HAL_SPI_Receive_DMA(&hspi3, &SPI_RX_Buffer[18], 9)

下面是DMA回调函数的写法,一共6个,只给出两个,其他的同理。这些回调函数在stm32h7xx_it.c里,只有 DMA_FLAG|=0x04;是我写进去的,写在处理中断前/后 都可以,目的就是给标志位置位。

void DMA1_Stream0_IRQHandler(void)
{
  /* USER CODE BEGIN DMA1_Stream0_IRQn 0 */
    //for SPI1-RX
    DMA_FLAG|=0x04;
  /* USER CODE END DMA1_Stream0_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_spi1_rx);
  /* USER CODE BEGIN DMA1_Stream0_IRQn 1 */

  /* USER CODE END DMA1_Stream0_IRQn 1 */
}

/**
  * @brief This function handles DMA1 stream1 global interrupt.
  */
void DMA1_Stream1_IRQHandler(void)
{
  /* USER CODE BEGIN DMA1_Stream1_IRQn 0 */
    //for SPI1-TX
    DMA_FLAG|=0x20;
  /* USER CODE END DMA1_Stream1_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_spi1_tx);
  /* USER CODE BEGIN DMA1_Stream1_IRQn 1 */

  /* USER CODE END DMA1_Stream1_IRQn 1 */
}

2 实现usart+DMA/中断,进行数据传输和菜单设置

开了两路usart,其中usart1用DMA方式来传输数据 1500000波特率(用镀银的杜邦线,极度奢侈),usart2用中断方式来接收指令,并用常规方式来打印信息,配置极为简单(只改波特率,其余默认)不上图了,需要注意的是,usart2用中断方式来接收指令因此中断的优先级可以高一点,比SPI+DMA(优先级3)略高,暂时设定为2,然后更高的优先级1 留给定时器和RTC的秒中断。

usart1用DMA方式来传输数据在上一部分的sample函数里,一行代码。

usart2的中断函数是这样的,几点细节:switch语句的查表方式比多个if连用的效率更高,串口接收一次之后,要重新执行接收函数才能再次接收。下面的代码应该是浅显易懂的

void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */

  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */

    switch(UART_RX){
        case 0x00:{
            SAMPLE_FLAG^=0x80;
            if(SAMPLE_FLAG&0x80)
                puts("Sampling...");
            else
                puts("Pause...");
            break;
        }    
        case 0x01:SR_Counter_RES=800;puts("Set SR = 5Hz");break;
        case 0x02:SR_Counter_RES=80;puts("Set SR = 50Hz");break;
        case 0x03:SR_Counter_RES=40;puts("Set SR = 100Hz");break;
        case 0x04:SR_Counter_RES=20;puts("Set SR = 200Hz");break;
        case 0x05:SR_Counter_RES=8;puts("Set SR = 500Hz");break;
        case 0x06:SR_Counter_RES=5;puts("Set SR = 800Hz");break;
        case 0x07:SR_Counter_RES=4;puts("Set SR = 1000Hz");break;
        case 0x08:SR_Counter_RES=2;puts("Set SR = 2000Hz");break;    
        case 0x0a:{
            SAMPLE_FLAG^=0x40;
            if(SAMPLE_FLAG&0x40)
                puts("Time_Count mark : ON");
            else{
                puts("Time_Count mark : OFF");
                SAMPLES=0;
            }
            break;
        }
        
        case 0x10:{
            SAMPLE_FLAG&=0x7e;
            Timing=0;
            puts("Timing sample is OFF ");            
            break;
        }
        case 0x11:{
            SAMPLE_FLAG|=0x01;
            SAMPLE_FLAG&=0x7f;
            Timing=30;
            puts("Timing sample : 30s, enter 0x00 to start.");
            break;
        }
        case 0x12:{
            SAMPLE_FLAG|=0x01;
            SAMPLE_FLAG&=0x7f;
            Timing=60;
            puts("Timing sample : 60s, enter 0x00 to start.");
            break;
        }
        case 0x13:{
            SAMPLE_FLAG|=0x01;
            SAMPLE_FLAG&=0x7f;
            Timing=180;
            puts("Timing sample : 180s, enter 0x00 to start.");
            break;
        }
        case 0x14:{
            SAMPLE_FLAG|=0x01;
            SAMPLE_FLAG&=0x7f;
            Timing=300;
            puts("Timing sample : 300s, enter 0x00 to start.");
            break;
        }
        
        case 0x20:{
            SAMPLE_START;
            HAL_SPI_Transmit(&hspi1, &SPI_Temp_Address, 1,0xffff);
            HAL_SPI_Transmit(&hspi2, &SPI_Temp_Address, 1,0xffff);
            HAL_SPI_Transmit(&hspi3, &SPI_Temp_Address, 1,0xffff);
            HAL_SPI_Receive(&hspi1, Temperture, 2,0xffff);
            HAL_SPI_Receive(&hspi2, &Temperture[2], 2,0xffff);
            HAL_SPI_Receive(&hspi3, &Temperture[4], 2,0xffff);
            SAMPLE_END;
            puts("Temperture in HEX(2Bytes*3):");
            printf("%x %x %x %x %x %x\n\n",Temperture[0],Temperture[1],Temperture[2],Temperture[3],Temperture[4],Temperture[5]);
            break;
        }
        
        case 0x30:{
            puts("Enter User-Mark(1 Byte in HEX, must be confined in 0xE0~0xFF): ");
            HAL_UART_Receive(&huart2,&SPI_RX_Buffer[28],1,0xffff);
            SPI_RX_Buffer[28]=SPI_RX_Buffer[28]<0xE0? 0x55:SPI_RX_Buffer[28];
            printf("User-Mark is %x\n",SPI_RX_Buffer[28]);
            break;
        }
        default:puts("Don't have this Commond!");break;    
    }
    HAL_UART_Receive_IT(&huart2,&UART_RX,1);
  /* USER CODE END USART2_IRQn 1 */
}

3 实现定时器产生固定频率的SYNC信号,并进一步实现可调的采样率

关于定时器,我也是在博客上现学的,首先时钟树如下:

Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步),研究生阶段学习笔记,stm32,c语言,Powered by 金山文档

可见 右边写着:to APB2 Timer clocks 是240MHz,我将用到的Timer3就是在这个时钟域。Tim3的配置如下,开启通道1输出 作为SYNC信号,Tooggle on match 就是每次计数器溢出时翻转输出电平,根据图中的参数来计算,Tim3的溢出频率=240Mhz/(预分频系数+1)/(计数周期+1)=240M/(59+1)/(999+1)=4Khz。因此CH1输出的SYNC信号为2Khz的方波信号。Tim3中断函数的调用频率为4kHz。

Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步),研究生阶段学习笔记,stm32,c语言,Powered by 金山文档

开启Tim3的中断,

Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步),研究生阶段学习笔记,stm32,c语言,Powered by 金山文档

在用MX_TIM3_Init函数初始化完成后,用下面两行代码分别开启TIM3基本定时器和TIM3的CH1,如果没有第一行,CH1依然有输出,但是中断函数不会被调用。

    HAL_TIM_Base_Start_IT(&htim3);
    HAL_TIM_OC_Start(&htim3,TIM_CHANNEL_1);

Tim3的中断函数这样写(只有8-13行,其余是自动生成的),每次中断SR_Counter减一,当重装时,置为SAMPLE_FLAG中的采样标志位,程序查询到该标志位时进行采样。这样,就可以通过改变SR_Counter_RES的值,动态修改采样率了,而不需要重新配置TIM3,因为重新配置TIM3也势必会影响SYNC信号,再开一个定时器也没必要。

程序以200khz的频率查询,因此查询和标志位产生之间的误差可以忽略,如果需要进一步增加采样率精度,是否可以把采样函数写在该中断函数里?如果我中断间隔为250us,中断里写的程序需要运行50us,那我的中断间隔会被改变吗?我还没验证,不过采用我目前的实现方式,TIM3中断中的代码量极小,因此不用考虑这样的情况。

注意:我在两次采样间无延时的情况下,全速运行10秒,大约得到了7万个数据,这说明我完成一次3个传感器的采样和传输所需要的时间小于0.2ms,因此我通过上述的方式实现最大采样率为2000Hz是完全OK的。

void TIM3_IRQHandler(void)
{
  /* USER CODE BEGIN TIM3_IRQn 0 */

  /* USER CODE END TIM3_IRQn 0 */
  HAL_TIM_IRQHandler(&htim3);
  /* USER CODE BEGIN TIM3_IRQn 1 */
    if(SR_Counter)
        SR_Counter--;
    else{
        SR_Counter=SR_Counter_RES-1;
        SAMPLE_FLAG|=0x08;
    }

  /* USER CODE END TIM3_IRQn 1 */
}

主函数的主循环中,采样的部分这样写:

        if(SAMPLE_FLAG&0x80){
            while((SAMPLE_FLAG&0x08)!=0x08){Delay_us(5);}
            SAMPLE_FLAG&=0xf7;
            data_sample();
            SAMPLES=SAMPLE_FLAG&0x40?SAMPLES+1:SAMPLES;
            if ((SAMPLE_FLAG&0x01)&& !Timing){
                SAMPLE_FLAG&=0x7e;
                puts("Timing sample is done!");    
            }

其中的SAMPLE_FLAG是采样标志位,具体分配如下:(除去保留位,从左到右分别为:采样启停、时间-采样数的水印开关、采样标志位、定时采样标志位)

volatile uint8_t SAMPLE_FLAG=0;
//RUN | Time_Count_MARK | Reserved | Reserved | Sample | Reserved | Reserved | Timing

4 实现RTC产生秒中断,并进一步实现定时采样和实际采样率检测

RTC这地方我调了很久,因为经常RTC调着调着就不工作了,原因是: 我的板子没有复位按键,是上电自动复位,程序下载之后,如果板子不重新上电,32.768k的晶振就很有可能无法起振。

RTC产生秒中断,配置如下,internal wakeup意思是内部中断(不输出),wakeup clock 1hz很方便,自动产生秒信号。

Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步),研究生阶段学习笔记,stm32,c语言,Powered by 金山文档
Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步),研究生阶段学习笔记,stm32,c语言,Powered by 金山文档

中断函数如下,RTC_Second是我用来计秒的(从上电到现在的秒数),RTC应该有专门的秒寄存器,但是我懒得找了。LED0_Toggle是宏定义,翻转LED灯的;如果设置了定时采样,采样会暂停,当采样开始的时候,每过一秒Timing(定时的秒数)减一;如果开启了时间-采样数水印,会打印当前的秒数和当前累计采集到的样本SAMPLES,这样就可以看到实际的采样率,例如下下面的图,采样率设置为800hz,实际大约是779.5hz,当然这个误差是可以通过优化代码来进一步缩小的。

void RTC_WKUP_IRQHandler(void)
{
  /* USER CODE BEGIN RTC_WKUP_IRQn 0 */

  /* USER CODE END RTC_WKUP_IRQn 0 */
  HAL_RTCEx_WakeUpTimerIRQHandler(&hrtc);
  /* USER CODE BEGIN RTC_WKUP_IRQn 1 */
    LED0_Toggle;
    RTC_Second++;
    if((SAMPLE_FLAG&0x81)==0x81){
        Timing--;
        printf("Timing rest seconds : %4d\n",Timing);
    }
    if(SAMPLE_FLAG&0x40)
        printf("SAMPLES : %10d, Power-seconds %5d\n",SAMPLES,RTC_Second);
    
  /* USER CODE END RTC_WKUP_IRQn 1 */
}
Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步),研究生阶段学习笔记,stm32,c语言,Powered by 金山文档

ok,到此为止了,下面展示一下开机界面

Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步),研究生阶段学习笔记,stm32,c语言,Powered by 金山文档

代码多逻辑复杂,贴不尽。如果需要进一步讨论该工程的完整代码请私信或评论留言。欢迎讨论!文章来源地址https://www.toymoban.com/news/detail-692886.html

到了这里,关于Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32 HAL库 STM32CubeMX -- SPI

    SPI (Serial Peripheral Interface)协议,即串行外围设备接口,是一种高速全双工的通信总线。 它被广泛地使用在ADC、LCD 等设备与MCU 间,要求通讯速率较高的场合。 SPI 通讯使用3 条总线及片选线, 3 条总线分别为SCK、MOSI、MISO,片选线为SS(CS) ,它们的作用介绍如下: (1) SS( Slav

    2024年02月13日
    浏览(27)
  • 【STM32 CubeMX】串口编程DMA

    在嵌入式系统中,串口通信是一项至关重要的功能,它允许单片机与外部设备进行数据交换,如传感器、显示器或其他设备。然而,在高速数据传输的场景下,传统的串口通信方式可能会使CPU过于繁忙,从而影响系统的性能。为了解决这一问题,STM32系列微控制器提供了DMA(

    2024年02月20日
    浏览(18)
  • 【STM32 CubeMX】SPI HAL库编程

    STM32 CubeMX 是一款由 STMicroelectronics 提供的图形化配置工具,用于生成 STM32 微控制器的初始化代码和项目框架。在 STM32 开发中,使用 CubeMX 可以大大简化初始化过程,并帮助开发者快速构建应用程序。其中,SPI(串行外设接口)是一种常用的通信协议,它在连接外部设备时非常

    2024年02月19日
    浏览(13)
  • [HAL]STM32 SPI+DMA驱动WS2812

    该程序是纯手敲,非Cube生成!所有代码均注释。 源码在文章后面获取 Keyword: 单线通讯、归零码、Reset、RGB顺序 RGB一共有24bit位 -相当于驱动一个灯要24bit位 -驱动若干个灯要24* n bit位,通过Reset码决定数据终止(保持) 24bit位应该如何发送? 可见: 表示低电平需要 T0H和T0L的配

    2024年02月09日
    浏览(20)
  • STM32 cubemx+串口空闲中断+DMA双缓冲

            写这篇文章是为了记录下之前做过的项目中用到的一部分关键技术,之前做过的项目中涉及到 采用最小开销来实时接收遥控器数据、能够准确验证传输过来数据的准确性 ,减小误差率,要求能稳定适用于不同的环境。 目录 1、为什么要用到串口空闲中断? 2、为

    2024年02月09日
    浏览(18)
  • 【STM32 CubeMX】串口编程DMA+IDLE中断

    在嵌入式系统中,串口通信是一项关键的任务,而使用DMA(直接内存访问)结合IDLE中断进行串口编程,尤其是在STM32 CubeMX环境中,能够提高系统的效率和性能。STM32 CubeMX为STM32微控制器提供了图形化的配置工具,可以简化初始化代码的生成过程,使得串口编程变得更加容易。

    2024年02月20日
    浏览(27)
  • 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日
    浏览(16)
  • U8g2库的STM32硬件SPI(DMA)移植教程(HAL、OLED显示、四线SPI、DMA)

    本文教你把U8g2图形库移植到STM32上,基于STM32的硬件SPI、CubeMX U8g2库Github网址:https://github.com/olikraus/u8g2 U8g2库CSDN镜像网址:https://gitcode.net/mirrors/olikraus/u8g2?utm_source=csdn_github_accelerator 硬件准备:STM32C8T6(STM32系列芯片)、0.96寸OLED(128×64)、J-Link(或其他) 引脚连接: 出自此

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

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

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

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

    2023年04月08日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包