HAL库的STM32L431RCTx的ADC单通道与多通道使用与DMA的使用

先分别讲单通道和多通道

单通道

首先是CubeMX中的配置

我这里选择的是ADC1的4号通道,异步时钟,不分频。有些同学这里可能无法选择不分频(by 1)或者(by 2)这是因为ADC有最大的时钟频率限制,比如12MHz等等。然后是最大位数是12位,即2的12次方。右对齐。其他默认就好  

我这里使用了中断

代码部分

//首先是中断函数
uint32_t light_value;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef*hadc)
{
    light_value = HAL_ADC_GetValue(&hadc1);
    printf("light_value:%d\r\n",light_value);
}
//在主循环中开启中断就好
      HAL_ADC_Start_IT(&hadc1);

多通道

CubeMX配置

我这里打开的是通道三和通道四

所以箭头所指数字为2

红色方框中通道3和通道4的排列顺序代表了采样的顺序

代码部分

//中断部分
uint32_t light_value;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef*hadc)
{
    while( !(hadc1.Instance -> ISR & (1<<2)));
    light_value = HAL_ADC_GetValue(&hadc1);
    printf("light_value1:%d\r\n",light_value);
    
    while( !(hadc1.Instance -> ISR & (1<<2)));
    light_value = HAL_ADC_GetValue(&hadc1);
    printf("light_value2:%d\r\n",light_value);
    
    HAL_ADC_Stop(&hadc1);
}
//主函数中开启
      HAL_ADC_Start_IT(&hadc1);

现在是DMA了

这里选择的是外设到内存,数据长度是16位(Half Word)

uint16_t adc_value[2] = {0};

HAL_ADC_Start_DMA(&hadc1, (uint32_t*) adc_value, 2);//每次使用都要用这个函数    


void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    if (hadc->Instance == ADC1)
    {
        printf("1:%d, 2:%d\r\n",adc_value[0],adc_value[1]);
    }
}

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值