本文共 2047 字,大约阅读时间需要 6 分钟。
STM32 的IO口对应关系
即2^24的寻址空间
转自
STM32的FSMC支持数据与地址线复用或非复用两种模式
非复用模式:16位数据线及26位地址线分开始用。推荐在144脚及以上的STM32产品上使用该模式。
复用模式:低16位数据/地址线复用。在该模式下,推荐使用地址锁存器以区分数据与地址。
若不使用锁存器:当NADV为低时,ADx(x=0…15)上出现地址信号Ax,当NADV变高时,ADx上出现数据信号Dx。
若使用锁存器:可同时在ADx上得到Ax和Dx。FSMC中未使用的数据线或地址线可配置为GPIO
对于16位宽度的外部存储器,FSMC将在内部使用HADDR[25:1]产生外部存储器的地址FSMC_A[24:0]。因此,实际的访问地址为右移一位之后的地址。
//由于内部AHB总线的地址HADDR与FSMC总线地址存在一定的映射关系。在进行地址读写操作时,HADDR[0]并没有用到,相当于地址右移了1位#define fpga_write(offset,data) *((volatile unsigned short int *)(0x60000000 + (offset << 1))) = data //uint32 data #define fpga_read(offset) *((volatile unsigned short int *)(0x60000000 + (offset << 1)))
经过大量测试,当发送地址超过28位时,会导致单片机卡死
单个地址的储存数据是低16位的,高16位丢弃,不会被写入到上一个或者下一个地址里面
case 0x11: //写命令到指定地址;指定地址不能超过28位;单个地址的储存数据是低16位的,高16位丢弃,不会被写入到上一个或者下一个地址里面{uint32_t addr,cmd;addr=(UART_Rx_Buff[1]<<24)|(UART_Rx_Buff[2]<<16)|(UART_Rx_Buff[3]<<8)|UART_Rx_Buff[4];cmd=(UART_Rx_Buff[5]<<24)|(UART_Rx_Buff[6]<<16)|(UART_Rx_Buff[7]<<8)|UART_Rx_Buff[8];//此处的高16位无效fpga_write(addr,cmd);HAL_Delay(10);cmd=fpga_read(addr);printf("写入的数据=%d\r\n",cmd);break; }
当addr&0xFE 00 00 00 !=0X0000 0000的时候卡死,即发生地址的高于或等于26位不能为1
0x 01 FF FFFF 单片机可以读取写入
0x 02 00 0000 单片机不能读取写入
2,
D:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin --output=@L.bin !L
$K\ARM\ARMCC\bin\fromelf.exe --bin --output=@L.bin !L
多组测试说明 当IROM1:0X1020 0000 时候,UART_Rx_Buff[7]==0x10;UART_Rx_Buff[6]==0x20;
所以检校栈顶地址 if(UART_Rx_Buff[7]==0x08)
那么作为数据采集系统可以这样传输数据了,
FPGA作为NOR FLASH,进行数据采集,然后将数据以特定的顺序保存在NOR FLASH里面,比如占据0--N个数据地址。
STM32 通过实时读取NOR FLASH的数据来显示。
STM32发送控制命令给FPGA,可以写入命令到N+1,FPGA实时对地址为N+1的命令进行解析
转载地址:http://havhn.baihongyu.com/