当前位置:首页 > 单片机 > 单片机
[导读]项目中需要使用STM32和FPGA通信,使用的是地址线和数据线,在FPGA中根据STM32的读写模式A的时序完成写入和读取。之前的PCB设计中只使用了8跟数据线和8根地址线,调试过程中没有发现什么问题,在现在的PCB中使用了8根

项目中需要使用STM32和FPGA通信,使用的是地址线和数据线,在FPGA中根据STM32的读写模式A的时序完成写入和读取。之前的PCB设计中只使用了8跟数据线和8根地址线,调试过程中没有发现什么问题,在现在的PCB中使用了8根地址线和16根数据线,数据宽度也改成了16位,刚开始是读取数据不正确,后来发现了问题,STM32在16位数据宽度下有个内外地址映射的问题,只需要把FPGA中的设定的地址乘以2在STM32中访问就可以了,但是在写操作的时候会出现写当前地址的时候把后面的地址写成0的情况,比如说我给FPGA中定义的偏移地址0x01写一个16位数据,按照地址映射,在STM32中我把地址写入0x02,。实际测试发现这个地址上的数据是对的,但是FPGA中0x02地址上的数据也变成了00。

经过一晚上的测试,发现写数据时实际上是进行了多次写入,导致把后面的地址也给写上了,最终导致数据混乱,后来经过学长提醒,决定把访问的地址定义为16位的,原来是32位的,经过测试问题解决。所以这儿也算是长了经验,因为我只用了8根地址线,为了避免可能的问题,地址最好定义成对应的位数。但是还是很纳闷为什么之前八位数据线读写的时候没有这个问题。

下面是改正之后的STM32程序,对应的CPLD/FPGA程序参考我之前的博客

1 /**************************(C) COPYRIGHT emouse 2011***************************

2 名称:CPLD.c

3 功能:配置fsmc,CPLD读写函数

4 作者:HHUC emouse miss1989@139.com

5 时间:2011.4.28

6 版本:1.0

7 注意:一定要使能RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

8 *******************************************************************************/

9 #include "STM32Lib//stm32f10x.h"

10 #include "hal.h"

11 //使用第一块存储区,使用第四块,定义基地址

12 #define Bank1_SRAM4_ADDR ((uint32_t)0x6c000000)

13 /*******************************************************************************

14 名称:CPLD_Init(void)

15 功能:配置FSMC寄存器

16 参数:无

17 时间:2011.1.15

18 版本:1.0

19 注意:实际CPLD只用了8根地址线和8根数据线

20 按照模式A-SRAM/PSRAM(CRAM)OE翻转模式配置读写时序时序图在STM32技术手册P332

21 可以按照实际连接配置地址线数据线

22 实际CPLD中可以更改敏感信号,对STM32的时序要求放宽

23 *******************************************************************************/

24 void CPLD_Init(void)

25 {

26

27 FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;

28 FSMC_NORSRAMTimingInitTypeDef p;

29 GPIO_InitTypeDef GPIO_InitStructure;

30 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

31 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG |

32 RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF, ENABLE);

33 //数据线引脚初始化,辅助控制器中使用了16根数据线

34 //D 0 1 2 3 13 14 15

35 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 |GPIO_Pin_9 |

36 GPIO_Pin_10| GPIO_Pin_14 | GPIO_Pin_15;

37 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

38 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

39 GPIO_Init(GPIOD, &GPIO_InitStructure);

40 //D4-D12

41 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10|

42 GPIO_Pin_11| GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;

43 GPIO_Init(GPIOE, &GPIO_InitStructure);

44

45 //地址线引脚初始化,调试使用8根地址线

46 //A0-A7

47 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |

48 GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 |

49 GPIO_Pin_14;

50 GPIO_Init(GPIOF, &GPIO_InitStructure);

51

52 //其他控制信号线,调试使用NE4、NOE、NWE

53 //NOE and NWE configuration

54 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5;

55 GPIO_Init(GPIOD, &GPIO_InitStructure);

56 //NE4 configuration

57 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

58 GPIO_Init(GPIOG, &GPIO_InitStructure);

59

60 /*-- FSMC Configuration ------------------------------------------------------*/

61 p.FSMC_AddressSetupTime = 0;

62 p.FSMC_AddressHoldTime = 0;

63 p.FSMC_DataSetupTime = 1;

64 p.FSMC_BusTurnAroundDuration = 0;

65 p.FSMC_CLKDivision = 0;

66 p.FSMC_DataLatency = 0;

67 p.FSMC_AccessMode = FSMC_AccessMode_A;

68

69 FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;

70 FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;

71 FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;

72 FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;

73 FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;

74 FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;

75 FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;

76 FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;

77 FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;

78 FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;

79 FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;

80 FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable;

81 FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;

82 FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;

83 FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;

84

85 FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

86

87 // Enable FSMC Bank1_SRAM Bank

88 FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);

89

90 //CPLD 复位信号,这里使用普通IO PD7

91 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;

92 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //开漏输出

93 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度

94 GPIO_Init(GPIOC, &GPIO_InitStructure);

95

96 GPIO_ResetBits(GPIOD, GPIO_Pin_7);

97 GPIO_SetBits(GPIOD, GPIO_Pin_7); //根据CPLD程序设置低电平复位

98 }

99 /*******************************************************************************

100 名称:CPLD_Write

101 功能:CPLD写时序

102 参数:uint8_t pBuffer-写入的数据 uint32_t WriteAddr-写入的地址

103 时间:2011.1.15

104 版本:1.0

105 注意:在硬件设计中使用了八根地址线和数据线,因此以八位的数据写入

106 *******************************************************************************/

107 void CPLD_Write(uint16_t pBuffer, uint16_t WriteAddr)

108 {

109 *(uint16_t *) (Bank1_SRAM4_ADDR + WriteAddr) = pBuffer;

110 }

111 /*******************************************************************************

112 名称:uint16_t CPLD_Read(uint32_t ReadAddr)

113 功能:CPLD读

114 参数:uint32_t ReadAddr需要读取的地址,返回读取的值

115 时间:2011.4.26

116 版本:1.0

117 注意:在硬件设计中使用了16根地址线和数据线,因此以16位的数据写入

118 *******************************************************************************/

119 uint16_t CPLD_Read(uint16_t ReadAddr)

120 {

121 uint16_t pBuffer;

122 pBuffer = *(__IO uint16_t*) (Bank1_SRAM4_ADDR + ReadAddr);

123 return pBuffer;

124 }


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在嵌入式开发中,STM32的时钟系统因其灵活性和复杂性成为开发者关注的焦点。然而,看似简单的时钟配置背后,隐藏着诸多易被忽视的陷阱,轻则导致系统不稳定,重则引发硬件损坏。本文从时钟源选择、PLL配置、总线时钟分配等关键环...

关键字: STM32 时钟系统

在嵌入式系统开发中,STM32系列微控制器的内部温度传感器因其低成本、高集成度特性,广泛应用于设备自检、环境监测等场景。然而,受芯片工艺差异和电源噪声影响,其原始数据存在±1.5℃的固有误差。本文从硬件配置、校准算法、软...

关键字: STM32 温度传感器

在能源效率与智能化需求双重驱动下,AC-DC转换器的数字控制技术正经历从传统模拟方案向全数字架构的深刻变革。基于STM32微控制器的PFM(脉冲频率调制)+PWM(脉冲宽度调制)混合调制策略,结合动态电压调整(Dynam...

关键字: AC-DC STM32

当前智能家居产品需求不断增长 ,在这一背景下 ,对现有浇花装置缺陷进行了改进 ,设计出基于STM32单片机的全 自动家用浇花机器人。该设计主要由机械结构和控制系统构成 ,机械结构通过麦克纳姆轮底盘与喷洒装置的结合实现机器...

关键字: STM32 麦克纳姆轮 安全可靠 通过性强

用c++编程似乎是让你的Arduino项目起步的障碍吗?您想要一种更直观的微控制器编程方式吗?那你需要了解一下Visuino!这个图形化编程平台将复杂电子项目的创建变成了拖动和连接块的简单任务。在本文中,我们将带您完成使...

关键字: Visuino Arduino ESP32 STM32

基于STM32与LoRa技术的无线传感网络凭借其低功耗、广覆盖、抗干扰等特性,成为环境监测、工业自动化等场景的核心解决方案。然而,如何在复杂电磁环境中实现高效休眠调度与动态信道优化,成为提升网络能效与可靠性的关键挑战。本...

关键字: STM32 LoRa

在实时控制系统、高速通信协议处理及高精度数据采集等对时间敏感的应用场景中,中断响应延迟的优化直接决定了系统的可靠性与性能上限。STM32系列微控制器凭借其灵活的嵌套向量中断控制器(NVIC)、多通道直接内存访问(DMA)...

关键字: STM32 DMA

数字电源技术向高功率密度、高效率与高动态响应方向加速演进,STM32微控制器凭借其基于DSP库的算法加速能力与对LLC谐振变换器的精准控制架构,成为优化电源动态性能的核心平台。相较于传统模拟控制或通用型数字控制器,STM...

关键字: STM32 数字电源

STM32微控制器凭借其针对电机控制场景的深度优化,成为高精度、高可靠性驱动系统的核心选择。相较于通用型MCU,STM32在电机控制领域的核心优势集中体现在FOC(磁场定向控制)算法的硬件加速引擎与PWM死区时间的动态补...

关键字: STM32 电机控制

无线充电技术加速渗透消费电子与汽车电子领域,基于Qi协议的无线充电发射端开发成为智能设备能量补给的核心课题。传统模拟控制方案存在响应滞后、参数调整困难等问题,而基于STM32的数字PID控制结合FOD(Foreign O...

关键字: STM32 无线充电
关闭