打印

STM32 为什么位读取不正确

[复制链接]
1856|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 | 只看该作者
楼主这样写程序,不如直接操作寄存器。我觉得你上面那样反而复杂化了。

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

可以将你的应用,和要求帖出来,看大家有没什么办法帮你想思路。。

使用特权

评论回复
5
acgean| | 2013-1-7 13:22 | 只看该作者
楼主的思路很正确, 不知道是哪个目标芯片?

使用特权

评论回复
6
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?

使用特权

评论回复
7
acgean| | 2013-1-14 16:24 | 只看该作者
寄存器的地址定义, 不同的芯片是有区别的, 楼主找一下编程手册, 仔细看一看.

使用特权

评论回复
8
拿起书本| | 2013-1-14 17:51 | 只看该作者
没有遇到过你这种情况哦,看看是不是芯片使能等问题??

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

97

帖子

1

粉丝