硬汉嵌入式论坛

 找回密码
 立即注册
查看: 9968|回复: 44
收起左侧

[FMC] 努努力,今天发布V7,V6和V5的FMC DMA双缓冲驱动AD7606,全程硬件控制【已经发布】

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-5-24 08:55:45 | 显示全部楼层 |阅读模式
2020-08-04 补充
教程已经发布,第77章。

【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980








回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-5-24 19:05:54 | 显示全部楼层
V5使用的硬件接线方式不支持这种操作,详情看此贴:

这么多年了,才发现STM32F4系列使用DMA1的大坑,只有DMA2才是完全体
http://www.armbbs.cn/forum.php?m ... 7900&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

82

主题

401

回帖

667

积分

金牌会员

积分
667
QQ
发表于 2020-5-24 19:52:11 | 显示全部楼层
武汉天纵鹏元科技有限公司。承接嵌入式项目开发,相关技术交流。STM32,物联网,工业控制方向。QQ  408137104
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-5-25 03:41:38 | 显示全部楼层
终于把教程更新完毕了
回复

使用道具 举报

12

主题

141

回帖

177

积分

初级会员

积分
177
发表于 2020-5-25 06:22:29 | 显示全部楼层
eric2013 发表于 2020-5-25 03:41
终于把教程更新完毕了

硬汉,你是一个晚上都没睡阿,真的不要这么辛苦了,身体要紧
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2020-5-25 10:43:06 | 显示全部楼层
谢谢硬汉哥的付出。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-5-25 11:36:37 | 显示全部楼层
gnail092 发表于 2020-5-25 06:22
硬汉,你是一个晚上都没睡阿,真的不要这么辛苦了,身体要紧

回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2020-5-25 12:59:02 | 显示全部楼层
战斗狂魔

开启白嫖模式
代码不规范,亲人两行泪!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-5-26 00:17:20 | 显示全部楼层
missfox 发表于 2020-5-25 12:59
战斗狂魔

开启白嫖模式

客气客气,搞起来。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2020-8-4 21:56:48 | 显示全部楼层
求教程开启白嫖模式
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-8-4 22:29:34 | 显示全部楼层
小堕多 发表于 2020-8-4 21:56
求教程开启白嫖模式

教程已经发布,第77章。

【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2020-8-19 16:43:35 | 显示全部楼层
得益于AD7606可以在转化期间读取上次转换的数据,而且这个时间还很长(最短也在4us左右)。
刚翻了一下AD7616的数据手册,并没有提到转换期间可以读取数据,也没有相关的时序图,
而且7616的序列要求最大需要读取32次。这个STM32的突发模式也不支持。
AD7606踩了DMA1的坑,新方案中的AD7616似乎又不支持这种骚操作,悲剧。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-8-19 17:18:18 | 显示全部楼层
云琴箫龙 发表于 2020-8-19 16:43
得益于AD7606可以在转化期间读取上次转换的数据,而且这个时间还很长(最短也在4us左右)。
刚翻了一下AD7 ...

挂载两片AD7606就爽了。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2020-8-19 17:23:41 | 显示全部楼层
eric2013 发表于 2020-8-19 17:18
挂载两片AD7606就爽了。

成本压力太大,一片AD7616可以采集16路(伪同步),价格却只有7606的三分之二。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2020-8-19 17:36:43 | 显示全部楼层
此方法是降低了FMC读取AD7606的时间,尽管实际整个直接读取过程也不到1us的时间,但有个最大的痛点还存在。
以每周波采集512点为例,无论哪种方式,都不可避免的会39us产生一个中断信号,中断里面是没干多少事儿,但在操作系统下,进行压栈出栈和任务调度,这个时间其实已经远远超过中断里面干的那点儿事儿所耗费的时间了。
我们实际应用每个通道累计采集512点后才进行一次运算处理,也就是20ms才处理一次数据,却在这期间产生了512次中,感觉挺浪费CPU资源。
所以我在探索,有没有一种操作,可以让它累计采集512次后再触发一个中断。
不知硬汉哥有有没有什么建议?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-8-19 21:01:07 | 显示全部楼层
云琴箫龙 发表于 2020-8-19 17:36
此方法是降低了FMC读取AD7606的时间,尽管实际整个直接读取过程也不到1us的时间,但有个最大的痛点还存在。 ...

看到你的最后一句话 : “有没有一种操作,可以让它累计采集512次后再触发一个中断”

你理解有偏差,我这个例子是为了J-Scope展示波形采集效果,才做的采集8路展示一次。

这个例子可以设置DMA支持的最大值,怎么玩都行。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2020-8-20 08:53:49 | 显示全部楼层
eric2013 发表于 2020-8-19 21:01
看到你的最后一句话 : “有没有一种操作,可以让它累计采集512次后再触发一个中断”

你理解有偏差, ...

嗯嗯,因为最近涉及到采样计算,恰好又看到这篇帖子,所以思维有点儿发散了,感谢提供J-Scope的教程,前期采样调试阶段确实很方便。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-8-20 11:01:35 | 显示全部楼层
云琴箫龙 发表于 2020-8-20 08:53
嗯嗯,因为最近涉及到采样计算,恰好又看到这篇帖子,所以思维有点儿发散了,感谢提供J-Scope的教程 ...

后面得把这个问题说明放在教程开头,让大家一眼就可以看到,这样理解就方便了。
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
发表于 2020-10-21 10:43:56 | 显示全部楼层
没发现有库函数版本的
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
发表于 2020-10-21 10:44:37 | 显示全部楼层
没发现有库函数版本的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-10-21 10:46:37 | 显示全部楼层
zhengwending 发表于 2020-10-21 10:44
没发现有库函数版本的

现在全部采用HAL版了,标准版暂不做了。
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2021-4-25 09:44:41 | 显示全部楼层
请问大佬,V6板子FMC DMA的例程,为什么200K采样的时候,dma实际采集的中断只有100K?,PWM是200k的,不使用dma使用中断采集是正常的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-4-25 10:14:29 | 显示全部楼层
wzyrr520 发表于 2021-4-25 09:44
请问大佬,V6板子FMC DMA的例程,为什么200K采样的时候,dma实际采集的中断只有100K?,PWM是200k的,不使 ...

在V6上测试的吗
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2021-4-25 13:20:59 | 显示全部楼层

对的。V6板子
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2021-4-26 09:40:10 | 显示全部楼层

HAL_DMA_Start_IT(&TIMDMA, (uint32_t)AD7606_BASE, (uint32_t)g_sAd7606Buf, 16);

实测把这句的16改成8就行了,,实际调试发现16的时候,是采集了两轮16个数据
回复

使用道具 举报

15

主题

54

回帖

99

积分

初级会员

积分
99
发表于 2021-9-28 15:58:41 | 显示全部楼层
正在使用AD7606,参考您这边的例程。  您这边用的是8个节拍的1次突发模式 ,想问一下 ,可以实现 2个节拍1次突发吗?(只要前面的2个通道采的数据)。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-9-28 16:30:14 | 显示全部楼层
smare 发表于 2021-9-28 15:58
正在使用AD7606,参考您这边的例程。  您这边用的是8个节拍的1次突发模式 ,想问一下 ,可以实现 2个节拍1 ...

AD7606不能仅采集两个通道,8个通道是顺序依次输出的。
回复

使用道具 举报

15

主题

54

回帖

99

积分

初级会员

积分
99
发表于 2021-9-28 17:17:04 | 显示全部楼层
感谢!您这边的回复。型号有点差别, 我这边实际用的应是AD7616,因为这个芯片是内部有两路AD同步采样的, 其它的时序之类的都各AD7606差不多。 就是启动一次,转换完成需要读两拍,分别读出A,B路的数据。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-9-29 09:29:46 | 显示全部楼层
smare 发表于 2021-9-28 17:17
感谢!您这边的回复。型号有点差别, 我这边实际用的应是AD7616,因为这个芯片是内部有两路AD同步采样的,  ...

可以试试这个,没有2个节拍的一次突发
QQ截图20210929092923.png
回复

使用道具 举报

56

主题

904

回帖

1072

积分

至尊会员

积分
1072
发表于 2021-9-30 09:53:46 | 显示全部楼层
AD7606 我们准备改成TI 的 ADS8598H  ADS8698,  体积小一圈,引脚少很多。 一些初始化需要IO的配置全部通过SPI完成。可以初始化后回读来加强鲁棒性。  
最近这几年感觉模拟设计有很大进展。SAR的多通道AD终于突破到 18bit,估计再过年20Bit 24bit成标配。  sigma-delta的速度实在是太慢了。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2022-6-4 12:24:09 | 显示全部楼层
太强了,学习一下
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2022-12-5 19:45:32 | 显示全部楼层
roguebear 发表于 2021-9-30 09:53
AD7606 我们准备改成TI 的 ADS8598H  ADS8698,  体积小一圈,引脚少很多。 一些初始化需要IO的配置全部通 ...

您好,请问 ADS8598H  ADS8698是搭配STM32H7使用的么?请问成效如何?
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-1-13 16:56:38 | 显示全部楼层
您好,我想问一下我参考V7移植的FMC DMA双缓冲驱动AD7606为什么只能上电的时候读一下,上电后改变电压值采集到的数据不会变化
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2023-1-14 09:35:01 | 显示全部楼层
电子界小菜鸟 发表于 2023-1-13 16:56
您好,我想问一下我参考V7移植的FMC DMA双缓冲驱动AD7606为什么只能上电的时候读一下,上电后改变电压值采 ...

也是H7系列吗,如果是的话,应该是Cache/MPU没有处理好。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-1-16 10:05:16 | 显示全部楼层
本帖最后由 电子界小菜鸟 于 2023-1-16 10:08 编辑
eric2013 发表于 2023-1-14 09:35
也是H7系列吗,如果是的话,应该是Cache/MPU没有处理好。

void MPU_Config(void)
{
  MPU_Region_InitTypeDef MPU_InitStruct = {0};

  /* Disables the MPU */
  HAL_MPU_Disable();
  /** Initializes and configures the Region and the memory to be protected
  */
  
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  MPU_InitStruct.BaseAddress = 0x60000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_64KB;
  MPU_InitStruct.SubRegionDisable = 0x00;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /* Enables the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

}
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-1-16 10:07:18 | 显示全部楼层
eric2013 发表于 2023-1-14 09:35
也是H7系列吗,如果是的话,应该是Cache/MPU没有处理好。

void MPU_Config(void)
{
  MPU_Region_InitTypeDef MPU_InitStruct = {0};

  /* Disables the MPU */
  HAL_MPU_Disable();
  /** Initializes and configures the Region and the memory to be protected
  */
  
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  MPU_InitStruct.BaseAddress = 0x60000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_64KB;
  MPU_InitStruct.SubRegionDisable = 0x00;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /* Enables the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

}
这是我的MPU设置,我看了一下你好还有 配置AXI SRAM的MPU属性为Non-cacheable,我是不是也要加上
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-1-16 10:15:05 | 显示全部楼层
eric2013 发表于 2023-1-14 09:35
也是H7系列吗,如果是的话,应该是Cache/MPU没有处理好。

好的,谢谢,已经解决
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2023-3-18 10:32:01 | 显示全部楼层
eric2013 发表于 2020-8-19 21:01
看到你的最后一句话 : “有没有一种操作,可以让它累计采集512次后再触发一个中断”

你理解有偏差, ...

DMA突发模式不是有1K地址边界问题吗,这样的话DMA传输最大长度岂不是只能设置1K?
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2023-3-18 10:46:22 | 显示全部楼层
eric2013 发表于 2020-8-19 21:01
看到你的最后一句话 : “有没有一种操作,可以让它累计采集512次后再触发一个中断”

你理解有偏差, ...

DMA突发模式不是有1K地址边界问题吗,这样的话DMA传输最大长度岂不是只能设置1K?
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2023-3-18 11:00:13 | 显示全部楼层
例程中有关首次启动,第1组数据全0的问题,是否是PWM(CONVST引脚)配置不合理导致的,AD7606手册上写的是CONVST上升沿才触发采样,我看例程中配置的是先高电平再低电平为下降沿,这样的话当发生TIM更新事件才能产生上升沿,立马就读取肯定读取不到数据,这样每次触发读取的实际是上一次触发的数据,所以第一次读取不到全为0,PWM改为先低电平再高电平,或者改为PWM2就好了
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 06:38 , Processed in 0.465821 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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