历史上的今天
返回首页

历史上的今天

今天是: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,       //指示灯,无关紧要

推荐阅读

史海拾趣

C-TON Industries公司的发展小趣事

随着公司规模的扩大,C-TON意识到单凭自己的力量难以在竞争激烈的电子行业中立足。于是,公司开始积极寻求与其他企业的战略合作。通过与一家知名的电子产品制造商建立合作伙伴关系,C-TON成功将其芯片技术应用于对方的产品中,进一步扩大了市场份额。这一合作不仅提升了C-TON的知名度,也为其带来了稳定的订单和收入来源。

DLP Design公司的发展小趣事

DLP精工科技公司,一直秉承“品质至上”的经营理念,在DLP技术产品的设计和制造过程中严格把控品质。公司拥有一支专业的研发团队和先进的生产设备,确保每一件产品都符合高标准的质量要求。通过不断的技术创新和产品升级,DLP精工科技在电子行业中树立了良好的品牌形象,赢得了消费者的信赖和认可。

GE Industrial Solutions公司的发展小趣事
通过输入不同频率的信号,测量输出信号的幅度和相位变化,以评估电路的频率响应特性。
Festo公司的发展小趣事

Festo公司成立于1925年,由Albert Fezer和Gottlieb Stoll两位创始人共同创立。最初,公司专注于木工机械和木工工具的生产,其品牌Festool在行业内享有盛誉。凭借对工艺的精湛掌握和对品质的严格把控,Festo迅速在木工机械领域崭露头角,为公司的后续发展奠定了坚实的基础。

联智(Celfras)公司的发展小趣事

联智的半导体集成电路芯片研发及产业化项目是其发展历程中的又一重要里程碑。该项目总投资高达20亿元,分两期建设。一期项目将建设半导体集成电路模拟芯片封测生产线,预计年产量可达1.5亿颗。二期项目将研发更高功率有线无线融合一体化电源管理芯片和新一代A4WP远距离无线充电芯,同时布局物联网IoT芯片市场。这一项目的实施将进一步提升联智的技术实力和市场竞争力。

HEIMANN公司的发展小趣事

为了更好地推动快充技术的发展和应用,联智加入了终端快充行业协会。作为该协会的成员,联智积极贡献自身在快充协议、电源管理无线充电芯片和方案研发方面的经验和技术,与协会其他成员共同推动充电技术的标准化、产业化应用和推广。这一举措不仅有助于提升联智在快充行业的知名度和影响力,还将促进整个行业的健康发展。

问答坊 | AI 解惑

哪位共享份XILINX FPGA的开发板电路图

哪位共享份XILINX FPGA的开发板电路图…

查看全部问答>

传说中的!昔日的传销——摇摆器! (转)

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 谁见过这个情景啊 ?传销中传说的摇摆器 公司里边,专门有一个诊病室,各种头衔的专家教授亲自给人诊病。“专家”们说:拥有摇摆机,你就拥有了健康,有了健康你才能拥有妻子、儿子、房子、车 ...…

查看全部问答>

看看你是不是安防达人,从图像辨故障

今天看到了一个关于“从图像判断故障”的文章,觉得写的非常具体, 大家在实际应用中,怎么去判断呢,不妨来交流下。 文章如下: 监视器上无图像 1、监控主机等设备及其连接引起无图像显示的原因及解决法 ·微机切换主机输出至监视器的同轴 ...…

查看全部问答>

手机内置天线技术要求

内置天线技术要求 内置天线材料为铍铜、不锈钢等其他材料,具体支撑视结构而定。铍铜(外面镀金) 天线的RF 性能比较好,但是价格稍高于不锈钢材料。 内置天线性能的保证对结构要求较严,基本的要求如下,否则天线性能将受到较大影 响,具体影 ...…

查看全部问答>

EMC 之电源线滤波器基础知识

电源线滤波器主要起什么作用,选型时主要考虑哪些参数,使用电源线滤波器时要注意什么问题? 电源线滤波器的作用是抑制传导发射电流沿着电源线传播。选型时要考虑插入损耗(共模和差模)、额定电流、电压、有效的频率范围等参数,使用时要注意安装 ...…

查看全部问答>

6年LED灯珠生产技术工程师经验(LED生产过程漏电的原因分析供工程师讨论)原创

一  选好芯片芯片的抗静电能力要好一点。 二  主要是双线双电极会漏点也就是说白光蓝光和绿光,红的黄的单电极的不怎么会漏电      如果芯片的抗静电能力很好的话,做出的产品还会有漏电的话,那主要原 ...…

查看全部问答>

89C51\52入门请教

本人想比较快速掌握89C51\\52的程序设计,请各位高手赐招.汇编和C语言我已学过了,还可以. 推荐几本书,什么的.....…

查看全部问答>

电压跳动导致电池读数变动的问题

现在发现一个问题,由于电池端的电压在不同负载的时候会有所跳动,因此计算出的电池电量也会变化。 比如说,我再正常使用的时候电池电量显示75%,这个时候在播放MP3。不做其他操作,过了一分钟,背光会自动变暗,这是电量显示就变成80%,再过一分 ...…

查看全部问答>

VC和DS做USB驱动程序应用设计

我已经用DS的向导生成了一个USB驱动程序. 没有手工增加任何代码. 现在该驱动程序已经可以在插入USB器件后安装成功. 我想在该工程下再加一个界面. 直接在VC下增加一个AppWizard到该DS工程中编译很多错误. 是否应该用DS向导生成一个驱动程序后. 再用V ...…

查看全部问答>

LF2407A烧写次数大约是多少?请大家根据自己经验都来答一下!

我用了两片,都写了十几次就坏了,unlock成功后也不好用,可能是flash真的坏了, 在此我想统计一下,请帮个忙,大家都答一下。 …

查看全部问答>