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灯的亮灭。
程序设计代码如下所示:(此次程序设计参考了创龙提供的官方源代码)
- #include "TL6748.h" // 创龙 DSP6748 开发板相关声明
- #include "hw_types.h" // 宏命令
- #include "hw_syscfg0_C6748.h" // 系统配置模块寄存器
- #include "soc_C6748.h" // DSP C6748 外设寄存器
- #include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
- #include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
- // 软件断点
- #define SW_BREAKPOINT asm(" SWBP 0 ");
- void PSCInit(void);
- void GPIOBankPinMuxSet();
- void GPIOBankPinInit();
- void Delay(unsigned int n);
- int main(void)
- {
- PSCInit();
- GPIOBankPinMuxSet();
- GPIOBankPinInit();
- GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW);
- GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_LOW);
- GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_LOW);
- GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW);
- GPIOPinWrite(SOC_GPIO_0_REGS, 109, GPIO_PIN_HIGH);
- GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH);
- while(1)
- {
- Delay(0x00FFFFFF);
- GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_LOW); // D10 灭 GPIO0[2]
- GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_HIGH); // D7 亮 GPIO0[0]
- Delay(0x00FFFFFF);
- GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW); // D7 灭 GPIO0[0]
- GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_HIGH); // D6 亮 GPIO0[5]
- Delay(0x00FFFFFF);
- GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW); // D6 灭 GPIO0[5]
- GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_HIGH); // D9 亮 GPIO0[1]
- Delay(0x00FFFFFF);
- GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_LOW); // D9 灭 GPIO0[1]
- GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_HIGH); // D10 亮 GPIO0[2]
- }
- }
- void PSCInit(void)
- {
- PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- }
- void GPIOBankPinMuxSet(void)
- {
- GPIOBank0Pin0PinMuxSetup();
- GPIOBank0Pin1PinMuxSetup();
- GPIOBank0Pin2PinMuxSetup();
- GPIOBank0Pin5PinMuxSetup();
- }
- void GPIOBankPinInit(void)
- {
- // 核心板 LED
- GPIODirModeSet(SOC_GPIO_0_REGS, 109, GPIO_DIR_OUTPUT); // GPIO6[12]
- GPIODirModeSet(SOC_GPIO_0_REGS, 110, GPIO_DIR_OUTPUT); // GPIO6[13]
- // 底板 LED
- GPIODirModeSet(SOC_GPIO_0_REGS, 1, GPIO_DIR_OUTPUT); // D7 GPIO0[0]
- GPIODirModeSet(SOC_GPIO_0_REGS, 2, GPIO_DIR_OUTPUT); // D9 GPIO0[1]
- GPIODirModeSet(SOC_GPIO_0_REGS, 3, GPIO_DIR_OUTPUT); // D10 GPIO0[2]
- GPIODirModeSet(SOC_GPIO_0_REGS, 6, GPIO_DIR_OUTPUT); // D6 GPIO0[5]
- }
- void Delay(unsigned int n)
- {
- unsigned int i;
- for(i=n;i>0;i--);
- }
小结:本次实验深入地了解了DSP GPIO的配置、初始化过程,在建立空工程后,要添加进相关的头文件和库文件,并且在属性设置中,Output format 应设置为eabi(ELF)格式,也可以在建立工程的时候就预先设置好。总体来说与其它类型单片机基本配置过程类似,也真实地感受到C6748提供的IO端口之多,可以在此基础上进行很多深入的研发,作为大型项目系统的控制系统是能够胜任的。
如果是裸机操作的话,就可以省很多代码哈, C来实现GPIO的操作,需要考虑的东西确实是要多很多的。感谢小编的分享。
Output format 也可以配置成COFF吧,这两种格式均可以。
你好,在使用startWare提供的库文件的时候,要将Outformat设置为ELF格式,设置为COFF格式的话程序无法正常编译的,谢谢你