F28M35x例程enet_uip_m3 - uDMA的无法响应中断的问题

Other Parts Discussed in Thread: F28M35H52C

硬件平台:  F28M35H52C的自主开发的板子

                    根据自己的硬件平台修改了  set_pinout_f28m35x.c  .h 文件实现io的配置

软件开发现状:

                      通过例程确认了:已经实现了enet、led、uart等接口的正确。

                       例程实现led的blinky_m3、enet_lwip\enet_ptpd_m3,双核共享ram的等例程。

目前在开发整体的嵌入式软件,需要把各个接口整合起来,具体做法,是

基于双核例程,manage_ram为基础逐步添加新的驱动,最终形成目标的软件。

  • 但是基于RAM_management的例程扩展,逐步添加了LED、UART接口,但是在添加enet-uip-m3的例程,发现问题。

    (备注:单独的enet-uip-m3例程已经实现并确认)

    基本过程:

     1 -将源文件的enet-uip.c拆分为2个部分, 一个enet-uip.h,主要保存全局配置的宏定义。一个整合到主题main文件(RAM_management_m3.c)

          详见附件。

    2- enet-uip移植过程,就个人理解,依次是下列步骤

        ① 硬件初始化:

              包括ENET硬件:gpio端口配置(set_pinout_f28m35x.c )、外设时钟使能、配置寄存器

              包括systick系统时钟初始化

              uDMA的初始化,用于发送和接收聚聚

        ② uip的初始化,包括mac地址、静态ip

        ③全局控制标志g_ulFlags的设置。

        ④ 配置  EthernetIntHandler 为 处理  INT_ETH(网口中断)、INT_UDMA(udma软件中断)的ISR

            SysTickIntHandler()为系统节拍的ISR,为uip 的timer提供时间计数

         ⑤实现机理:EthernetIntHandler中断例程修改标志位,main-loop根据标志位做具体操作。

         uip的移植文章很多了,F28M35基本上就是类似。

         通过EthernetIntHandler提供驱动,根据中断源修改全局状态标志g_ulFlags,

        main函数有个mainloop循环,轮询各个g_ulFlags来处理数据。

    EthernetPacketGetDMA 函数中通过    uDMAChannelRequest(UDMA_CHANNEL_ETH0RX);

    来软件中断  udma,发起一个dma传送,接收网络数据,

    正确的原例程,会引起 EthernetIntHandler 的中断响应。

    而我修改过的,则一直停留在下一个语句。

    // Wait for the previous transmission to be complete.
    while(HWREGBITW(&g_ulFlags, FLAG_RXPKTPEND) == 1)
    {
    }

  • 已经做过的尝试:

    1 debug运行检查和对比了正确和错误的UDMA寄存器情况:(主要全一样)

    当 运行过 uDMAChannelEnable(UDMA_CHANNEL_ETH0RX);

          正确的源程序:                                          错误的

    DMASWREQ  = 0000 0000(不变)       DMASWREQ  = 0000 0040(表示通道6,符合记录)

    DMAENASET =>0000 0000 (变化)             

    DMAENACLR =>0000 0000(变化)  

    2 观察COREPERIPH寄存器

    正确的源程序

    uDMAChannelEnable指令后                          == 》    进入EthernetIntHandler后

    NVIC_PEND1    => 0x0000 4000                                  NVIC_PEND1    => 0x0000 0000

    NVIC_UNPED1    => 0x0000 4000                              NVIC_UNPED1    => 0x0000 0000

    NVIC_ACTIVE1    => 0x0000 0000                              NVIC_ACTIVE1    => 0x0000 4000

    而不正确的程序,则完全没有变化。

    问题是:

    1 - 基本上拷贝源程序,为什么会有这样的问题。

    2 - m3核的中断寄存器是怎么个机理。怎么调试,确认。

  • 调试思路如下,高手大侠帮忙提点:

    uDMA的软中断无法跳入,怀疑几种可能;

    1  系统中断全局屏蔽    ----  因为systickhandle可以响应,排除

    2   对应uDMA中断允许没有置位

    3   被高优先级的中断霸占;

    4  程序isr例程跳转表错误

    5 前面的中断,没有清楚标志位。

  • 我与你的情况差不多,但用F28M35x_generic_wshared_M3_RAM.cmd在内存调试正常,但用F28M35x_generic_wshared_M3_Flash.cmd在Flash中就停在和你一样的位置。你解决了吗?帮顶一下。