STM32 为什么位读取不正确

[复制链接]
2350|7
 楼主| a868247 发表于 2013-1-7 10:37 | 显示全部楼层 |阅读模式
本帖最后由 a868247 于 2013-1-7 11:06 编辑

#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))

#define GPIOA_IDR_Addr (GPIOA_BASE+8) //
#define GPIOB_IDR_Addr (GPIOB_BASE+8) //

#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //"输入 "
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //"输入 "
LDTEST 发表于 2013-1-7 10:58 | 显示全部楼层
首先  不管 你的 参数 是什么 #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))  返回的 都是 一个地址 里 存 的 值 ,而不可能 是 一位 的 值,你应该 先 获取 地址指向的 值 ,在 位 处理 ,而不是 先位处理 ,然后 获取 地址 值
wangkuo0203 发表于 2013-1-7 11:14 | 显示全部楼层
LDTEST 发表于 2013-1-7 10:58
首先  不管 你的 参数 是什么 #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))  返回的 都是  ...

STM32有位映射的,LZ的思路是把一个位的映射地址计算出来后用指针读出。
uet_cache 发表于 2013-1-7 11:33 | 显示全部楼层
楼主这样写程序,不如直接操作寄存器。我觉得你上面那样反而复杂化了。

再说,之前跟了你另一个帖的,你可以从另一角度考虑问题,看速度上能不能满足你要求。

可以将你的应用,和要求帖出来,看大家有没什么办法帮你想思路。。
acgean 发表于 2013-1-7 13:22 | 显示全部楼层
楼主的思路很正确, 不知道是哪个目标芯片?
 楼主| a868247 发表于 2013-1-14 14:56 | 显示全部楼层
acgean 发表于 2013-1-7 13:22
楼主的思路很正确, 不知道是哪个目标芯片?

是低功耗系列的。
#define GPIOA_IDR_Addr (GPIOA_BASE+8) //
#define GPIOB_IDR_Addr (GPIOB_BASE+8) //
改成
#define GPIOA_IDR_Addr (GPIOA_BASE+0x10) //
#define GPIOB_IDR_Addr (GPIOB_BASE+0x10) //
就可以。为什么呢! IDR的便宜不是0x08?
acgean 发表于 2013-1-14 16:24 | 显示全部楼层
寄存器的地址定义, 不同的芯片是有区别的, 楼主找一下编程手册, 仔细看一看.
拿起书本 发表于 2013-1-14 17:51 | 显示全部楼层
没有遇到过你这种情况哦,看看是不是芯片使能等问题??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

97

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部