历史上的今天
今天是:2025年03月17日(星期一)
2020年03月17日 | STM32通过FSMC读写FPGA
2020-03-17 来源:eefocus
硬件平台:icore板(STM32F103VC + EP4C6E22C8)
STM32F103VC是100管脚的,FSMC引脚定义:
地址仅有A19-23 A16-18 共8根地址线,数据线有16根,控制信号RD、WR、NE1
FPGA挂在BANK1的第一区(NE1,还可以有NE2、3、4)
这样可以在FPGA内定义8个寄存器(仅解析A16-18三根地址线)
/***********************************************************
据此定义如下STM32与FPGA间通信用的寄存器
********************************************************** */
#define ARM_FPGA_REG0 *((volatile unsigned short *)((u32)0x60000000))
#define ARM_FPGA_REG1 *((volatile unsigned short*)( (u32)0x60020000))
#define ARM_FPGA_REG2 *((volatile unsigned short*)( (u32)0x60040000))
#define ARM_FPGA_REG3 *((volatile unsigned short*)( (u32)0x60060000))
#define ARM_FPGA_REG4 *((volatile unsigned short*)( (u32)0x60080000))
#define ARM_FPGA_REG5 *((volatile unsigned short *)((u32)0x600a0000))
#define ARM_FPGA_REG6 *((volatile unsigned short *)((u32)0x600c0000))
#define ARM_FPGA_REG7 *((volatile unsigned short *)((u32)0x600e0000))
/* FSMC对应的GPIO选第二功能,100pin的和非100pin的管脚是有差别的 */
void FSMC_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* SRAM 数据线双向IO PD 和 PE */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //GPIO_Mode_AF_PP是复用第二功能,也即FSMC
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
GPIO_Pin_15;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* SRAM Address lines configuration PD11 12 13 对应 A16 17 18
PE2 3 4 5 6 对应 A23 19 20 21 22 总共8根地址线 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 |GPIO_Pin_12 | GPIO_Pin_13;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* WR and RD configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* NE1 PD7 片选 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* NBL0, NBL1 configuration 高低字节使能*/
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
// GPIO_Init(GPIOE, &GPIO_InitStructure);
}
/*设置FSMC接口时序,控制对象,以及BANK以及区(一个Bank有4个区(4个片选)) */
void FSMC_SRAM_Init(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
/*-- FSMC Configuration ------------------------------------------------------*/
p.FSMC_AddressSetupTime = 0;
p.FSMC_AddressHoldTime = 0;
p.FSMC_DataSetupTime = 2;
p.FSMC_BusTurnAroundDuration = 0;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth =
FSMC_MemoryDataWidth_16b;//FSMC_MemoryDataWidth_8b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_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_Disable;
FSMC_NORSRAMInitStructure.FSMC_AsyncWait = FSMC_AsyncWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* Enable FSMC Bank1_SRAM Bank */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
/* 另外不要忘了使能FSMC时钟以及对应GPIO的时钟,放在RCC_Configuration()里面了 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,
ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
至此STM32配置FSMC就完成了,可以编写测试程序了:
void main(void)
{
u32 i = 0;
u16 j = 0;
RCC_Configuration();
NVIC_Configuration();
FSMC_GPIO_Configuration();
FSMC_SRAM_Init();
USART_Initial();//UART1端口配置
printf("start test!rn");
for(j = 0; j < 256; j++)
{
ARM_FPGA_REG2 = j << 8 | j;
printf("0x%4xrn", ARM_FPGA_REG2);
}
for(i = 0; i < 65536; i++)
{
ARM_FPGA_REG1 = (u16)i;
if(ARM_FPGA_REG1 != i)
printf("%drn", ARM_FPGA_REG1);
}
printf("test over!rn");
while(1)
{
}
}
/* FPGA端得代码和上次DSP与FPGA通信的代码基本一致,如下: */
module STM32_FPGA(
input main_clk, //25M晶振
output arm_clk, //FPGA输出8M时钟作为STM32的外部时钟HSE,经过PLL倍频后得
//72M系统时钟
output led, //指示灯,无关紧要
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 谁见过这个情景啊 ?传销中传说的摇摆器 公司里边,专门有一个诊病室,各种头衔的专家教授亲自给人诊病。“专家”们说:拥有摇摆机,你就拥有了健康,有了健康你才能拥有妻子、儿子、房子、车 ...… 查看全部问答> |
|
今天看到了一个关于“从图像判断故障”的文章,觉得写的非常具体, 大家在实际应用中,怎么去判断呢,不妨来交流下。 文章如下: 监视器上无图像 1、监控主机等设备及其连接引起无图像显示的原因及解决法 ·微机切换主机输出至监视器的同轴 ...… 查看全部问答> |
|
内置天线技术要求 内置天线材料为铍铜、不锈钢等其他材料,具体支撑视结构而定。铍铜(外面镀金) 天线的RF 性能比较好,但是价格稍高于不锈钢材料。 内置天线性能的保证对结构要求较严,基本的要求如下,否则天线性能将受到较大影 响,具体影 ...… 查看全部问答> |
|
电源线滤波器主要起什么作用,选型时主要考虑哪些参数,使用电源线滤波器时要注意什么问题? 电源线滤波器的作用是抑制传导发射电流沿着电源线传播。选型时要考虑插入损耗(共模和差模)、额定电流、电压、有效的频率范围等参数,使用时要注意安装 ...… 查看全部问答> |
|
6年LED灯珠生产技术工程师经验(LED生产过程漏电的原因分析供工程师讨论)原创 一 选好芯片芯片的抗静电能力要好一点。 二 主要是双线双电极会漏点也就是说白光蓝光和绿光,红的黄的单电极的不怎么会漏电 如果芯片的抗静电能力很好的话,做出的产品还会有漏电的话,那主要原 ...… 查看全部问答> |
|
现在发现一个问题,由于电池端的电压在不同负载的时候会有所跳动,因此计算出的电池电量也会变化。 比如说,我再正常使用的时候电池电量显示75%,这个时候在播放MP3。不做其他操作,过了一分钟,背光会自动变暗,这是电量显示就变成80%,再过一分 ...… 查看全部问答> |
|
我已经用DS的向导生成了一个USB驱动程序. 没有手工增加任何代码. 现在该驱动程序已经可以在插入USB器件后安装成功. 我想在该工程下再加一个界面. 直接在VC下增加一个AppWizard到该DS工程中编译很多错误. 是否应该用DS向导生成一个驱动程序后. 再用V ...… 查看全部问答> |
|
LF2407A烧写次数大约是多少?请大家根据自己经验都来答一下! 我用了两片,都写了十几次就坏了,unlock成功后也不好用,可能是flash真的坏了, 在此我想统计一下,请帮个忙,大家都答一下。 … 查看全部问答> |




