DMA与ADC的配置

本文详细介绍了STM32中的DMA技术,一种无需CPU干预即可实现高速数据传输的方法,并探讨了如何设置DMA进行存储器间的数据传输。此外,还深入讲解了ADC的功能及其在STM32中的应用,包括模拟到数字的转换过程及具体编程步骤。

(一)STM32中的搬运工-----DMA
    特点:不需要CPU的干预
    作用:实现存储器和外设之间或者存储器和存储器之间的高速数据传输
    
   1》DMA搬运数据的宽度   字节——8bit   半字——16bit  全字——32bit
   
   2》利用DMA实现存储器到存储器的数据传输
    1,打开时钟----DMA1
    2,初始化DMA
        ----外设基地址
        ----存储器基地址
        ----传输方向
        ----传输数目
        ----外设地址是否递增
        ----存储器地址是否递增
        ----外设传输的数据宽度
        ----存储器传输的数据宽度
        ----模式---正常或循环
        ----优先等级
        ----存储器到存储器是否使能
    3,使能DMA
    4,判断是否传输完成
    5,清除标志位,检验是否传输成功
    
-----------------------------------------------
(二)模拟数字转换器-----ADC

    1>模拟量是随着时间的变化,电压值是连续变化的,数字量是离散的。
    2>ADC就是用来读电压值
    3>规则转换:ADC按照事先设定好的依次进行转换
      注入转换:类似于中断,当注入转换发起时,先进行注入转换,注入转换完成后在进行规则转换
      
    4>参考STM3210x中文参考手册
    
    1>检测AD按键的键值和光敏电阻,编程步骤:
        1,打开时钟----ADC1,DMA1,GPIOC,AFIO
        2,ADC预分频器---6分频
        3,初始化GPIOC
            ----GPIO_Pin_0|GPIO_Pin_1
            ----模拟输入
        4,初始化ADC1
            ----ADC独立模式
            ----连续转换
            ----使用扫描模式
            ----不使用外部触发
            ----右对齐方式
            ----2个通道
        5,初始化DMA1
            ----外设基地址------&ADC1->DR
            ----存储器基地址----ADC_DATA[][]---数组
            ----传输方向--------外设作为数据来源
            ----传输数目--------100
            ----外设地址是否递增--否
            ----存储器地址是否递增--是
            ----外设传输的数据宽度--半字——16bit
            ----存储器传输的数据宽度-半字——16bit
            ----模式---正常或循环---循环
            ----优先等级---高级
            ----存储器到存储器是否使能---否
        6,使能ADC的DMA
        7,使能DMA1的通道1-----通过DMA的通道一览表去查看
        8,配置通道10和通道11的转换顺序和采样时间
        9,使能ADC1
        10,重置校准寄存器
        11,等待重置校准寄存器成功-----reset 代表成功
        12,开始校准
        13,等待校准成功-----reset 代表成功
        14,启动---软件触发ADC1
        
        
        uint16_t ADC_RG_VALUE(void)
        {
            uint32_t SUM=0;
            uint8_t i;
            for(i=0;i<DATA_size;i++){
                SUM=SUM+ADC_DATA[i][0];
            }
            return (uint16_t)(SUM/DATA_size);
        }


        uint16_t ADC_KEY_VALUE(void)
        {
            uint32_t SUM=0;
            uint8_t i;
            for(i=0;i<DATA_size;i++){
                SUM=SUM+ADC_DATA[i][1];
            }
            return (uint16_t)(SUM/DATA_size);
        }

### C2000微控制器中DMA-ADC配置的相关信息 C2000微控制器支持直接内存访问(DMA)功能,该功能可以显著减少CPU的负担,并提高数据传输效率。通过使用DMAADC结合,可以实现高效的模拟信号采集和处理。在C2000系列中,DMA控制器能够自动从ADC模块读取转换结果并将其存储到指定的内存位置,从而避免了CPU频繁中断[^1]。 #### DMA-ADC配置方法 在C2000微控制器中,配置DMA以配合ADC工作需要以下几个关键步骤: 1. **初始化DMA模块**:配置DMA通道以接收来自ADC的结果。 2. **设置ADC触发源**:确保ADC的触发源DMA同步,以便在每次转换完成后自动启动DMA传输。 3. **配置DMA传输参数**:定义传输的目标地址、传输长度等。 4. **启动ADCDMA**:启动ADC转换,并启用DMA通道进行数据传输。 以下是具体的示例代码,展示如何配置C2000微控制器中的DMAADC模块协同工作: ```c // 初始化DMA模块 void DMA_init() { DmaRegs.CH1.CONTROL.bit.SIZE = 0; // 字节传输模式 DmaRegs.CH1.CONTROL.bit.DST_INCR = 0; // 目标地址不递增 DmaRegs.CH1.CONTROL.bit.SRC_INCR = 1; // 源地址递增 DmaRegs.CH1.CONTROL.bit.TRIG_MODE = 1; // 触发模式为硬件触发 DmaRegs.CH1.CONTROL.bit.INT_ENABLE = 1; // 启用中断 } // 配置ADC模块以配合DMA void ADC_DMA_init() { AdcRegs.ADCTRL1.bit.ACQ_PS = 6; // 设置采样窗口 AdcRegs.ADCTRL3.bit.SMODE_SEL = 3; // 设置连续转换模式 AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; // 允许覆盖序列 AdcRegs.ADCTRL1.bit.CNT_EN = 1; // 启用计数器 AdcRegs.ADCMAXCONV.all = 0x00; // 设置最大转换数 AdcRegs.ADCTRL1.bit.CONV_MODE = 0; // 单次转换模式 AdcRegs.ADCTRL1.bit.DMA-arm = 1; // 启用DMA触发 } // 主函数 void main() { uint16_t *dmaBuffer = (uint16_t *)0x00800000; // 定义DMA缓冲区地址 DMA_init(); // 初始化DMA ADC_DMA_init(); // 初始化ADC以配合DMA DmaRegs.CH1.SRC_END_PTR.bit.PTR = &AdcRegs.ADCRESULT0; // 设置源地址 DmaRegs.CH1.DST_END_PTR.bit.PTR = dmaBuffer; // 设置目标地址 DmaRegs.CH1.BURST_CNT.all = 10; // 设置传输长度为10个字节 AdcRegs.ADCTRL1.bit.AD_ST = 1; // 启动ADC转换 } ``` #### 关键点说明 - **DMA触发**:在上述代码中,`AdcRegs.ADCTRL1.bit.DMA_arm`被设置为1,这意味着每次ADC完成转换后将触发DMA传输[^1]。 - **传输长度**:`DmaRegs.CH1.BURST_CNT.all`定义了每次DMA传输的数据量。 - **缓冲区管理**:DMA的目标地址应指向一个预分配的缓冲区,用于存储ADC的转换结果。 #### 性能考量 对于实时控制系统,选择合适的ADC采样率和DMA传输速率至关重要。例如,若系统需要处理500kHz开关频率下的信号,建议选用采样率高于4Msps的ADC模块[^3],以确保有足够的CPU时间进行其他任务处理。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__Lewis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值