打印

AT32F403AVG的XMC问题?

[复制链接]
5445|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hubeiluhua|  楼主 | 2021-3-28 11:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

我原来的程序工程是在STM32F103VE下开发的,主要是想将STM32F103VE下的HEX直接搬来AT32F403AVG使用,现在发现AT32F403AVG的XMC(即ST的FSMC)写数据时连发送8字节数据,只成功接收前4字节,后4字节好像丢失了,比如我写0xaa 0xbb 0xcc 0xdd 0x11 0x22 0x33 0x44只收到了0xaa 0xbb 0xcc 0xdd ,丢失了0x11 0x22 0x33 0x44,写代码是*(__IO uint8_t*) (0x6c000000) = byte[i];。在STM32F103VE和GD32F103VE上都没有这个问题,硬件使用了FSMC 8bit数据位宽的写模式,只使用NWE信号与DAT0 - 7,共计9个信号。初始化代码我也看了好多遍了都差不多,其实我发现AT32的固件与ST的差不多,只不过结构体变量名有少许变化。我也按照AT的固件库改了,始终是不行,但是我发现*(__IO uint8_t*) (0x6c000000) =  byte写8次后再空写即*(__IO uint8_t*) (0x6c000000) = 0xff 4次就收到了丢失的0x11 0x22 0x33 0x44。虽然可以但这不科学呀,老板也不允许擅自这样干。

    手册上看关于两者的PSRAM这块也都是差不多的,时序图也是一样的。实是在郁闷AT的XMC总线。

   烦请大佬赐教!不胜感激。












使用特权

评论回复
沙发
hubeiluhua|  楼主 | 2021-3-28 11:05 | 只看该作者

AT32F403AVG的XMC问题?

贴子超长了,把代码写出来,先来ST的
void init_fsmc(void)
{
    FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
    FSMC_NORSRAMTimingInitTypeDef  p;

    /* FSMC GPIO configure */
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF
                               | RCC_APB2Periph_GPIOG, ENABLE);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
           
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        /*
        FSMC_D0 ~ FSMC_D3
        PD14 FSMC_D0   PD15 FSMC_D1   PD0  FSMC_D2   PD1  FSMC_D3
        */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_Init(GPIOD,&GPIO_InitStructure);

        /*
        FSMC_D4 ~ FSMC_D7
        PE7 ~ PE10  
        */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 ;
        GPIO_Init(GPIOE,&GPIO_InitStructure);

        /* RD-PD4 WR-PD5 */
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5;//GPIO_Pin_4 |
        GPIO_Init(GPIOD,&GPIO_InitStructure);
    }

    /*-- FSMC Configuration ------------------------------------------------------*/      
    p.FSMC_AddressSetupTime = 2;   //0     8
    p.FSMC_AddressHoldTime = 0;      //0     8
    p.FSMC_DataSetupTime = 2;     //2    10
    p.FSMC_BusTurnAroundDuration = 0;//0   3
    p.FSMC_CLKDivision = 0;    //3     72/(3+1) =18M
    p.FSMC_DataLatency = 0; //0            2
    p.FSMC_AccessMode = FSMC_AccessMode_A;           
      
      
    FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;
    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;   
    FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;   
    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;      
    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;      
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;   
    FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
    FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
    FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable;
    FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;   
   
    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;

    FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

    /* Enable FSMC Bank4_SRAM Bank */
    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
}

使用特权

评论回复
板凳
hubeiluhua|  楼主 | 2021-3-28 11:06 | 只看该作者

AT32F403AVG的XMC问题?

再来AT的,帮我看看,感觉不是初始代码的问题。
void XMC_init(void)
{
  XMC_NORSRAMInitType  XMC_NORSRAMInitStruct;
  XMC_NORSRAMTimingInitType  XMC_NORSRAMTimingInitStruct = {0};
  GPIO_InitType GPIO_InitStructure;

  /* Enable the GPIO Clock */
  RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB|RCC_APB2PERIPH_GPIOC | RCC_APB2PERIPH_GPIOA | RCC_APB2PERIPH_GPIOD |RCC_APB2PERIPH_AFIO, ENABLE);
  /* Enable the XMC Clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_XMC, ENABLE);
  /* REMAP */
  GPIO_PinsRemapConfig(AFIO_MAP7_XMC_0001,ENABLE);
  /*-- GPIO Configuration ------------------------------------------------------*/
  /*!< LCD Data lines configuration */
  GPIO_InitStructure.GPIO_Pins = GPIO_Pins_6 | GPIO_Pins_11 | GPIO_Pins_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pins = GPIO_Pins_14;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pins = GPIO_Pins_2 | GPIO_Pins_3 | GPIO_Pins_4 | GPIO_Pins_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   
  /*!< LCD Reset lines configuration */
  GPIO_InitStructure.GPIO_Pins = GPIO_Pins_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
  GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /*!< LCD RS/CS/WR/RD lines configuration */
  GPIO_InitStructure.GPIO_Pins = GPIO_Pins_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pins = GPIO_Pins_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pins = GPIO_Pins_3 | GPIO_Pins_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);


  /*-- FSMC Configuration ------------------------------------------------------*/
  XMC_NORSRAMTimingInitStruct.XMC_AdrOpTime = 0x02;   
  XMC_NORSRAMTimingInitStruct.XMC_AdrHoldTime = 0x00;
  XMC_NORSRAMTimingInitStruct.XMC_DataOpTime = 0x02;
  XMC_NORSRAMTimingInitStruct.XMC_IntervalBetweenOP = 0x00;   
  XMC_NORSRAMTimingInitStruct.XMC_CLKPsc = 0x00;
  XMC_NORSRAMTimingInitStruct.XMC_DataStableTime = 0x00;
  XMC_NORSRAMTimingInitStruct.XMC_Mode = XMC_Mode_A;

  XMC_NORSRAMInitStruct.XMC_Bank = XMC_Bank1_NORSRAM4;
  XMC_NORSRAMInitStruct.XMC_DataAdrMux = XMC_DataAdrMux_Disable;   
  XMC_NORSRAMInitStruct.XMC_Dev = XMC_Dev_SRAM;   
  XMC_NORSRAMInitStruct.XMC_BusType = XMC_BusType_8b;
  XMC_NORSRAMInitStruct.XMC_EnableBurstMode = XMC_BurstMode_Disable;
  XMC_NORSRAMInitStruct.XMC_EnableAsynWait = XMC_AsynWait_Disable;
  XMC_NORSRAMInitStruct.XMC_WaitSignalLv = XMC_WaitSignalLv_Low;   
  XMC_NORSRAMInitStruct.XMC_EnableBurstModeSplit = XMC_BurstModeSplit_Disable;
  XMC_NORSRAMInitStruct.XMC_WaitSignalConfig = XMC_WaitSignalConfig_BeforeWaitState;
  XMC_NORSRAMInitStruct.XMC_EnableWrite = XMC_WriteOperation_Enable;
  XMC_NORSRAMInitStruct.XMC_EnableWaitSignal = XMC_WaitSignal_Disable;
  XMC_NORSRAMInitStruct.XMC_EnableWriteTiming = XMC_WriteTiming_Enable;
  XMC_NORSRAMInitStruct.XMC_WriteBurstSyn = XMC_WriteBurstSyn_Disable;
   
  XMC_NORSRAMInitStruct.XMC_WTimingStruct = &XMC_NORSRAMTimingInitStruct;
  XMC_NORSRAMInitStruct.XMC_RWTimingStruct = &XMC_NORSRAMTimingInitStruct;
  XMC_NORSRAMInit(&XMC_NORSRAMInitStruct);
  /*!< Enable FSMC Bank1_SRAM Bank */
  XMC_NORSRAMCmd(XMC_Bank1_NORSRAM4, ENABLE);
}

使用特权

评论回复
地板
hoop| | 2021-3-28 18:53 | 只看该作者
明早实际debug分析过再回复你哈。方便的话可以留个联系方式

使用特权

评论回复
5
tanleitanlei| | 2021-3-29 09:46 | 只看该作者
hubeiluhua 发表于 2021-3-28 11:05
贴子超长了,把代码写出来,先来ST的
void init_fsmc(void)
{

咋没看到地址线和NE线的初始化,AT32使用BANK1的SUBBANK4使用的NE线(就是外部储存器的CS线)是PC4,这里是不是和ST的有些不同,需要自己确认一下哦

使用特权

评论回复
6
muyichuan2012| | 2021-3-29 10:31 | 只看该作者
您好,请问方便把简化后且能复现问题的工程贴一下吗?

使用特权

评论回复
7
cooldog123pp| | 2021-3-29 11:56 | 只看该作者
这个你确定不改程序,直接hex就能用,现在都有这种高端操作了。我是没看懂!

使用特权

评论回复
评论
hubeiluhua 2021-4-3 10:44 回复TA
可以用,是真的,大部分完成兼职的。 
8
hubeiluhua|  楼主 | 2021-4-3 10:43 | 只看该作者
tanleitanlei 发表于 2021-3-29 09:46
咋没看到地址线和NE线的初始化,AT32使用BANK1的SUBBANK4使用的NE线(就是外部储存器的CS线)是PC4,这里 ...

地址线没有用。
示波器看了一下,AT32的时序是正确的。可能还是与STM有点点小差异导致的,STM32连续写高电平数据据线为1时它不会跳到0.AT32数据线写1时每次要跳回到0再回到1.

使用特权

评论回复
9
hubeiluhua|  楼主 | 2021-4-3 10:46 | 只看该作者
tanleitanlei 发表于 2021-3-29 09:46
咋没看到地址线和NE线的初始化,AT32使用BANK1的SUBBANK4使用的NE线(就是外部储存器的CS线)是PC4,这里 ...

没用地址线,所以无关。

使用特权

评论回复
10
hubeiluhua|  楼主 | 2021-4-3 11:14 | 只看该作者
hoop 发表于 2021-3-28 18:53
明早实际debug分析过再回复你哈。方便的话可以留个联系方式

AT32时序时对的,这边改一下也可以用发现应该是AT32的速度更快导致。其实也还好。我们这个产品用的外设也不少,都可以正常运行,如果长期使用稳定的话以后就用AT32,是个好东西

使用特权

评论回复
11
muyichuan2012| | 2021-4-3 12:04 | 只看该作者
感谢您的支持和肯定。

使用特权

评论回复
12
hubeiluhua|  楼主 | 2021-4-7 19:52 | 只看该作者
hoop 发表于 2021-3-28 18:53
明早实际debug分析过再回复你哈。方便的话可以留个联系方式

请问一下,现在用示波器看找到问题了,是XMC传输的代码执行完成后,比如
for(i=0;i<=16;i--)
{
     *(__IO uint8_t*) (0x60000000) =buf ;
}
//以下二句是我们要做一个传输完成的脉冲信号。
PCout(4)=1;
PCout(4)=0;

现在用示波器看这个PC4的脉冲信号在XMC数据信号之前就发出了,也就是说XMC数据线还没有传输完成前2us(示波器看的),PC4就输出了?但用STM32看PC4是在数据线传输完成后100ns发出的(示波器看的)。
也就是XMC的数据线没有输出完成,就在跑PCout(4)=1;PCout(4)=0;了。
我现在是在PCout(4)=1;PCout(4)=0;这两句前加了delay_us(3),请问有别的办法吗?是什么问题?最好保持与ST的一致;

使用特权

评论回复
13
单片小菜| | 2021-4-7 21:56 | 只看该作者
直接烧录hex就可以使用吗?还是需要重新烧录一下呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

23

帖子

1

粉丝