打印

Tiva的GPIO 作为普通IO输出时的配置过程【继续连载】

[复制链接]
1069|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xyz549040622 于 2015-11-11 22:46 编辑

a) 配置系统时钟
b) 打开与此 GPIO 端口对应的端口时钟。
c) 将端口配置为数字输入输出的 GPIO 功能,而不是端口的其它复用功能
d) 配置 GPIO 端口驱动电流大小和上下拉电阻的模式
e) 设置管脚的输入输出方向。
f) 设置管脚输出是高电平还是低电平。

相关帖子

沙发
xyz549040622|  楼主 | 2015-11-6 22:16 | 只看该作者
本帖最后由 xyz549040622 于 2015-11-7 00:06 编辑

接上,配置IO为普通IO的时候,按照上图中的流程,应该分6步配置了,那我们实际看看官方的例程,是这么配置的

SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
                       SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//启用GPIOF端口并提供一个时钟
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1);//配置IO为输出模式
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);//配置输出高电平


实际中只用了4步,没有配置为数字功能,没有配置GPIO的时钟,没有配置IO的模式。这是为什么呢?

1.关于时钟的问题,TIVA的GPIO时钟可以选择挂在APB总线上或者挂在AHB总线上,复位后是默认挂在APB总线上的。因此这个选择使用默认的了,当选择AHB的时候需要用到这个函数    SysCtlGPIOAHBDisable(SYSCTL_PERIPH_GPIOF);//使能GPIO的AHB时钟,默认是通过APB时钟访问的
    寄存器的介绍如下:

2.关于GPIO选择是外设还是普通IO,其实是有这么一个寄存器的,手册中的说明如下

这个寄存器在函数GPIODirModeSet()中被设置了,当设置IO方向的时候,自动就设置这个寄存器了

3.关于IO的方向和模式设置数,是这GPIODirModeSet()和GPIOPadConfigSet(),但是函数中没有直接设置,这是因为函数库提供了GPIOPinTypeGPIOOutput()这么一个函数,当使用这个函数的时候,自动配置了IO的方向和模式,函数源码如下:
GPIOPinTypeGPIOOutput(uint32_t ui32Port, uint8_t ui8Pins)
{
    //
    // Check the arguments.
    //
    ASSERT(_GPIOBaseValid(ui32Port));

    //
    // Set the pad(s) for standard push-pull operation.
    //
    GPIOPadConfigSet(ui32Port, ui8Pins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);

    //
    // Make the pin(s) be outputs.
    //
    GPIODirModeSet(ui32Port, ui8Pins, GPIO_DIR_MODE_OUT);
}


使用特权

评论回复
板凳
xyz549040622|  楼主 | 2015-11-11 22:42 | 只看该作者
所以,TIVA设置普通IO用作输出的时候,一般有下面几句就够了
1.SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//启用GPIOF端口并提供一个时钟
2.GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1);//配置IO为输出模式
3.GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);//配置输出高低电平

使用特权

评论回复
地板
xyz549040622|  楼主 | 2015-11-11 22:45 | 只看该作者
当设置普通IO为输出模式,并需要设置引脚的电流和输出引脚的配置时候,一般有下面几句就够了
1.SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//启用GPIOF端口并提供一个时钟
2.GPIOPadConfigSet(ui32Port, ui8Pins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);//设置引脚的电流和引脚的模式
3.GPIODirModeSet(ui32Port, ui8Pins, GPIO_DIR_MODE_OUT);//设置引脚为输出模式
4.GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);//配置输出高低电平

使用特权

评论回复
5
xyz549040622|  楼主 | 2015-11-11 23:09 | 只看该作者
关于IO电流的几种模式如下:
#define GPIO_STRENGTH_2MA       0x00000001  // 2mA drive strength
#define GPIO_STRENGTH_4MA       0x00000002  // 4mA drive strength
#define GPIO_STRENGTH_6MA       0x00000065  // 6mA drive strength
#define GPIO_STRENGTH_8MA       0x00000066  // 8mA drive strength
#define GPIO_STRENGTH_8MA_SC    0x0000006E  // 8mA drive with slew rate control
#define GPIO_STRENGTH_10MA      0x00000075  // 10mA drive strength
#define GPIO_STRENGTH_12MA      0x00000077  // 12mA drive strength

具体芯片支持哪种模式,需要看数据手册的。

使用特权

评论回复
6
xyz549040622|  楼主 | 2015-11-11 23:10 | 只看该作者
关于IO引脚的模式的几种配置如下:
#define GPIO_PIN_TYPE_STD       0x00000008  // Push-pull ÍÆÍìģʽ
#define GPIO_PIN_TYPE_STD_WPU   0x0000000A  // Push-pull with weak pull-up
#define GPIO_PIN_TYPE_STD_WPD   0x0000000C  // Push-pull with weak pull-down
#define GPIO_PIN_TYPE_OD        0x00000009  // Open-drain
#define GPIO_PIN_TYPE_ANALOG    0x00000000  // Analog comparator
#define GPIO_PIN_TYPE_WAKE_HIGH 0x00000208  // Hibernate wake, high
#define GPIO_PIN_TYPE_WAKE_LOW  0x00000108  // Hibernate wake, low
具体芯片支持哪种模式,需要看数据手册的。

使用特权

评论回复
7
perry_peng| | 2015-11-12 09:57 | 只看该作者
谢谢分享。

使用特权

评论回复
8
尤彼卡| | 2015-11-12 14:03 | 只看该作者
TIVA的GPIO时钟默认挂在APB总线上的

使用特权

评论回复
9
vivilzb1985| | 2015-11-12 19:18 | 只看该作者
GPIO的相关寄存器的配置是所有开发中最基本的一个环节的。

使用特权

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

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2782

主题

19267

帖子

104

粉丝