619|1

2941

帖子

4

TA的资源

五彩晶圆(中级)

楼主
 

【NUCLEO-U083RC】ADC软件触发DMA转换和串口通讯测试 [复制链接]

测试介绍

本次测试为STM32U083的ADC性能和DMA转换数据方式。STM32U083带有一个12位ADC,并且数据转换方式可以通过没有MCU参与的DMA方式。带有7个异步/同步uart串行接口,3个是低功耗模式,4个为普通模式。测试使用UART2输出测试ADC转化数据。LED4作为故障指示。当系统出现故障时LED4将常亮。

测试硬件连接

ADC设置:转换外设:ADC1,通道:IN4通道,采样时钟:系统时钟源SYSCLK/4分频,引脚:PA0,DMA支持:开,转换触发模式:SW软件循环模式,DMA中断打开。

 

DMA设置:外设:DMA1,循环模式传输数组模式,数据宽度:16bit,外设到内存。

UART设置:外设:UART2,速率:115200,数据长度:8bit、停止位:1、校验:无校验

使用SW触发转换单通道,单通道输出引脚使用:PA0引脚。UART引脚:PA2 UART2_TX,PA3 UART2_RX

 

测试设置

系统时钟设置:

 

ADC时钟测试SYSCLK/4分频。

ADC1设置:

 

ADC外设与DMA中断测试

 

 

USART2设置:

 

设置:115200、8bit、stop 1bit、NONE

DMA1设置:

 

 

测试程序

开始,使用自定义的项目进行测试,但是程序总是出现故障,在ADC_Activate()函数的LL_ADC_Enable(ADC1);这条处跳转到故障循环里。后来又将设置程序另存为SWADC生成程序,故障依旧没有排除,后来,将ADC_SingleConversion_TriggerSW_DMA_Init例程的代码改造后才成功,这次USART使用的是LL库,而不是HAL库,HAL库无法调通,原因不明遂放弃HAL。后来改成LL库测试通过。

 

程序分为三个部分:自动生成的初始化程序,DMA中断程序,采样程序。

/**

  * @brief This function handles DMA1 channel 1 interrupt.

  */

void DMA1_Channel1_IRQHandler(void)

{

  /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */

 

/* Check whether DMA transfer complete caused the DMA interruption */

  if(LL_DMA_IsActiveFlag_TC1(DMA1) == 1)

  {

    /* Clear flag DMA transfer complete */

    LL_DMA_ClearFlag_TC1(DMA1);

   

    /* Call interruption treatment function */

    AdcDmaTransferComplete_Callback();

  }

 

  /* USER CODE END DMA1_Channel1_IRQn 0 */

 

  /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */

 

  /* Check whether DMA transfer error caused the DMA interruption */

  if(LL_DMA_IsActiveFlag_TE1(DMA1) == 1)

  {

    /* Clear flag DMA transfer error */

    LL_DMA_ClearFlag_TE1(DMA1);

   

    /* Call interruption treatment function */

    AdcDmaTransferError_Callback();

  }

 

  /* USER CODE END DMA1_Channel1_IRQn 1 */

}

 

/**

  * @brief This function handles ADC1, COMP1 and COMP2 Interrupts (combined with EXTI 17 & 18).

  */

void ADC_COMP1_2_IRQHandler(void)

{

  /* USER CODE BEGIN ADC_COMP1_2_IRQn 0 */

/* Check whether ADC group regular overrun caused the ADC interruption */

  if(LL_ADC_IsActiveFlag_OVR(ADC1) != 0)

  {

    /* Clear flag ADC group regular overrun */

    LL_ADC_ClearFlag_OVR(ADC1);

 

    /* Call interruption treatment function */

    AdcGrpRegularOverrunError_Callback();

  }

  /* USER CODE END ADC_COMP1_2_IRQn 0 */

 

  /* USER CODE BEGIN ADC_COMP1_2_IRQn 1 */

 

  /* USER CODE END ADC_COMP1_2_IRQn 1 */

}

 

/* USER CODE BEGIN 1 */

 

/* USER CODE END 1 */

2024060211304683.zip (751.03 KB, 下载次数: 0)

 

主要是两个中断函数。void ADC_COMP1_2_IRQHandler(void)和void DMA1_Channel1_IRQHandler(void)

采样程序

    /* Start ADC group regular conversion */

    /* Note: Hardware constraint (refer to description of the functions       */

    /*       below):                                                          */

    /*       On this STM32 series, setting of this feature is conditioned to  */

    /*       ADC state:                                                       */

    /*       ADC must be enabled without conversion on going on group regular,*/

    /*       without ADC disable command on going.                            */

    /* Note: In this example, all these checks are not necessary but are      */

    /*       implemented anyway to show the best practice usages              */

    /*       corresponding to reference manual procedure.                     */

    /*       Software can be optimized by removing some of these checks, if   */

    /*       they are not relevant considering previous settings and actions  */

    /*       in user application.                                             */

    if ((LL_ADC_IsEnabled(ADC1) == 1)               &&

        (LL_ADC_IsDisableOngoing(ADC1) == 0)        &&

        (LL_ADC_REG_IsConversionOngoing(ADC1) == 0)   )

    {

      LL_ADC_REG_StartConversion(ADC1);

    }

    else

    {

      /* Error: ADC conversion start could not be performed */

      Error_Handler();

    }

 

    /* Toggle LED at each ADC conversion */

    LED_On();

    LL_mDelay(LED_BLINK_SLOW);

    LED_Off();

    LL_mDelay(LED_BLINK_SLOW);

 

    /* Note: ADC group regular conversions data are stored into array         */

    /*       "uhADCxConvertedData"                                            */

    /*       (for debug: see variable content into watch window).             */

 

    /* Note: ADC conversion data are computed to physical values              */

    /*       into array "uhADCxConvertedData_Voltage_mVolt" using             */

    /*       ADC LL driver helper macro "__LL_ADC_CALC_DATA_TO_VOLTAGE()"     */

    /*       (for debug: see variable content with debugger)                  */

 

    /* If ADC conversions and DMA transfer are completed, then process data */

    if(ubDmaTransferStatus == 1)

    {

      /* Update status variable of DMA transfer */

      ubDmaTransferStatus = 0;

 

      /* Computation of ADC conversions raw data to physical values

         using LL ADC driver helper macro. */

                    

      for (tmp_index = 0; tmp_index < ADC_CONVERTED_DATA_BUFFER_SIZE; tmp_index++)

      {

                            tmp_value = __LL_ADC_CALC_DATA_TO_VOLTAGE(VDDA_APPLI, uhADCxConvertedData[tmp_index], LL_ADC_RESOLUTION_12B);

                            vf = (float)tmp_value /1000;

                            memset(buffer,0,20);

                       snprintf(buffer,20,"Value= %f\n\r",vf);

                    

                            tmp_index = 0;

                            while(buffer[tmp_index] !=  '\0' && tmp_index < 20)

                            {

                                    while(!LL_USART_IsActiveFlag_TXE(USART2));

                                    LL_USART_TransmitData8(USART2,(uint8_t )buffer[tmp_index]);

                                    tmp_index++;

                            }

 

      }

 

                     LED_Toggle();

      LL_mDelay(500); /* Delay to highlight toggle sequence */

    }

 

    /* USER CODE END WHILE */

 

    /* USER CODE BEGIN 3 */

  }

关键是LL_ADC_REG_StartConversion(ADC1);函数的调用条件,调用后所有的数据DMA保存到数组uhADCxConvertedData当中。

 

测试过程

使用过程校准仪,输出1.5V的信号,测试ADC的转换。

 

测试现场照片。

 

 

此帖出自stm32/stm8论坛

最新回复

ST 大厂的东西玩就是爽   详情 回复 发表于 2024-6-3 07:35
点赞(1) 关注
 

回复
举报

6822

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

ST 大厂的东西玩就是爽

此帖出自stm32/stm8论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表