找回密码
 立即注册
查看: 600|回复: 4

请教STC8H8K64U的DMA-ADC数据传输

[复制链接]
  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 104 天

    [LV.6]常住居民II

    10

    主题

    46

    回帖

    646

    积分

    高级会员

    积分
    646
    发表于 2023-9-7 09:56:25 | 显示全部楼层 |阅读模式
    本帖最后由 清风迎明月 于 2023-9-7 16:24 编辑

    第一次接触DMA,想用DMA-ADC功能实现对多路模拟量的采集,看手册没看懂,论坛里看到有个例程(https://www.stcaimcu.com/forum.p ... 1494&extra=page%3D1),例程更没看懂。
    主要问题是:ADC_DMA 接收地址寄存器(DMA_ADC_RXAx)的作用是什么?
    从例程看,定义了外部存储器所需数据的存放地址,u8 xdata DmaBuffer[ADC_CH][ADC_DATA] _at_ DMA_ADDR;
    但是,主程序中用了
    DMA_ADC_RXAH = (u8)(DMA_ADDR >> 8);        //ADC转换数据存储地址
    DMA_ADC_RXAL = (u8)DMA_ADDR;

    这明显是将外部数据往DMA_ADC_RXAx传送,这么传送的目的是什么?
    那么DmaBuffer[ADC_CH][ADC_DATA]中的数据时怎么获得的?
    回复 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3097

    回帖

    6981

    积分

    超级版主

    积分
    6981
    发表于 2023-9-7 11:20:38 | 显示全部楼层
    将ADC设置好,将DMA设置好,启动一次DMA,硬件会自动帮你完成多通道ADC转换+平均值计算,DMA完成后你去读取结果即可,转换过程中不需要你的CPU去过问。下面的程序给你参考。


    用户请先别修改程序, 直接下载"16-15路12位ADC转换-DMA-串口1(P3.1)返回结果-C语言"里的"ADC.hex"测试.
    下载时选择主频11.0592MHZ. 测试时, 电脑的串口助手设置115200,8,n,1.

    本程序演示15路ADC和bandgap DMA采样,通过串口1(P3.1)发送给上位机,波特率115200,8,n,1.

    0~7通道对应P1.0 P1.1 P5.4 P1.3~P1.7, 8~14通道对应P0.0~P0.6, 15通道为内部1.19V基准电压做输入的ADC值.


    STC8H系列-ADC相关程序.rar (918.47 KB, 下载次数: 76)


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 104 天

    [LV.6]常住居民II

    10

    主题

    46

    回帖

    646

    积分

    高级会员

    积分
    646
     楼主| 发表于 2023-9-7 15:40:51 | 显示全部楼层
    梁工 发表于 2023-9-7 11:20
    将ADC设置好,将DMA设置好,启动一次DMA,硬件会自动帮你完成多通道ADC转换+平均值计算,DMA完成后你去读取 ...

    谢谢梁工,我详细看看哈。
    不过这个程序和我给链接的程序完全是两个风格
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 104 天

    [LV.6]常住居民II

    10

    主题

    46

    回帖

    646

    积分

    高级会员

    积分
    646
     楼主| 发表于 2023-9-7 21:04:05 | 显示全部楼层
    本帖最后由 清风迎明月 于 2023-9-7 21:11 编辑
    梁工 发表于 2023-9-7 11:20
    将ADC设置好,将DMA设置好,启动一次DMA,硬件会自动帮你完成多通道ADC转换+平均值计算,DMA完成后你去读取 ...

    梁工,你给这个程序继续请教一下,还是有地方看的不是很明白,但感觉理解应该八九不离十。
    DMA_ADC_RXA  = adc_tmp;
    这句程序其实就是将ADC每次转换结果的相关数据的存放外部存储器首地址交代清楚了。
    DMA—ADC的工作原理其实就是将每次获取的ADC的数据送入寄存器DMA_ADC_RXA,而DMA_ADC_RXA按指向首地址,结合转换次数等等按顺序去存放ADC各通道的相关数据。
    我上面理解没有错吧?
    不管是看手册,还是我给除链接的程序,还是你这个程序,一直纠结的是DMA_ADC_RXA寄存器的作用。

    我给你那句程序加的注释如下:
    DMA_ADC_RXA  = adc_tmp;        //将外部存放数据首地址赋给DMA_ADC_RXA

    点评

    ADC DMA自动存放结果,则要给DMA指定存放的首地址。DMA_ADC_RXA = adc_tmp;就是给首地址。  详情 回复 发表于 2023-9-8 00:05
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3097

    回帖

    6981

    积分

    超级版主

    积分
    6981
    发表于 2023-9-8 00:05:41 | 显示全部楼层
    清风迎明月 发表于 2023-9-7 21:04
    梁工,你给这个程序继续请教一下,还是有地方看的不是很明白,但感觉理解应该八九不离十。
    DMA_ADC_RXA  = ...

    ADC DMA自动存放结果,则要给DMA指定存放的首地址。DMA_ADC_RXA  = adc_tmp;就是给首地址。
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-26 23:00 , Processed in 0.079700 second(s), 52 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表