我正在尝试在我的裸机AM1808上做一些引脚多路复用,但我似乎无法写入反冲寄存器?或者,更具体地说,我似乎无法回读我试图写的值。
这是我的代码:
#define SYSCFG_BASE ((void*volatile)0x01C14000)
#define SYSCFG_KICK0R (*((unsigned int*volatile)(SYSCFG_BASE + 0x38)))
#define SYSCFG_KICK1R (*((unsigned int*volatile)(SYSCFG_BASE + 0x3C)))
#define KICK0_UNLOCK 0x83E70B13
#define KICK1_UNLOCK 0x95A4F10
#define KICK0_LOCK 0x0
#define KICK1_LOCK 0x0
static void
gpio_init (int diode)
{
int status = 0;
asm volatile (
"mrs %[ps],cpsr" : [ps]"=&r"(status)
);
printf("mode: 0x%x\n", status & 0x1F);
printf("kick0: 0x%x", SYSCFG_KICK0R);
SYSCFG_KICK0R = KICK0_UNLOCK;
printf(" -> 0x%x\n", SYSCFG_KICK0R);
printf("kick1: 0x%x", SYSCFG_KICK1R);
SYSCFG_KICK1R = KICK1_UNLOCK;
printf(" -> 0x%x\n", SYSCFG_KICK1R);
/* pinmux stuff */
SYSCFG_KICK0R = KICK0_LOCK;
SYSCFG_KICK1R = KICK1_LOCK;
}
输出:
mode: 0x13
kick0: 0x0 -> 0x0
kick1: 0x0 -> 0x0
虽然我处于管理员模式,但我通常无法读取脚注寄存器吗?如果是这样,我如何测试我是否正确解锁了syscfg?
更新: 事实证明,我遇到的问题与引脚多路复用或反冲寄存器无关,而是在使用正确多路复用的GPIO引脚的顶级逻辑中出现了错误。对不起,感到困惑。
答案 0 :(得分:4)
根据数据表,KICK1
的值应为0x95A4F1E0
,您的代码0x95A4F10
不匹配。在您的代码中,视觉上非常清楚第二个值比第一个值短,这是一个警告信号。
正如评论中所指出的那样,它还说硬件的Rev 2不再具有踢脚寄存器,所以也要检查它。
此外,请确保在该可怕戳戳序列中调用printf()
是安全的。