DMA与ADC的配置

(一)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);
        }

上一篇:操作系统I/O方式总结


下一篇:【烧脑技术贴】无法回避的字节对齐问题,从八个方向深入探讨(变量对齐,栈对齐,DMA对齐,结构体成对齐,Cache, RTOS双堆栈等)