0

我试图在我的裸机 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 引脚的顶层逻辑中出现错误。对困惑感到抱歉。

4

1 回答 1

4

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

它还说,正如评论中所指出的,硬件的第 2 版不再具有踢脚寄存器,因此也要检查一下。

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

于 2013-12-16T08:55:36.697 回答