裸金属臂(AM1808) - 从Kick Registers读取

时间:2013-12-16 08:38:29

标签: c embedded arm bare-metal arm9

我正在尝试在我的裸机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引脚的顶级逻辑中出现了错误。对不起,感到困惑。

1 个答案:

答案 0 :(得分:4)

根据数据表,KICK1的值应为0x95A4F1E0,您的代码0x95A4F10不匹配。在您的代码中,视觉上非常清楚第二个值比第一个值短,这是一个警告信号。

正如评论中所指出的那样,它还说硬件的Rev 2不再具有踢脚寄存器,所以也要检查它。

此外,请确保在该可怕戳戳序列中调用printf()是安全的。