<object id="k0taz"><form id="k0taz"></form></object>
<pre id="k0taz"></pre>
      1. <table id="k0taz"></table>
        <bdo id="k0taz"><center id="k0taz"></center></bdo>
        <table id="k0taz"><option id="k0taz"></option></table><track id="k0taz"><ruby id="k0taz"></ruby></track>
        專注電子技術學習與研究
        當前位置:單片機教程網 >> STM32 >> 瀏覽文章

        STM32F103VET與CPLD(EPM240T100C)之間的通信

        作者:佚名   來源:轉自李華強空間   點擊數:  更新時間:2014年08月29日   【字體:

        分享特權同學的EPM240開發板原理圖 http://yunpan.cn/QavYhEZe8gnXJ  訪問密碼 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;
        管腳鎖定圖示:

        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;
             //成組操作時,禁止插入等待狀態                                                                    
            FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
            FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;   //設置讀時序配置指針
            FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;//設置寫時序配置指針
         
            FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //FSMC初始化  
            FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); //使能FSMC讀寫操作
        }
        //==============================================================================
        //Subroutine: Delay1ms
        //==============================================================================
        void delay_ms(unsigned int Counter)
        {
         
        unsigned int i;
        for(; Counter !=0; Counter--)
        {
        i = 10301;
        while(i--);
        }
        }
         
        說明:stm32初始化FSMC時設置了16位數據格式,但是我cpld只提供8位數據格式,所以接線時可以將cpld的數據線對應接到stm32的fsmc數據總線的低8位,因此在stm32處理從fsmc數據總線讀取的數據時只需保留低8位,高8位數據忽略即可,比如readdata & 0x00ff。FSMC總線的編址也要注意,之前有一篇博客對此有所闡述。
         
        實驗現象:stm32采用在線調試,將readdata添加到觀察窗口,查看它的值,可以看到,當cpld開發板的復位鍵未按下時,readata=0x0058,當長按cpld復位鍵時readata=0x0018,按鍵彈起之后readata=0x0058。
        關閉窗口

        相關文章

        欧美国产伦久久久久_亚洲爽爽一区二区三区_一色屋精品视频在线观看免费_久久伊人成色777综合网
        <object id="k0taz"><form id="k0taz"></form></object>
        <pre id="k0taz"></pre>
          1. <table id="k0taz"></table>
            <bdo id="k0taz"><center id="k0taz"></center></bdo>
            <table id="k0taz"><option id="k0taz"></option></table><track id="k0taz"><ruby id="k0taz"></ruby></track>