[Atmel] 关于库函数管脚功能选择的解析

[复制链接]
 楼主| ddllxxrr 发表于 2015-11-9 21:17 | 显示全部楼层 |阅读模式
很多时候我们用管脚的其余功能,比如说UART。

那么库函数到底是怎么同选择功能对应上的呢???

让我们打开个带有库函数的UART例程。

里边有初使化函数ioport_set_pin_peripheral_mode



再打右键追下去:



则看到:

ioport_set_pin_mode(pin, mode);\
                ioport_disable_pin(pin);\


这两个函数,后一个自然是取肖GPIO功能,再追set_pin_mode下去:



则追到了:arch_ioport_set_pin_mode

这里是设置所有模式:

  1. __always_inline static void arch_ioport_set_port_mode(ioport_port_t port,
  2.                 ioport_port_mask_t mask, ioport_mode_t mode)
  3. {
  4.         Pio *base = arch_ioport_port_to_base(port);

  5.         if (mode & IOPORT_MODE_PULLUP) {
  6.                 base->PIO_PUER = mask;
  7.         } else {
  8.                 base->PIO_PUDR = mask;
  9.         }

  10. #if defined(IOPORT_MODE_PULLDOWN)
  11.         if (mode & IOPORT_MODE_PULLDOWN) {
  12.                 base->PIO_PPDER = mask;
  13.         } else {
  14.                 base->PIO_PPDDR = mask;
  15.         }
  16. #endif

  17.         if (mode & IOPORT_MODE_OPEN_DRAIN) {
  18.                 base->PIO_MDER = mask;
  19.         } else {
  20.                 base->PIO_MDDR = mask;
  21.         }

  22.         if (mode & (IOPORT_MODE_GLITCH_FILTER | IOPORT_MODE_DEBOUNCE)) {
  23.                 base->PIO_IFER = mask;
  24.         } else {
  25.                 base->PIO_IFDR = mask;
  26.         }

  27.         if (mode & IOPORT_MODE_DEBOUNCE) {
  28. #if SAM3U || SAM3XA
  29.                 base->PIO_DIFSR = mask;
  30. #else
  31.                 base->PIO_IFSCER = mask;
  32. #endif
  33.         } else {
  34. #if SAM3U || SAM3XA
  35.                 base->PIO_SCIFSR = mask;
  36. #else
  37.                 base->PIO_IFSCDR = mask;
  38. #endif
  39.         }

  40. #if !defined(IOPORT_MODE_MUX_BIT1)
  41.         if (mode & IOPORT_MODE_MUX_BIT0) {
  42.                 base->PIO_ABSR |= mask;
  43.         } else {
  44.                 base->PIO_ABSR &= ~mask;
  45.         }
  46. #else
  47.         if (mode & IOPORT_MODE_MUX_BIT0) {
  48.                 base->PIO_ABCDSR[0] |= mask;
  49.         } else {
  50.                 base->PIO_ABCDSR[0] &= ~mask;
  51.         }

  52.         if (mode & IOPORT_MODE_MUX_BIT1) {
  53.                 base->PIO_ABCDSR[1] |= mask;
  54.         } else {
  55.                 base->PIO_ABCDSR[1] &= ~mask;
  56.         }
  57. #endif
  58. }
而写当前有关的只有以下两行:





打开数据手册。则内容如下:



可以看出,用IOPORT_MODE_MUX_BIT1和IOPORT_MODE_MUX_BIT0就可控制是选ABCD功能的哪一个。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ayb_ice 发表于 2015-11-10 15:59 | 显示全部楼层
就是个指针而已,可以初始化就可以了

您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2403

主题

6994

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2403

主题

6994

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部