跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1M系列
  4. DMA调试时ERS寄存器报配置错误问题

DMA调试时ERS寄存器报配置错误问题

已定时 已固定 已锁定 已移动 YTM32B1M系列
22 帖子 2 发布者 841 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • FrankF 离线
    FrankF 离线
    Frank YunTu
    写于 最后由 编辑
    #4

    传输位宽为4Byte,触发一次后小循环配置为4次(BCNT)

    1 条回复 最后回复
    0
    • N 离线
      N 离线
      NorbertShi
      写于 最后由 编辑
      #5

      不能一次读完16byte么?
      看规格书也是支持16byte 和32byte读取的

      1 条回复 最后回复
      0
      • FrankF 离线
        FrankF 离线
        Frank YunTu
        写于 最后由 编辑
        #6

        源/目的地址跟搬运的位宽要对齐,16Byte跟32Byte是支持的,但是是有条件的,哪怕搬运4字节,也是要地址对齐的

        1 条回复 最后回复
        0
        • N 离线
          N 离线
          NorbertShi
          写于 最后由 编辑
          #7

          1、比如说etimer2.ch1的PPCNT,默认地址就是0x4004B0D8,这种我还能怎么设置对齐地址?
          目标地址是我定义的一个二维数组,地址就分配在0x1FFF8F68,这也没法再调整了啊。
          或者说按您的意思,要实现16byte,必须源/目标地址都在16的倍数上,比如0x4000这种?
          2、比如我现在希望读取etimer2.ch1的PPCNTN开始的4个寄存器,每次触发读取的4个值顺序存在一个二维数组里面,比如uint32 buffer[100][4]
          如果要改成您说的4byte,每次循环4次,那需要怎么设置?

          FrankF 1 条回复 最后回复
          0
          • N 离线
            N 离线
            NorbertShi
            写于 最后由 编辑
            #8

            另外顺带2个DMA模块的问题
            1,dma模块的各个通道之间是否是独立的,比如dma的ch0和ch1同时触发,此时是各读各的还是有优先级顺序的?
            2,在trigger loop时,如果设置了trigger count,执行到一半时,我想重置count,就是重新开始计数,需要如何操作?

            FrankF 1 条回复 最后回复
            0
            • FrankF 离线
              FrankF 离线
              Frank YunTu
              在 回复了 NorbertShi 最后由 编辑
              #9

              NorbertShi 1. 由于你的地址非对齐的,所以DMA不支持你之前的配置模式。2. 传输位宽配置为4字节,BCNT为4,每次小循环地址偏移为4字节,通过STO / DTO 调整一次大循环完成后的搬移地址。

              1 条回复 最后回复
              0
              • FrankF 离线
                FrankF 离线
                Frank YunTu
                在 回复了 NorbertShi 最后由 编辑
                #10

                NorbertShi 1. 先执行ch0 再执行ch1。 2. 可通过修改TCNTRV寄存器 修改trigger count

                1 条回复 最后回复
                0
                • N 离线
                  N 离线
                  NorbertShi
                  写于 最后由 编辑
                  #11

                  我现在按您建议的,同时修改了原来的一次复制4个寄存器的做法,改为一次复制一个寄存器,然后顺序存入一个20个的数组buffer[20],
                  调试时按dma位宽4byte,每次触发DMA传送一个寄存器,每次transfer loop的offset = 0,bcnt = 4byte,
                  trigger设置为trigger loop 的count = 20,TCNTRV = 20.
                  这种设置下可以观察到DMA有工作,并把值复制到指定buffer位置,且填满buffer的数组。
                  但现在问题是写入buffer的值都是一样的,看着像DMA触发后写了20次同一个值。
                  这又是什么设置导致的?

                  image.png

                  image.png

                  FrankF 1 条回复 最后回复
                  0
                  • FrankF 离线
                    FrankF 离线
                    Frank YunTu
                    在 回复了 NorbertShi 最后由 编辑
                    #12

                    NorbertShi SOFF 也需要配置,要不然每次取的都是同一个寄存器的值。按你的需求循环取4个寄存器的值,每次trigger都需要调整源地址,可通过STO或 TCR寄存器中的SMOD方式实现。建议还是先熟悉DMA的基本功能,然后再结合实际需求来配置。

                    1 条回复 最后回复
                    0
                    • N 离线
                      N 离线
                      NorbertShi
                      写于 最后由 编辑
                      #13

                      您误解我意思了,我现在是之前要读4个寄存器,现在不用了,只读其中的一个寄存器,
                      然后希望每次trigger DMA传送到缓存,然后DADDR自增指向缓存下一个地址。
                      20个trigger一个循环。所以SOFF不设置
                      但现在的配置测试出来就是看着像每次trigger后,DMA一次把同一个值全部写入了20个缓存

                      FrankF 1 条回复 最后回复
                      0
                      • FrankF 离线
                        FrankF 离线
                        Frank YunTu
                        在 回复了 NorbertShi 最后由 编辑
                        #14

                        NorbertShi 那就是DMA搬移数据期间寄存器的值没有改变导致的。因为DMA的工作频率跟CORE_CLK一致,搬运20次,花费的时间是ns级的

                        1 条回复 最后回复
                        0
                        • N 离线
                          N 离线
                          NorbertShi
                          写于 最后由 编辑
                          #15

                          那我每次触发后搬运完,不是应该要等待下一次触发才搬运么? 如果寄存器值没变,也没产生触发啊

                          1 条回复 最后回复
                          0
                          • FrankF 离线
                            FrankF 离线
                            Frank YunTu
                            写于 最后由 编辑
                            #16

                            image.png STS寄存器你怎么清的呢,按照你的设计,估计是无法做到DMA trigger loop 一次就清除的。因此大概率会一直触发,直到20次。你应该配置trigger 次数为1次,在DMA完成中断回调里面统计次数,到20次后拿数据,同时修改目的地址到buff的首地址。

                            1 条回复 最后回复
                            0
                            • N 离线
                              N 离线
                              NorbertShi
                              写于 最后由 编辑
                              #17

                              etimer模块触发DMA后读取了,还需要手动清除etimer的STS,否则会一直产生触发导致DMA重复复制。
                              是这么理解的吧?

                              1 条回复 最后回复
                              0
                              • N 离线
                                N 离线
                                NorbertShi
                                写于 最后由 编辑
                                #18

                                etimer的sts寄存器标志位是否有自动清除的设置,不然这样每次读取DMA还要中断来清除标志。

                                FrankF 1 条回复 最后回复
                                0
                                • FrankF 离线
                                  FrankF 离线
                                  Frank YunTu
                                  在 回复了 NorbertShi 最后由 编辑
                                  #19

                                  NorbertShi 没有

                                  1 条回复 最后回复
                                  0
                                  • N 离线
                                    N 离线
                                    NorbertShi
                                    写于 最后由 编辑
                                    #20

                                    在trigger loop时,如果设置了trigger count,执行到一半时,我想重置count,就是重新开始计数,需要如何操作?
                                    这个您的说法是说修改TCNTRV寄存器 修改trigger count
                                    那比如我并不想要修改count,只是想让DMA的trig 重置到初始状态。
                                    就比如DMA trig计数 ,我设置的20次,然后到第8次,我希望将DMA的trig 重新从20开始递减。同时destination address 恢复到初始化时的地址。
                                    这时候直接对TCNTRV寄存器重写一次值可以实现我的要求么? 还是需要其他的操作?

                                    1 条回复 最后回复
                                    0
                                    • N 离线
                                      N 离线
                                      NorbertShi
                                      写于 最后由 编辑
                                      #21

                                      另外补充一些描述,比如我设置了DOFF = 4,然后transfer loop 每次触发后需要读取BCNT = 20,也就是5个u32数,然后trig loop = 10,就是trig 要循环10次。
                                      然后trig 到第8次,transfer loop 执行到第3次,此时我希望DMA trig 重新从10开始,tranfer loop也重新复位开始。
                                      此时要实现该操作是否就是再次写入TCNTRV寄存器一次trig cnt。

                                      FrankF 1 条回复 最后回复
                                      0
                                      • FrankF 离线
                                        FrankF 离线
                                        Frank YunTu
                                        在 回复了 NorbertShi 最后由 编辑
                                        #22

                                        NorbertShi 不行,你需要先cancel掉当前传输,让DMA停下来,然后重新配置CTS。

                                        1 条回复 最后回复
                                        0

                                      • 云途论坛规则/Yuntu Forum Rules

                                        发帖前请查看

                                      • YCT离线License申请流程

                                        帮助没办法联网的电脑使用YCT

                                      • YT CONFIG TOOL调查问卷

                                        帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

                                      • demo
                                        12
                                        can
                                        9
                                        lin stack
                                        6
                                        yt-link
                                        5
                                        vscode
                                        3
                                        adc模块
                                        2
                                        i2c
                                        2
                                        uuid
                                        2
                                        Online Users
                                        • 登录

                                        • 登录或注册以进行搜索。
                                        • 第一个帖子
                                          最后一个帖子
                                        0
                                        • 版块
                                        • 最新
                                        • 标签
                                        • 热门