STM32 ADC采样电压(轮询、中断、DMA)HAL库

《DMA配置的一些知识》


DMA的模式:

  1. Normal模式(不循环模式):当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次。
  2. Circular模式(循环模式):传输完成后又重新开始继续传输,不断循环永不停止(一般用于处理循环缓冲区和连续的数据传输(如ADC的扫描模式))。

当开启循环模式之后,数据传输的数目变为0时,将会自动地恢复成配置通道时设置的初值,DMA操作将会继续进行。


data width:数据宽度

byte:字节,通用8位,与u8相同

word:字长,与硬件的位数相同,STM32是32位,所以对应是u32

Half Word:半个字长,所以对应是u16

一、ADC单通道+轮询模式

ADC单通道+单次转换模式(只转换一次)+不扫描模式(只有一个通道)

int main()
{
    // 初始化ADC
    MX_ADC1_Init();
    /* 开启 ADC自动校准 */
    if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
    {
        Error_Handler();
    }

    while (1)
    {
        /* The ADC1 starts collecting the voltage of the supercapacitor */
        HAL_ADC_Start(&hadc1);
        if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
        {
            adcValue = HAL_ADC_GetValue(&hadc1);
            supercapV = (uint32_t) adcValue * 3300 / 0xFFFF;
        }
        HAL_ADC_Stop(&hadc1);
    }
}

二、ADC单通道+中断

uint16_t ADC_Values;

int main()
{
    // 初始化ADC
    MX_ADC1_Init();
    // 开启ADC自动校准
    if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
    {
        Error_Handler();
    }
    //开启ADC使能中断
    HAL_ADC_Start_IT(&hadc1);

    while (1)
    {

### STM32 ADC 电压采集 使用 中断DMA 示例教程 #### 配置环境准备 为了实现STM32通过ADC进行电压采集并结合中断DMA方式,需先完成必要的硬件连接以及软件初始化工作。确保已安装最新版本的STM32CubeMX工具用于生成初始项目框架,并选择了合适的开发板型号。 #### 初始化设置 利用STM32CubeMX配置ADC模块为连续转换模式,使能DMA请求功能,同时开启相应的NVIC中断源以便处理每次转换结束事件。对于具体的寄存器操作细节可参见官方文档[^1]。 #### 编程实现 下面给出一段简化版代码片段来展示如何编程实现上述功能: ```c // 定义全局变量存储ADC采样值数组指针 uint16_t *AdcConvertedValue; void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){ // 当DMA传输完成后触发此回调函数 // 可在此处加入进一步的数据处理逻辑或标志位更新 } int main(void){ /* 用户应用初始化 */ AdcConvertedValue = (uint16_t *)malloc(sizeof(uint16_t)*NUMBER_OF_CHANNELS); if(HAL_OK != HAL_ADC_Start_DMA(&hadc, (uint32_t*)AdcConvertedValue, NUMBER_OF_CHANNELS)){ Error_Handler(); } } ``` 这段程序展示了启动DMA传输的过程,当所有指定数量的样本被成功转移到内存缓冲区后会调用`HAL_ADC_ConvCpltCallback()`回调函数来进行后续处理[^2]。 #### 数据获取与处理 一旦DMA完成了预定次数的数据搬运动作,则可以通过访问之前分配给它的目标地址空间轻松取得最新的测量结果。此时可以在主循环里定期查询该位置的内容变化情况,或是借助外部定时器产生周期性的轮询机制以达到实时监测的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值