STM32F072+FREE RTOS+DMA+ADC cubemx

这次的主要目的是学习使用DMA的方式读取adc取得的数据,然后发送给串口显示。

第一步

使用CUBEMX进行配置,这里我用的是IN10,注意要在里面的模式 DMA continuous Requests 选为ENable。否则,读出的数据只有上电的这次。

 

第二步。设置DMA的

第三步,生成代码。

 hadc.Instance = ADC1;
  hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
  hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc.Init.LowPowerAutoWait = DISABLE;
  hadc.Init.LowPowerAutoPowerOff = DISABLE;
  hadc.Init.ContinuousConvMode = ENABLE;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.DMAContinuousRequests = ENABLE;
  hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  if (HAL_ADC_Init(&hadc) != HAL_OK)

这是初始化的代码

第四步

在任务中执行如下代码

void Demo_DMA_ADC(void)
{
    for(DMA_ADC_i=0;DMA_ADC_i<9;DMA_ADC_i++)
    {
        for(DMA_ADC_j=DMA_ADC_i+1;DMA_ADC_j<10;DMA_ADC_j++)
        {
            if(ADC_DMA_VALUE[DMA_ADC_i]>ADC_DMA_VALUE[DMA_ADC_j])
            {
                ADC_temp=ADC_DMA_VALUE[DMA_ADC_i];
                ADC_DMA_VALUE[DMA_ADC_i]=ADC_DMA_VALUE[DMA_ADC_j];
                ADC_DMA_VALUE[DMA_ADC_j]=ADC_temp;
            }
        }
    }
    ADC_SUM=0;
    for(DMA_ADC_i=0;DMA_ADC_i<10;DMA_ADC_i++)
    {
        ADC_SUM=ADC_SUM+ADC_DMA_VALUE[DMA_ADC_i];
        printf("ADC= 0x%04X\r\n",ADC_DMA_VALUE[DMA_ADC_i]);
    }
    ADC_Average=ADC_SUM/10;
    printf("ADC= 0x%04X\r\n",ADC_SUM);
    printf("ADC= 0x%04X\r\n",ADC_Average);
}
OK

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值