查看:
3148
|
回复:
5
|
STM32 GPIO 问题求助
|
|||
Peter
8
主题
41
回复 |
发表于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了 |
|||
那林
11
主题
52
回复 |
发表于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个半字访问。 厚积薄发,再创辉煌!
|
|||
Peter
8
主题
41
回复 |
发表于2017-08-29 11:30:42
|
只看该作者
3#
已经确定是stm32本身的问题,就是不明白为什么PB0-7写入数据以后,再写PB8-15,PB0-7也变成了PB8-15一样的数据 反过来先写PB8-15,后写PB0-7也是一样。 重点是,同样的代码,有的时候好的,有的时候写低8bit或者高8bit,再写其他8bit,早前写的8位数据被改变了,怪事啊~~ |
|||
那林
11
主题
52
回复 |
发表于2017-08-29 11:38:38
|
只看该作者
4#
几个板子都这样吗? 我个人初步认为:硬件的布线、连线或软件问题,较大因素。 厚积薄发,再创辉煌!
|
|||
Peter
8
主题
41
回复 |
发表于2017-08-29 18:53:31
|
只看该作者
5#
是因为写sram并非原子操作,中间被中断去执行其他事情了,于是数据被改变了
|
|||
不聊12
1
主题
14
回复 |
发表于2017-09-14 20:43:40
|
只看该作者
6#
定义的变量长度不够或是指针没有类型不对?
|
|