微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > DSP学习交流 > GPIO配置深入

GPIO配置深入

时间:10-02 整理:3721RD 点击:

本次实验主要是对板底GPIO进行深入了解并搭建空工程实现流水灯工作。
硬件支持:底板有四个供用户编程使用的LED灯,分别为D6、D7、D9、D10,对应的GPIO为GPIO[5]、GPIO[0]、GPIO[1]、GPIO[2],电路原理图如下图所示:


由原理图知,当控制相关GPIO输出高电平时,LED灯亮,而当控制GPIO输出低电平时,LED熄灭。
软件设计:
1.使能GPIO模块使能GPIO模块是通过外设使能函数
int PSCModuleControl (unsigned int baseAdd, unsigned int moduleId, unsigned int powerDomain, unsigned int flags) 来实现的
其中参数'baseAdd'为外设使用的内存地;'moduleId' 外设类型,此处为GPIO(其标号为3);'powerDomain'  为未对端口进行操作时端口的初始状态;'flags',逻辑标志,为1时使能外设,为0时外设处于未使能状态   
2.配置相应的GPIO口为普通输入输出口,实现管脚复用功能
利用函数GPIOBank0Pin0PinMuxSetup();实现GPIO端口的配置   (ps:内部函数没有办法查看到了)
3.GPIO管脚初始化,配置LED对应管脚为输出模式
GPIO端口分配为:GPIO0[0] --1、GPIO1[0] --17、GPIO2[0] --33、GPIO3[0]-- 49、GPIO4[0] --65、 GPIO5[0]-- 81、GPIO6[0] --97、GPIO7[0] --113、GPIO8[0] --129。其中前半部分为GPIO模块及端口号,后半部分为对应到主控芯片的引脚好。
本次实验只用到了GPIO_0,故只需对GPIO_0进行初始化。利用函数'void GPIODirModeSet(unsigned int baseAdd, unsigned int pinNumber, unsigned int pinDir)',进行管脚初始化。其中'baseAdd'为外设GPIO在内存中的地址;'pinNumber'为对应的芯片引脚号(D7  GPIO0[0] 对应引脚号为1,GPIO0[5] 对应引脚号为6;'pinDir'为引脚模式设置,本实验中应设为输出模式'GPIO_DIR_OUTPUT'
至此,GPIO端口配置初始化完成,通过函数'void GPIOPinWrite(unsigned int baseAdd, unsigned int pinNumber, unsigned int bitValue)' 控制相关端口'pinNumber'输出电平的高低实现控制LED灯的亮灭。
程序设计代码如下所示:(此次程序设计参考了创龙提供的官方源代码)

  1. #include "TL6748.h"                 // 创龙 DSP6748 开发板相关声明
  2. #include "hw_types.h"               // 宏命令
  3. #include "hw_syscfg0_C6748.h"       // 系统配置模块寄存器
  4. #include "soc_C6748.h"              // DSP C6748 外设寄存器
  5. #include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
  6. #include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
  7. // 软件断点
  8. #define SW_BREAKPOINT   asm(" SWBP 0 ");

  9. void PSCInit(void);
  10. void GPIOBankPinMuxSet();
  11. void GPIOBankPinInit();
  12. void Delay(unsigned int n);

  13. int main(void)
  14. {
  15.         PSCInit();
  16.         GPIOBankPinMuxSet();
  17.         GPIOBankPinInit();
  18.         GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW);
  19.         GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_LOW);
  20.         GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_LOW);
  21.         GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW);
  22.         GPIOPinWrite(SOC_GPIO_0_REGS, 109, GPIO_PIN_HIGH);
  23.         GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH);

  24.         while(1)
  25.         {
  26.                 Delay(0x00FFFFFF);
  27.                 GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_LOW);    // D10 灭 GPIO0[2]
  28.                 GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_HIGH);   // D7  亮 GPIO0[0]

  29.                 Delay(0x00FFFFFF);
  30.                 GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW);    // D7  灭 GPIO0[0]
  31.                 GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_HIGH);   // D6  亮 GPIO0[5]

  32.                 Delay(0x00FFFFFF);
  33.                 GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW);    // D6  灭 GPIO0[5]
  34.                 GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_HIGH);   // D9  亮 GPIO0[1]

  35.                 Delay(0x00FFFFFF);
  36.                 GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_LOW);    // D9  灭 GPIO0[1]
  37.                 GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_HIGH);   // D10 亮 GPIO0[2]
  38.         }
  39. }

  40. void PSCInit(void)
  41. {
  42.     PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO,   PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
  43. }

  44. void GPIOBankPinMuxSet(void)
  45. {
  46.         GPIOBank0Pin0PinMuxSetup();
  47.         GPIOBank0Pin1PinMuxSetup();
  48.         GPIOBank0Pin2PinMuxSetup();
  49.         GPIOBank0Pin5PinMuxSetup();
  50. }

  51. void GPIOBankPinInit(void)
  52. {
  53.         // 核心板 LED
  54.     GPIODirModeSet(SOC_GPIO_0_REGS, 109, GPIO_DIR_OUTPUT);  // GPIO6[12]
  55.     GPIODirModeSet(SOC_GPIO_0_REGS, 110, GPIO_DIR_OUTPUT);  // GPIO6[13]

  56.     // 底板 LED
  57.     GPIODirModeSet(SOC_GPIO_0_REGS, 1, GPIO_DIR_OUTPUT);    // D7  GPIO0[0]
  58.     GPIODirModeSet(SOC_GPIO_0_REGS, 2, GPIO_DIR_OUTPUT);    // D9  GPIO0[1]
  59.     GPIODirModeSet(SOC_GPIO_0_REGS, 3, GPIO_DIR_OUTPUT);    // D10 GPIO0[2]
  60.     GPIODirModeSet(SOC_GPIO_0_REGS, 6, GPIO_DIR_OUTPUT);    // D6  GPIO0[5]
  61. }

  62. void Delay(unsigned int n)
  63. {
  64.         unsigned int i;

  65.         for(i=n;i>0;i--);
  66. }

复制代码


小结:本次实验深入地了解了DSP GPIO的配置、初始化过程,在建立空工程后,要添加进相关的头文件和库文件,并且在属性设置中,Output format 应设置为eabi(ELF)格式,也可以在建立工程的时候就预先设置好。总体来说与其它类型单片机基本配置过程类似,也真实地感受到C6748提供的IO端口之多,可以在此基础上进行很多深入的研发,作为大型项目系统的控制系统是能够胜任的。

如果是裸机操作的话,就可以省很多代码哈, C来实现GPIO的操作,需要考虑的东西确实是要多很多的。感谢小编的分享。

Output format 也可以配置成COFF吧,这两种格式均可以。

你好,在使用startWare提供的库文件的时候,要将Outformat设置为ELF格式,设置为COFF格式的话程序无法正常编译的,谢谢你

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top