查看: 3115  |  回复: 5
STM32 GPIO 问题求助

主题

回复
发表于2017-08-29 10:13:47 | 显示全部楼层
1# 电梯直达

在一个SRAM读写设备上,我将

PA0-PA7 设置为A0-A7

PB0-PB7 设置为A8-A15 

PB8-PB15 设置为D0-D7

PA8,PA9,PA10 设置为WR CS OE


#define SET_ADDRESS(_ADR) GPIOA->BSRR  = (u32)(0x00FF0000);	GPIOA->BSRR  = (u32)(((_ADR)>>0)&0x000000FF);\
GPIOB->BSRR  = (u32)(0x00FF0000);	GPIOB->BSRR  = (u32)(((_ADR)>>8)&0x000000FF)
 
#define DATA_READ(_VAR)   _VAR=(((GPIOB->IDR)&0xFF00)>>8)
#define DATA_WRITE(_VAL)  GPIOB->BSRR = (u32)(0xFF000000); GPIOB->BSRR = (u32)(((_VAL)<<8)&0x0000FF00)
当我顺序读取数据的时候,一切都正确,但是当我写入数据的时候,数据不知道写哪里去了。比如写入008 58,结果实际不知道写哪个地址去了,008读出来还是原来的数据


最奇怪的是,在keil调试模式写入数据,写入的数据又全部正确,比如写入 在008 写入 58,实际写入以后读取出来也是 008 变成58了



主题

回复
发表于2017-08-29 10:47:49   |  显示全部楼层
2#

看看,这对你有用?我网上看到的。如果不行,那只能用逻辑分析仪来排查也是一个有效的办法。


在访问外部的SRAM时:

当访问字节数据时:*((u8*)(BANK1_SRAM_BASE+offset))。1.读取SRAM数据时,将offset设为0x00,用示波器测试SRAM的A0地址信号是低,当offset为0x01时,用示波器测试SRAM的A0地址信号也是低,当offset为0x02和0x03时SRAM的A0地址信号是高,这说明当字节访问时地址确实是偏移了1位,原因是SRAM是16位器件(SRAM的1个地址存储16位数据),一次可以访问2个字节的数据,这个时候FSMC将根据offset值判断,访问的是高8位还是低8位,即如果offset的最低位是0则访问的是16位数据的低8位,如果offset的最低位是1则访问的是16位数据的高8位。2. 向SRAM写数据时,道理也是一样的,只是写的时候通过BL[1:0]两个管脚控制写高字节还是低字节。

当访问半字数据时:*((u16*)(BANK1_SRAM_BASE+offset))。1.读取SRAM数据时,这个时候要注意了,FSMC在访问的时候要看offset的值是不是半字对齐的。如果offset是0x00,则直接访问的是SRAM的0x00地址处的16位数据,当offset是0x01时,FSMC是分两次访问的,第一次是访问SRAM的0x00地址的高字节,第二次是访问SRAM的0x01地址处的低字节(SRAM的1个地址存储16位数据),通过用示波器测量SRAM的A0地址信号得到,信号是先低在高的一个脉冲,验证了前面的说法。2. 向SRAM写数据时,道理也是一样的,只是写的时候通过BL[1:0]两个管脚控制写高字节还是低字节。

 当访问字数据时:访问字时,FSMC分为2个半字访问。


主题

回复
发表于2017-08-29 11:38:38   |  显示全部楼层
4#
发表于2017-08-29 11:30:42  3# 已经确定是stm32本身的问题,就是不明白为什么PB0-7写入数据以后,再写PB8-15,PB0-7也变成了PB8-15...

几个板子都这样吗? 

我个人初步认为:硬件的布线、连线或软件问题,较大因素。


主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部