接口讲完了,下面写点应用程序,GPIO最典型的应用,LED跑马灯。
硬件准备
ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器
软件准备
Visual DSP++软件
硬件链接
硬件设计原理图
硬件实现原理
ADSP-EDU-BF533开发板上共设计了 8 个 LED,这些 LED 直接连接于 CPLD,通过灌电流方式接入,需要点亮时,将该位数据写 0,通过配置 CPLD 映射的 DEVICE_OE 寄存器和 LED_DAT 寄存器,可以对 LED 灯进行控制。
其寄存器映射如下:
DEVICE_OE 寄存器(读/写):
DEVICE_OE 寄存器地址:0x20320000
DEVICE_OE 寄存器设置硬件设备上一些控制管脚的电平状态。
DEVICE_OE 寄存器位功能:
LED_OE:LED 指示灯使能位
1:关闭 LED 灯模块
0:使能 LED 灯模块
LED_DAT 寄存器(写唯一):
LED_DAT 寄存器地址:0x20340000
LED_DAT 寄存器是 LED 模块的数据寄存器,该寄存器的 8Bit 分别对应板卡上 8 个 LED 指示灯,通过对寄存器 Bit 位设置点亮其中一个 LED 指示灯。
LED_DAT:
1:熄灭 LED 灯
0:点亮 LED 灯
硬件连接示意图
代码实现功能
代码实现了通过逐次配置 LED_DAT 寄存器,实现了 LED 跑马灯功能。
调试步骤
1. 将仿真器(ICE)与 ADSP-EDU-BF53x 开发板和计算机连接好。
2. 先给 ADSP-EDU-BF53x 开发板上电,再为仿真器(ICE)上电。
3. 运行 VisualDSP++ 5.0 软件,选择合适的 BF533 的 session 将仿真器与软件连接。
4. 加载 VisualDSP++ 5.0 工程文件 BF53x_LED.dpj,编译并全速运行。
调试结果
板卡上的 LED 逐个点亮,实现跑马灯功能。
程序源码
CPLD.c
#ifndef CPLD_C
#define CPLD_C
#include “cpld.h”
void IIC_Enable(void)
{
*pDEVICE_OE &= ~PF0_SET ;
}
void Interrupt_Enable(void)
{
*pDEVICE_OE |= PF0_SET; //关闭IIC总线,将PF0设置为中断接口
}
void CMOS_Enable(void)
{
*pDEVICE_OE &= ~PPI_SET0;
*pDEVICE_OE &= ~PPI_SET1;
}
void LCD_Enable(void)
{
*pDEVICE_OE |= PPI_SET0;
*pDEVICE_OE &= ~PPI_SET1;
}
void PCLK_OUT_Enable(void)
{
*pDEVICE_OE |= PPI_SET0;
*pDEVICE_OE &= ~PPI_SET1;
}
void ExtPCLK_IN_Enable(void)
{
*pDEVICE_OE |= PPI_SET0;
*pDEVICE_OE |= PPI_SET1;
}
void LCDBK_Enable(void)
{
*pDEVICE_OE &=(~LCDBK_OE);
}
void LCDBK_Disable(void)
{
*pDEVICE_OE |= LCDBK_OE;
}
void LED_Enable(void)
{
*pDEVICE_OE &= ~LED_OE; //使能LED
}
void SD_Enable(void)
{
*pDEVICE_OE |= SPI_SEL0;
*pDEVICE_OE &= ~SPI_SEL1;
}
void Touch_Enable(void)
{
*pDEVICE_OE &= ~SPI_SEL0;
*pDEVICE_OE &= ~SPI_SEL1;
}
void ExtSPI0_Enable(void)
{
*pDEVICE_OE &= ~SPI_SEL0;
*pDEVICE_OE |= SPI_SEL1;
}
void ExtSPI1_Enable(void)
{
*pDEVICE_OE |= SPI_SEL0;
*pDEVICE_OE |= SPI_SEL1;
}
void ExtIO_Interrupt_Enable(void)
{
*pDEVICE_OE &= ~EXT_IO_INTOE;
}
void ExtIO_Interrupt_Disable(void)
{
*pDEVICE_OE |= EXT_IO_INTOE;
}
#endif
LED.C
#include
#include “cpld.h”
delay(int count)
{
int i;
for(i=0;i
void Set_PLL(unsigned int pmsel,unsigned int pssel)
{
unsigned int new_PLL_CTL;
*pPLL_DIV = pssel;
asm(“ssync;”);
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm(“ssync;”);
asm(“idle;”);
}
}
void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}
void main(void)
{
unsigned int i;
Set_PLL(16,4);
Init_EBIU();
LED_Enable();
while(1)
{
*pLED_DAT =0x00; //点亮所有LED灯
for(i=0;i<8;i++)
{ *pLED_DAT = ~(0x1<
}