STM32F4 FSMC输出的字节顺序

2019-07-14 17:30发布

我目前正在设置STM32F407以评估使用瑞萨R61526A显示控制器的显示模块。我能够使用CubeMX设置项目没有问题,FSMC似乎正在工作。
但是我注意到输出数据字是大端,但我很确定所有STM32都是小端(当使用示波器监视D0-16输出时,uint16_t 0x51ab作为变量变为0xab51)。我没想到FSMC会改变输出的字节顺序。
  1. #define LCDADDRESS 0x63FFF00F
  2. const LCDmemorymapping LCDRWregisteraccess = (uint16_t*) LCDADDRESS;
  3. static void writetoLCD(uint16_t dataword)
  4. {
  5.     *LCDRWregisteraccess= (uint16_t) dataword;
  6. }

  7. static uint16_t readfromLCD(uint16_t unused)
  8. {
  9.     return  (uint16_t) *LCDRWregisteraccess;
  10. }


  11. /* FSMC initialization function */
  12. static void MX_FSMC_Init(void)
  13. {
  14.   FSMC_NORSRAM_TimingTypeDef Timing;

  15.   /** Perform the SRAM1 memory initialization sequence
  16.   */
  17.   hsram1.Instance = FSMC_NORSRAM_DEVICE;
  18.   hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
  19.   /* hsram1.Init */
  20.   hsram1.Init.NSBank = FSMC_NORSRAM_BANK1;
  21.   hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
  22.   hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
  23.   hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
  24.   hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
  25.   hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
  26.   hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
  27.   hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
  28.   hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
  29.   hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
  30.   hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
  31.   hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
  32.   hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
  33.   hsram1.Init.PageSize = FSMC_PAGE_SIZE_NONE;
  34.   /* Timing */
  35.   Timing.AddressSetupTime = 3;
  36.   Timing.AddressHoldTime = 15;
  37.   Timing.DataSetupTime = 8;
  38.   Timing.BusTurnAroundDuration = 3;
  39.   Timing.CLKDivision = 16;
  40.   Timing.DataLatency = 17;
  41.   Timing.AccessMode = FSMC_ACCESS_MODE_A;
  42.   /* ExtTiming */

  43.   if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)
  44.   {
  45.     _Error_Handler(__FILE__, __LINE__);
  46.   }

  47. }
复制代码
我希望输出也是小端的,所以我做了一些明显错误的事情吗?显而易见的解决方案是将数据读/写为*LCDRWregisteraccess= (uint16_t)((0xff00&dataword)>>8)|(0x00ff&dataword<<8));或者只是使用REV16指令,但我想知道FSMC中是否存在我缺少的配置或者我做错了什么。这也是我的第一个堆栈交换问题,所以如果我没有正确地提出问题,请随意指出提前谢谢了!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
kpj3026
1楼-- · 2019-07-14 19:52
我期望输出具有与变量相同的位和字节字节顺序(由于STM32是小端,我期望输出相同)。关于你的问题,MSB代表D7线。D8上的LSB等等。简单的解决方法是使用REV16指令,但我很好奇系统的行为方式。我会尽力表达这个问题,谢谢
yfdsfqdqd
2楼-- · 2019-07-14 22:03
所以,很明显,你在D0线上看到了MSB。
ZXH22770
3楼-- · 2019-07-15 04:03
 精彩回答 2  元偷偷看……
zzpf
4楼-- · 2019-07-15 07:22
您使用了16位写入奇数地址(0x63FFF00F),这可能解释了现在的结果。
kpj3026
5楼-- · 2019-07-15 09:09
谢谢楼上的解答,在为16位数据字配置FSMC时访问奇数字节使得它执行双重访问(2次写操作),其中字节的顺序错误。

我的地址现在是:

#define LCD_CMD 0x60030000
#define LCD_DATA 0x60000000

一周热门 更多>