公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

几年前,我已经广泛使用了 PSOC 1。 几年前我还购买了 PSOC5 开发套件,最近我决定探索它。 我用 C 很生锈 —— 很多 PSOC1 的东西都是用汇编器来获得精确的时机。

我想探索的是使用DMA通道读取TimerStatus寄存器,从而清除中断(如果可能的话,文档说读取状态寄存器可以清除中断,但读取是否包括DMA读取)。

我附上了一个小项目。 它目前有一个 isr,一旦我计算出了 DMA 位,它就会被删除。

(测试时只会注释掉 isr_1_start (); 函数)

使用 DMA 向导,我有两个问题。

上位地址位在 “全局设置” 中设置。 这应该是 sram 吗?

如何为源指定 timer_1_statusRegister?

0 点赞
1 解答
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 Rohan

好的,我用那个例子中的提示解决了我的问题。

DMA 向导还有一些不足之处。

#define DMA_1_SRC_BASE (CYDEV_SRAM_BASE) 确定源所在的内存。 但是,在代码中,它只使用上面的 16 位 (Hi16)

设置实际源地址时,它只使用较低的 16 位 (Lo16)

CYDEV_SRAM_BASE = 0x1fff8000

UBD 计时器实例的状态寄存器为 timer_1_timerudb_rststs_ststs_stsreg__status_reg,它解析为 CYREG_B0_UDB03_ST,最终解析为 0x40004643。

#define DMA_1_SRC_BASE (0x40004643U)

CyDmaTdSetAddress 源 CAN 也设置为 0x40004643。

但这是绝对的,仅适用于这个计时器实例,所以在这两种情况下,我都使用了 timer_1_timerudb_rststs_stsreg__sts_status_reg。

理想情况下,我应该使用 CYDEV_DMA_BASE 然后让 Creator 像文档所说的那样将其调整为 0x4000xxxx,但事实并非如此。 (改天再来个问题)

所以这是一条陡峭的学习曲线,但我最终还是实现了目标。

我要说的是,关于DMA的文档确实遗漏了很多内容。

再次感谢你的帮助

 

 

在原帖中查看解决方案

0 点赞
7 回复数
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨 @BernieK

 

请在下面找到如何为 psoc5 配置 dma。 您 CAN 参考 PSoC 创建器中 InterIc 声音示例的代码示例。

Rohan136_0-1692964585630.png

 

#define rxDMA_dst_Base (CYDEV_SRAM_BASE) 用于高位。

 

附言:我会用 timer_1_statusRegister 的地址回来的 

 

问候,

罗汉

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 Rohan

谢谢你的回答。 我会研究一下这个例子

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 Rohan

好的,我用那个例子中的提示解决了我的问题。

DMA 向导还有一些不足之处。

#define DMA_1_SRC_BASE (CYDEV_SRAM_BASE) 确定源所在的内存。 但是,在代码中,它只使用上面的 16 位 (Hi16)

设置实际源地址时,它只使用较低的 16 位 (Lo16)

CYDEV_SRAM_BASE = 0x1fff8000

UBD 计时器实例的状态寄存器为 timer_1_timerudb_rststs_ststs_stsreg__status_reg,它解析为 CYREG_B0_UDB03_ST,最终解析为 0x40004643。

#define DMA_1_SRC_BASE (0x40004643U)

CyDmaTdSetAddress 源 CAN 也设置为 0x40004643。

但这是绝对的,仅适用于这个计时器实例,所以在这两种情况下,我都使用了 timer_1_timerudb_rststs_stsreg__sts_status_reg。

理想情况下,我应该使用 CYDEV_DMA_BASE 然后让 Creator 像文档所说的那样将其调整为 0x4000xxxx,但事实并非如此。 (改天再来个问题)

所以这是一条陡峭的学习曲线,但我最终还是实现了目标。

我要说的是,关于DMA的文档确实遗漏了很多内容。

再次感谢你的帮助

 

 

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

既然你对使用中断例程不感兴趣,那么为什么要使用 isr 输出呢?

CAN 改用“tc”输出引脚,无需清除。

0 点赞
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @odissey1 

感谢您的回复。

这种设计是概念的证明。 从长远来看,我已经附上了更多我想要实现的目标。 我想用倍数的基本电路来测量几种不同的不相关的时间信号。 通过使用 DMA,我希望在使用 cpu 实际处理这些信号时避免任何形式的协调或时间限制。 请注意,此示例中没有代码。

在(或者如果)我能够解决原始问题之前,甚至没有理由尝试第二次迭代。

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

CAN 请您描述一下项目的目标? 据我了解,有几条数字线路,PSoC 必须捕获这些线路上的 UP/DN 转换,并为每条线路记录一个时间戳。 信号是"自由滚动的 " ——本身没有启动触发器,在录制过程中,每行可能有多个向上/向下转换。 所需的时间分辨率约为 100ns(约 10MHz)。 而且时基是(固定/连续?)

这是对的吗?

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

@odissey1 谢谢你的回复。

我添加第二个项目的唯一原因是为了回答你的问题,即为什么我不能像你在第一个答案中所建议的那样使用 TC。

是的,其目的是记录信号向"上"和"向下"部分的时间。 信号是连续的,并且随着时间的推移而变化,都是高&低时段。

第二个项目只是它将在哪里使用的一个例子,第一个项目是我想解决的概念。

我想 @Rohan136 已经为我想要的东西提供了必要的指针。 我只需要弄清楚如何应用它。

我正在使用最初的概念作为学习练习。 如果原始概念 CAN 得到解决,它将为未来的设计(例如第二个项目)增加一种可能性。

0 点赞