欢迎来到51自学网!

51自学网

当前位置: 主页 > 软件教程 > 单片机教程 >

STM32F103VET与CPLD(EPM240T100C)之间的通信

时间:2018-08-19 19:48来源:网络整理 作者:51自学网
分享特权同学的EPM240开发板原理图 访问密码 470f 1、先贴CPLD的VHDL编程: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity stm32_cpld is port( cpld_cs:in std_logic;--cpld片选信号,硬

分享特权同学的EPM240开发板原理图  访问密码 470f

1、先贴CPLD的VHDL编程:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

 

entity stm32_cpld is

port(

cpld_cs:in std_logic;--cpld片选信号,硬件连接:通过SN74LVC4245与STM32的FSMC总线的                                                           --FSMC_NE1(PD7)连接

rd:in std_logic; --读控制信号

wr:in std_logic;--写控制信号

cpld_rest:in std_logic;--复位信号

 

m_dir1:out std_logic;--控制U6(SN74LVC4245芯片)

m_dir2:out std_logic;--控制U7(SN74LVC4245芯片)

data_out:out std_logic_vector(7 downto 0) --8位数据输出

);

end stm32_cpld;

 

architecture behav of stm32_cpld is

 

signal data_buf:std_logic_vector(7 downto 0);

signal data_outctl:std_logic;

 

begin

 

m_dir1 <= '0';--控制SN74LVC4245,DIR=0,信号流向:B->A 

m_dir2 <= '1';--控制SN74LVC4245,DIR=1,信号流向:A->B 

data_outctl <= (not cpld_cs) and (not rd) and wr;--判断读时序

data_out <= data_buf when(data_outctl='1') else "00000000";--如果是读时序则输出数据到FSMC总线 

 

process(cpld_rest)

begin

if(cpld_rest = '0') then

    data_buf <= x"18";--x代表16进制数,如果复位键按下,则输出缓冲的数据为0x18

else 

    data_buf <= x"58";

end if;

end process;

end architecture behav;

管脚锁定图示:

STM32F103VET与CPLD(EPM240T100C)之间的通信


2、stm32读取CPLD数据代码:

 

//----------------------------------------------------------------

#define LCD_DATA_ADD *((vu16 *)0X60000000)   //数据读写地址

#define ReadData()  (LCD_DATA_ADD)   //数据读取

//----------------------------------------------------------------

void fsmc_init(void);

void delay_ms(unsigned int Counter);

unsigned short readdata=0;//16位

//----------------------------------------------------------------

int main(void)

{

    fsmc_init();

    while(1)

    {

        readdata=ReadData();

       delay_ms(2000);

    }

}

void fsmc_init(void)

{

     GPIO_InitTypeDef     GPIO_InitStructure;

     FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;

     FSMC_NORSRAMTimingInitTypeDef  p;

    

     //设置PD口PD 0,1,4,5,7,8,9,10,11,12,14,15为FSMC模式

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |GPIO_Pin_4     |GPIO_Pin_5|

        GPIO_Pin_10 |GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_7;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOD, &GPIO_InitStructure); 

        //设置PE口PE 7,8,9,10,11,12,13,14,15为FSMC模式

    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);

 

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); //使能FSMC时钟

 

    p.FSMC_AddressSetupTime = 1;//地址建立时间,单位AHB时钟周期

    p.FSMC_AddressHoldTime = 0; //地址保持时间,单位AHB时钟周期

    p.FSMC_DataSetupTime = 2;   //数据建立时间,单位AHB时钟周期

     //一次读操作之后在总线上的延迟(仅适用于总线复用模式的NOR闪存操作),

    p.FSMC_BusTurnAroundDuration = 0;

    p.FSMC_CLKDivision = 0;//CLK时钟输出信号的周期,以HCLK周期数表示,本书不用该时钟

    //用于同步成组模式的NOR闪存,定义在读取第一个数据之前等待的存储器周期数目

    p.FSMC_DataLatency = 0;

    p.FSMC_AccessMode = FSMC_AccessMode_B; //访问模式B,

  

 

    FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;   //指定的FSMC块1

    //地址和数据不复用

    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; 

    //存储器类型为SRAM

    FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;

   //数据宽度16位

    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;  

   //成组访问禁止

    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;  

   //等待信号低有效

    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; 

    FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;

    //决定控制器是否支持把非对齐的AHB成组操作分割成2次线性操作,仅在存储器的成组模式下有效

    FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;

    //在成组模式时,在等待状态之前的一个时钟周期产生NWAIT信号 

    FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;  //写操作允许

    FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; //不使用等待信号

      //不使用扩展模式

    FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;

(责任编辑:admin)

织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
栏目列表
推荐内容