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

[复制链接]
1445|8
 楼主| xyz549040622 发表于 2015-11-4 22:57 | 显示全部楼层 |阅读模式
本帖最后由 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的方向和模式,函数源码如下:
  1. GPIOPinTypeGPIOOutput(uint32_t ui32Port, uint8_t ui8Pins)
  2. {
  3.     //
  4.     // Check the arguments.
  5.     //
  6.     ASSERT(_GPIOBaseValid(ui32Port));

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

  11.     //
  12.     // Make the pin(s) be outputs.
  13.     //
  14.     GPIODirModeSet(ui32Port, ui8Pins, GPIO_DIR_MODE_OUT);
  15. }


本帖子中包含更多资源

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

×
 楼主| 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);//配置输出高低电平
 楼主| xyz549040622 发表于 2015-11-11 23:09 | 显示全部楼层
关于IO电流的几种模式如下:
  1. #define GPIO_STRENGTH_2MA       0x00000001  // 2mA drive strength
  2. #define GPIO_STRENGTH_4MA       0x00000002  // 4mA drive strength
  3. #define GPIO_STRENGTH_6MA       0x00000065  // 6mA drive strength
  4. #define GPIO_STRENGTH_8MA       0x00000066  // 8mA drive strength
  5. #define GPIO_STRENGTH_8MA_SC    0x0000006E  // 8mA drive with slew rate control
  6. #define GPIO_STRENGTH_10MA      0x00000075  // 10mA drive strength
  7. #define GPIO_STRENGTH_12MA      0x00000077  // 12mA drive strength

具体芯片支持哪种模式,需要看数据手册的。
 楼主| xyz549040622 发表于 2015-11-11 23:10 | 显示全部楼层
关于IO引脚的模式的几种配置如下:
  1. #define GPIO_PIN_TYPE_STD       0x00000008  // Push-pull ÍÆÍìģʽ
  2. #define GPIO_PIN_TYPE_STD_WPU   0x0000000A  // Push-pull with weak pull-up
  3. #define GPIO_PIN_TYPE_STD_WPD   0x0000000C  // Push-pull with weak pull-down
  4. #define GPIO_PIN_TYPE_OD        0x00000009  // Open-drain
  5. #define GPIO_PIN_TYPE_ANALOG    0x00000000  // Analog comparator
  6. #define GPIO_PIN_TYPE_WAKE_HIGH 0x00000208  // Hibernate wake, high
  7. #define GPIO_PIN_TYPE_WAKE_LOW  0x00000108  // Hibernate wake, low
具体芯片支持哪种模式,需要看数据手册的。
perry_peng 发表于 2015-11-12 09:57 | 显示全部楼层
谢谢分享。
尤彼卡 发表于 2015-11-12 14:03 | 显示全部楼层
TIVA的GPIO时钟默认挂在APB总线上的
vivilzb1985 发表于 2015-11-12 19:18 | 显示全部楼层
GPIO的相关寄存器的配置是所有开发中最基本的一个环节的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2841

主题

19330

帖子

110

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