打印
[Atmel]

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

[复制链接]
1090|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
很多时候我们用管脚的其余功能,比如说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

这里是设置所有模式:

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

        if (mode & IOPORT_MODE_PULLUP) {
                base->PIO_PUER = mask;
        } else {
                base->PIO_PUDR = mask;
        }

#if defined(IOPORT_MODE_PULLDOWN)
        if (mode & IOPORT_MODE_PULLDOWN) {
                base->PIO_PPDER = mask;
        } else {
                base->PIO_PPDDR = mask;
        }
#endif

        if (mode & IOPORT_MODE_OPEN_DRAIN) {
                base->PIO_MDER = mask;
        } else {
                base->PIO_MDDR = mask;
        }

        if (mode & (IOPORT_MODE_GLITCH_FILTER | IOPORT_MODE_DEBOUNCE)) {
                base->PIO_IFER = mask;
        } else {
                base->PIO_IFDR = mask;
        }

        if (mode & IOPORT_MODE_DEBOUNCE) {
#if SAM3U || SAM3XA
                base->PIO_DIFSR = mask;
#else
                base->PIO_IFSCER = mask;
#endif
        } else {
#if SAM3U || SAM3XA
                base->PIO_SCIFSR = mask;
#else
                base->PIO_IFSCDR = mask;
#endif
        }

#if !defined(IOPORT_MODE_MUX_BIT1)
        if (mode & IOPORT_MODE_MUX_BIT0) {
                base->PIO_ABSR |= mask;
        } else {
                base->PIO_ABSR &= ~mask;
        }
#else
        if (mode & IOPORT_MODE_MUX_BIT0) {
                base->PIO_ABCDSR[0] |= mask;
        } else {
                base->PIO_ABCDSR[0] &= ~mask;
        }

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





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



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

相关帖子

沙发
ayb_ice| | 2015-11-10 15:59 | 只看该作者
就是个指针而已,可以初始化就可以了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2399

主题

6963

帖子

68

粉丝