当前位置:   article > 正文

STM32通过FSMC读写FPGA_fpga通过并行总线读写寄存器组的方法

fpga通过并行总线读写寄存器组的方法

目录

1.硬件设计

2.STM32F103端代码

3.FPGA端代码


1.硬件设计

硬件平台:(STM32F103VC + EP4C6E22C8)

STM32F103VC是100管脚的,FSMC引脚定义:地址仅有A19-23  A16-18 共8根地址线,数据线有16根,控制信号RD、WR、NE1

FPGA挂在BANK1的第一区(NE1,还可以有NE2、3、4) 这样可以在FPGA内定义8个寄存器(仅解析A16-18三根地址线)。

2.STM32F103端代码

  1. /***********************************************************
  2.        据此定义如下STM32与FPGA间通信用的寄存器 
  3. ********************************************************** */
  4. #define ARM_FPGA_REG0 *((volatile unsigned short *)((u32)0x60000000))
  5. #define ARM_FPGA_REG1 *((volatile unsigned short*)( (u32)0x60020000))
  6. #define ARM_FPGA_REG2 *((volatile unsigned short*)( (u32)0x60040000))
  7. #define ARM_FPGA_REG3 *((volatile unsigned short*)( (u32)0x60060000))
  8. #define ARM_FPGA_REG4 *((volatile unsigned short*)( (u32)0x60080000))
  9. #define ARM_FPGA_REG5 *((volatile unsigned short *)((u32)0x600a0000))
  10. #define ARM_FPGA_REG6 *((volatile unsigned short *)((u32)0x600c0000))
  11. #define ARM_FPGA_REG7 *((volatile unsigned short *)((u32)0x600e0000))
  12.   /* FSMC对应的GPIO选第二功能,100pin的和非100pin的管脚是有差别的  */ 
  13. void FSMC_GPIO_Configuration(void)
  14. {
  15.   GPIO_InitTypeDef GPIO_InitStructure;
  16.   /* SRAM 数据线双向IO  PD 和 PE               */
  17.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
  18.                                                     GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
  19.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //GPIO_Mode_AF_PP是复用第二功能,也即FSMC
  20.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  21.   GPIO_Init(GPIOD, &GPIO_InitStructure); 
  22.   
  23.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
  24.                                                     GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | 
  25.                                                     GPIO_Pin_15;
  26.   GPIO_Init(GPIOE, &GPIO_InitStructure);
  27.   
  28.   /* SRAM Address lines configuration   PD11 12 13 对应 A16 17 18  
  29.       PE2 3 4 5 6 对应 A23 19 20 21 22  总共8根地址线            */
  30.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 |GPIO_Pin_12 | GPIO_Pin_13;
  31.   GPIO_Init(GPIOD, &GPIO_InitStructure);
  32.   
  33.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_2 | GPIO_Pin_3 | 
  34.                                                     GPIO_Pin_4 | GPIO_Pin_5;
  35.   GPIO_Init(GPIOE, &GPIO_InitStructure);
  36.    
  37.   /* WR and RD configuration */  
  38.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5;
  39.   GPIO_Init(GPIOD, &GPIO_InitStructure);
  40.   
  41.   /* NE1 PD7 片选 */
  42.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; 
  43.   GPIO_Init(GPIOD, &GPIO_InitStructure);
  44.   
  45.   /* NBL0, NBL1 configuration 高低字节使能*/
  46. //  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; 
  47. //  GPIO_Init(GPIOE, &GPIO_InitStructure); 
  48. }
  49.   /*设置FSMC接口时序,控制对象,以及BANK以及区(一个Bank有4个区(4个片选))        */ 
  50. void FSMC_SRAM_Init(void)
  51. {
  52.   FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  53.   FSMC_NORSRAMTimingInitTypeDef  p;
  54.   
  55. /*-- FSMC Configuration ------------------------------------------------------*/
  56.   p.FSMC_AddressSetupTime = 0;
  57.   p.FSMC_AddressHoldTime = 0;
  58.   p.FSMC_DataSetupTime = 2;
  59.   p.FSMC_BusTurnAroundDuration = 0;
  60.   p.FSMC_CLKDivision = 0;
  61.   p.FSMC_DataLatency = 0;
  62.   p.FSMC_AccessMode = FSMC_AccessMode_A;
  63.   FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
  64.   FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  65.   FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
  66.   FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth =   
  67.   FSMC_MemoryDataWidth_16b;//FSMC_MemoryDataWidth_8b;
  68.   FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
  69.   FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  70.   FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
  71.   FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  72.   FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  73.   FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  74.   FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  75.   FSMC_NORSRAMInitStructure.FSMC_AsyncWait = FSMC_AsyncWait_Disable;
  76.   FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  77.   FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
  78.   FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
  79.   FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); 
  80.   /* Enable FSMC Bank1_SRAM Bank */
  81.   FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);  
  82. }
  83. /*  另外不要忘了使能FSMC时钟以及对应GPIO的时钟,放在RCC_Configuration()里面了 */
  84.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, 
  85.                                             ENABLE);
  86.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
  87. 至此STM32配置FSMC就完成了,可以编写测试程序了:
  88. void main(void)
  89. {
  90.         u32 i = 0;
  91.         u16 j = 0
  92.         RCC_Configuration();                        
  93.         NVIC_Configuration();                       
  94.         FSMC_GPIO_Configuration();                  
  95.         FSMC_SRAM_Init();                           
  96.         USART_Initial();//UART1端口配置             
  97.                                                     
  98.         printf("start test!\r\n");                  
  99.                                                     
  100.         for(j = 0; j < 256; j++)                    
  101.         {                                           
  102.                ARM_FPGA_REG2 = j << 8 | j;                 
  103.                printf("0x%4x\r\n", ARM_FPGA_REG2);         
  104.         }                                           
  105.                                                     
  106.         for(i = 0; i < 65536; i++)                  
  107.         {                                           
  108.                ARM_FPGA_REG1 = (u16)i;                    
  109.                if(ARM_FPGA_REG1 != i)                      
  110.                    printf("%d\r\n", ARM_FPGA_REG1);           
  111.         }                                           
  112.         printf("test over!\r\n");                   
  113.         
  114.          while(1)
  115.          {
  116.          }
  117. }

3.FPGA端代码

  1. /*   FPGA端得代码和上次DSP与FPGA通信的代码基本一致,如下:    */
  2. module      STM32_FPGA(
  3.                                           input  main_clk,  //25M晶振
  4.                                           output arm_clk,  //FPGA输出8M时钟作为STM32的外部时钟HSE,经过PLL倍频后得
  5.                                                                      //72M系统时钟
  6.  
  7.                                           output led,       //指示灯,无关紧要
  8.  
  9.                                           input [2:0] addr,
  10.                                           inout [15:0] data,
  11.                                           input FPGA_CS0,//FPGA片选
  12.                                           input RD,
  13.                                           input WR  
  14.                                          );
  15. wire clk;
  16. pll_50M       pll_50M_inst (
  17.                                           .inclk0 ( main_clk ),//25M
  18.                                           .c0 ( clk ),             //50M
  19.                                           .c1 ( arm_clk )      //8M    
  20.                                         );
  21. reg [24:0] cnt = 0;
  22. always @(posedge clk)
  23.      cnt <= cnt + 1'b1; 
  24. assign led = cnt[24];
  25. reg [15:0] ARM_FPGA_REG0; 
  26. reg [15:0] ARM_FPGA_REG1;
  27. reg [15:0] ARM_FPGA_REG2; 
  28. reg [15:0] ARM_FPGA_REG3; 
  29. reg [15:0] ARM_FPGA_REG4;
  30. reg [15:0] ARM_FPGA_REG5; 
  31. reg [15:0] ARM_FPGA_REG6; 
  32. reg [15:0] ARM_FPGA_REG7; 
  33.  
  34. wire rd_en = ~FPGA_CS0 && ~RD;
  35. reg [15:0] data_reg; 
  36. //always @(posedge clk) //!                               
  37. always @(*)
  38. begin                                                
  39.    if(rd_en)                                 
  40.      begin                                           
  41.         case(addr[2:0])                              
  42.          3'd0   :  data_reg <= ARM_FPGA_REG0;        
  43.          3'd1   :  data_reg <= ARM_FPGA_REG1;        
  44.          3'd2   :  data_reg <= ARM_FPGA_REG2;        
  45.          3'd3   :  data_reg <= ARM_FPGA_REG3;        
  46.          3'd4   :  data_reg <= ARM_FPGA_REG4;        
  47.          3'd5   :  data_reg <= ARM_FPGA_REG5;        
  48.          3'd6   :  data_reg <= ARM_FPGA_REG6;        
  49.          3'd7   :  data_reg <= ARM_FPGA_REG7;        
  50.          default:  ;                                 
  51.         endcase                               
  52.      end                                                                                              
  53. end                                           
  54. /* WR上升沿STM32的数据写入FPGA,即sampling point */ 
  55.  
  56. reg WR_tmp1;
  57. reg WR_tmp2;
  58. always @(posedge clk)
  59. begin
  60.     WR_tmp1 <= WR;
  61.     WR_tmp2 <= WR_tmp1;
  62. end 
  63.  
  64. wire WR_RISING = ~WR_tmp2 && WR_tmp1;//与clk同步 
  65.  
  66. always @(*)                                  
  67. begin                                      
  68.   if(WR_RISING)                            
  69.      begin                                    
  70.         case(addr[2:0])                       
  71.          3'd0   :  ARM_FPGA_REG0 <= data;     
  72.          3'd1   :  ARM_FPGA_REG1 <= data;     
  73.          3'd2   :  ARM_FPGA_REG2 <= data;     
  74.          3'd3   :  ARM_FPGA_REG3 <= data;     
  75.          3'd4   :  ARM_FPGA_REG4 <= data;     
  76.          3'd5   :  ARM_FPGA_REG5 <= data;     
  77.          3'd6   :  ARM_FPGA_REG6 <= data;     
  78.          3'd7   :  ARM_FPGA_REG7 <= data;     
  79.          default:  ;                          
  80.         endcase                        
  81.      end                                      
  82. end                                        
  83. assign data = rd_en ? data_reg : 16'hzzzz;
  84.  
  85. endmodule

1.本文部分素材来源网络,版权归原作者所有,如涉及作品版权问题,请与我联系删除。

2.未经原作者允许不得转载本文内容,否则将视为侵权;

3.转载或者引用本文内容请注明来源及原作者;

4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/531356
推荐阅读
相关标签
  

闽ICP备14008679号