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。
|