打印
[STM32F1]

STM32F103VET与CPLD(EPM240T100C)之间的通信

[复制链接]
864|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2023-8-3 16:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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;

管脚锁定图示:



使用特权

评论回复
沙发
cr315|  楼主 | 2023-8-3 16:39 | 只看该作者
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。

使用特权

评论回复
板凳
Clyde011| | 2024-3-1 07:08 | 只看该作者

电源电压处于1.6V到5.5V之间

使用特权

评论回复
地板
公羊子丹| | 2024-3-1 08:01 | 只看该作者

电压范围称为工作电源电压

使用特权

评论回复
5
万图| | 2024-3-1 09:04 | 只看该作者

内部电路工作电圧是通过内部电压调节器调节电源电压得到的

使用特权

评论回复
6
Uriah| | 2024-3-1 10:07 | 只看该作者

单片机的外部都连接有象电池等电源部分

使用特权

评论回复
7
帛灿灿| | 2024-3-1 12:03 | 只看该作者

通常选择0.01μF~0.1μF的陶瓷电容作为旁路电容。

使用特权

评论回复
8
周半梅| | 2024-3-1 15:02 | 只看该作者

防止因瞬间大电流引起的电源电压下降

使用特权

评论回复
9
Pulitzer| | 2024-3-1 16:05 | 只看该作者

要在外部连接一个振荡电路提供时钟信号

使用特权

评论回复
10
童雨竹| | 2024-3-1 18:01 | 只看该作者

与15号引脚连接的C1称为旁路电容

使用特权

评论回复
11
Wordsworth| | 2024-3-1 19:04 | 只看该作者

时序电路是按时钟信号(CK)的上升沿(信号从L→H的变化)或下降沿(信号从H→L的变化)同步工作的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1328

主题

3843

帖子

0

粉丝