LaunchXL-F28379D的简单教程系列(一)GPIO输出
注:这是本人关于Ti的C2000系列的学习笔记,所用工具有官方的开发软件CCS10版本,帮助文库以及函数库软件controlSUITE。硬件部分LaunchXL-F28379D和逻辑分析仪一台
本文分为函数库和寄存器两种方法
但都需要理解硬件的架构
图一
图二
图一较为简单,而图二相对更加具体,我们这里也基本只会涉及到图一讲解,图二待以后用其他外设的时候解释一下。
根据图一要想我们的GPIO作为输出口并正常工作至少需要配置GPxDIR、GPxMUX1或GPxMUX2、GPxGMUX1或GPxGMUX2、GPxPUD这几个寄存器。
注:
第一点:
这里解释一下,因为本DSP的封装引脚很多一共168个,由于寄存器只有32位,所以将所有的引脚分为了A,B,C,D,E,F六组
• Port A consists of GPIO0-GPIO31
• Port B consists of GPIO32-GPIO63
• Port C consists of GPIO64-GPIO95
• Port D consists of GPIO96-GPIO127
• Port E consists of GPIO128-GPIO159
• Port F consists of GPIO160-GPIO168
因此其中小x就是对应的A,B,C,D,E,F,但在函数库编写的时候是直接写引脚的编号。
假设我们要对GPIO0进行操作,首先明确它在A组,才能通过A组对其寄存器进行相关操作。
第二点:
就是(GPxGMUX1或GPxGMUX2)和(GPxGMUX1或GPxGMUX2),其实因为是两位所以一个GPxMUX1或GPxMUX2、GPxGMUX1或GPxGMUX2的寄存器,其实只涉及了16引脚,因此将它分为1和2两组。
GPxDIR寄存器是对方向的配置,0是输入(input),1是输出(output)。
GPxMUX和GPxGMUX是通过不同的配置进行外设的选择,简单就是复用的配置,这里可以看一下配置资料:
当然我们因为这里只需要普通GPIO功能就只需要把他们都设为0就行了。
GPxPUD是配置需不需上拉的寄存器,GPIO0-11都是默认不上拉,而其余的是默认上拉。
对GPIO值操作的寄存器有四个GPxSET,GPxCLEAR,GPxTOGGLE,GPxDAT
这里推荐不要直接对GPxDAT进行操作,通过GPxSET置位、GPxCLEAR复位、GPxTOGGLE翻转间接操作
直接上代码
方法一:方波个数5个(i=5)
#include "F28x_Project.h"
void delay_loop();
void main(void)
{
//1.配置时钟,需要包括F2837xD_SysCtrl.c
InitSysCtrl();
//2.初始化GPIO,需要包括F2837xD_Gpio.c
InitGpio();
//3.关CPU中断
DINT;
//4.初始化PIE,并清楚相关寄存器,需要包括F2837xD_PieCtrl.c,F2837xD_PieVect.c,F2837xD_DefaultIsr.c
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
//方法一:库函数编写,前提InitGpio()要有
//实验对象:GPIO0->P0
GPIO_SetupPinMux(0,GPIO_MUX_CPU1,0x0);//param1:引脚,param2:控制器,param3:外设(0,2,4,8默认为GPIO)
GPIO_SetupPinOptions(0,GPIO_OUTPUT,GPIO_PUSHPULL);//param1:引脚,param2:输入或输出,param3:引脚模式
int i;
for(i=5;i>0;i--)
{
GPIO_WritePin(0,0);
delay_loop();
GPIO_WritePin(0,1);
delay_loop();
GPIO_WritePin(0,0);
}
}
void delay_loop()
{
short i;
for (i = 0; i < 1000; i++) {
}
}
逻分结果:
方法二:方波个数6个(i=6)
#include "F28x_Project.h"
void delay_loop();
void main(void)
{
//1.配置时钟,需要包括F2837xD_SysCtrl.c
InitSysCtrl();
//2.关CPU中断
DINT;
//3.初始化PIE,并清楚相关寄存器,需要包括F2837xD_PieCtrl.c,F2837xD_PieVect.c,F2837xD_DefaultIsr.c
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
//方法二:寄存器编写
//实验对象:GPIO0->P0
EALLOW;//允许写入保护
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;
EDIS;//关闭写入保护
int i;
for(i=6;i>0;i--)
{
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
delay_loop();
GpioDataRegs.GPASET.bit.GPIO0=1;
delay_loop();
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
}
}
void delay_loop()
{
short i;
for (i = 0; i < 1000; i++) {
}
}
逻分结果:
总结:这是粗略讲了一下,因为后面使用外设的时候这都是基本操作,都可以通过函数库和寄存器实现,不过我更多会使用函数库的方法后面,因为我也才玩不久,现在也是慢慢啃英文参考资料,如果有啥错了直接给我评论就行了,只是记录一下。
参考资料:TMS320F2837XD Dual-Core Microcontollers Technical Reference Manual