我试图在我的裸机 AM1808 上进行一些引脚复用,但我似乎无法编写 kick 寄存器?或者,更具体地说,我似乎无法读回我尝试写入的值。
这是我的代码:
#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 引脚的顶层逻辑中出现错误。对困惑感到抱歉。