本章需要参考的资料为
《General Purpose Input Output (GPIO) User Guide.pdf》,具体在创龙资料文件夹目录下D:\JYTL\12DSP_FPGA\08_文档\创龙\TL6678ZH-EVM_V1.5\TL6678ZH-EVM_V1.5\6-开发参考资料\数据手册\核心板元器件\DSP\Technical Reference Manual
《Multicore Fixed and Floating-Point Digital Signal Processor》,即TMS320C6678的数据手册
6678的GPIO寄存器操作
- GPIO Registers
- 参考代码
- 工程文件
GPIO Registers
上表中给出的是偏移地址,那么是在哪个地址上偏移的呢?这个需要查找上面的第二个手册:
首先看下关于GPIO的寄存器,如上表所示
上述内容同样来源于手册,简单分析可知:
DIR :方向控制寄存器 0表示设置为输出;1表示设置为输入
OUT_DATA:输出数据寄存器
SET_DATA:将数据对应bit直接置1
CLR_DATA:将数据对应bit设置为0
IN_DATA:输入数据寄存器
我们分析一下数据手册中的说明,针对OUT_DATA
和SET_DATA
和CLR_DATA
;这几个寄存器都是针对输出而言,如果方向设置为输入,那么操作这几个寄存器是没有用的。
SET_DATA
和CLR_DATA
这两个寄存器,只支持往里面写1;如果写0则无效;
参考代码
/*
* main.c
*/
#include <stdio.h>
#include <c6x.h>
/* CSL Header file */
#include <ti/csl/cslr_device.h>
#include <ti/csl/csl_pscAux.h>
/* Platform utilities include */
#include "system/platform.h"
/* Driver utilities include */
#include "driver/c66x_uart.h"
/*user define*/
#define GPIO_DIR 0x02320010
#define GPIO_OUT_DATA 0x02320014
#define GPIO_SET_DATA 0x02320018
#define GPIO_CLR_DATA 0x0232001C
#define GPIO_IN_DATA 0x02320020
#define GPIO_NUM 4
/*operation on pointor*/
#define ACCESS(addr) *((unsigned int*)addr)
/**
* @brief enable psc module
*
* @param void
*
* @return NULL
*/
void psc_init()
{
/* Set psc as Always on state */
CSL_PSC_enablePowerDomain(CSL_PSC_PD_ALWAYSON);
/* Start state change */
CSL_PSC_startStateTransition(CSL_PSC_PD_ALWAYSON);
/* Wait until the status change is completed */
while(!CSL_PSC_isStateTransitionDone(CSL_PSC_PD_ALWAYSON));
}
void gpio_init()
{
/*set direction output*/
ACCESS(GPIO_DIR) &= ~(1<<4);
/*set output level*/
ACCESS(GPIO_SET_DATA) |= (1<<4);
}
int main(void) {
int i = 0;
uint32_t main_pll_freq;
// uint8_t buf = 0;
char tips_strings[] = {"\r\ntl-uart-echo Application\r\n"};
/* Enable the PSC */
psc_init();
/* UART initialization */
uart_init(CSL_UART_REGS);
/*GPIO initialization*/
gpio_init();
/* Get the cpu freq */
main_pll_freq = platform_get_main_pll_freq();
/* Set the default baud rate to 115200 */
/*
* CPU frequency = main pll out
* uart input clock = main pll out / 6
*/
uart_set_baudrate(CSL_UART_REGS, main_pll_freq/6, 115200);
uart_printf("%s", (char *)tips_strings);
int coreID = DNUM;
printf("hello world from core %d\n",coreID);
while(1)
{
while(i++ < 3);
ACCESS(GPIO_SET_DATA) |= (1<<4);
i = 0;
while(i++ < 3);
ACCESS(GPIO_CLR_DATA) |= (1<<4);
i = 0;
}
return 0;
}