硬件准备
ADSP-21489EVB:ADI 21489处理器的开发板
AD-HP530ICE:ADI DSP专用仿真器
USBi:ADI SigmaDSP和SHARC DSP的图形化编程调试器
软件准备:
Visual DSP++
CCES
SigmaStudio
硬件链接示意图
LED的硬件设计原理图
以上全部都 OK 之后,我们就可以开始跑程序了。(抱歉上面几项写的很罗嗦,都是我这近 15 年来开发 ADI DSP 实际项目里碰到问题的经验之谈,希望能够对用户有帮助)
跑程序就涉及到了 Visual DSP++软件的操作,我有录制过一个视频教程,是专门讲VisualDSP++软件的,把这个软件几乎每一个菜单,每一个符号都详细的过了一遍,如果有需要的用户可以参考一下那个视频。
Visual DSP++软件教学视频的链接:我以前把视频都放到优酷,这里贴外站链接是不是不太好,我再研究一下怎么放到本站。
这里我就简单的列一个基本程序,是如何使用 VDSP 来跑的。
首先,VDSP 不认中文路径,这个非常关键,意味着你必须要把你得程序全部都放在纯英文路径下,否则编译就会出错,完全无法进行程序开发,切记切记!
我们来跑一个核心板上按键控制灯的程序。程序我放在了 F 盘根目录底下,有人会说你F 盘是“工作”,中文路径,跟上面说的纯英文路径不一致啊。别闹,这个就是纯英文路径。
“.dpj”是你的工程文件,你在 VDSP 里新建工程也会出现这个,我这里就不新建了,直接调用已经写好的。怎么调用呢?软件里有打开工程的选项,我一般都更直接一些,扯着这个“ADSP21489_PBLED.dpj”直接拽进软件里就好了。
打开这个.c,我们来看看这个程序想干嘛?
结合整个 C 文件里的程序,我们看懂了,总共三个按键,对应前面有三个 LED 灯,按下一个按键,对应某一个 LED 灯亮。
让我们来编译运行,试试看。
当程序跑起来之后,我按下 KEY1,则 LED1 亮起;按下 KEY2,则 LED2 亮起,按下 KEY3, 则 LED3 亮起。
至于怎么用 21489 来控制按键点灯,这些个程序上的配置,那就仔细看看整个程序把,我这里不再多罗嗦了。补充一点,看不懂的,比如这个寄存器为什么这么配,可以直接 vdsp 的 help 里去搜就能搜到啦,VDSP 的 help 集成了所有有用的资料,非常好用!
特别注意:21489 的寄存器详细说明在哪里?写程序一定会遇到配置寄存器的问题,而非常多 ADI DSP 的新手用户,不光是 21489,都会找不到寄存器的详细说明文件。这里统一说一下,所有 ADI DSP 的寄存器说明,到 VDSP 的 help 里去搜!举一个最简单的例子。
BF533 的 PPI,PPI_CONTROL 这个寄存器的详细说明,上哪里去找(21489 同理)。
我们打开 Visual DSP++软件,打开帮助。
然后输入你要找的寄存器名称。就会列出所有跟这个寄存器相关的文档,找到 533 的,点开就看到啦。
你会发现你这个寄存器的详细介绍文档是哪个?看左边。
这个文档的名字叫:ADSP-BF533 Hardware Reference…,所以所有的寄存器都在这个文档里进行了详细的说明。
21489 也一样,也是在 ADSP-21489 Hardware Reference 的文档里,如果你嫌麻烦,就在help 里找,如果你想要通读一下,我们也有提供这个文档,打开文档仔细看即可!
PS:找了半天没找到上传代码的地方,本来还想把这个简单的程序传上来,有兴趣的可以去看看。
程序源码
#include
#include
#include
#include
#include
#include “PBLED_test.h”
int main(void)
{
InitPLL();
Config_SRU_LEDS();
Setup_Ints();
while(1);
}
void InitPLL(void)
{
int n;
*pPMCTL = (PLLM16|PLLD4|DIVEN);
*pPMCTL |= PLLBP;
*pPMCTL ^= DIVEN;
for(n = 0; n < 10000; n++ )
{
asm("nop;");
}
*pPMCTL ^= PLLBP;
}
void Config_SRU_LEDS(void)
{
SRU(FLAG4_O,DPI_PB06_I); //DPI => We can use flags.
SRU(FLAG6_O,DPI_PB14_I); //DPI => We can use flags.
SRU(FLAG7_O,DPI_PB13_I); //DPI => We can use flags.
SRU(HIGH,DPI_PBEN06_I);
SRU(HIGH,DPI_PBEN14_I);
SRU(HIGH,DPI_PBEN13_I);
}
void LED1_OFF(void)
{
SRU(HIGH,DPI_PBEN06_I);
}
void LED2_OFF(void)
{
SRU(HIGH,DPI_PBEN14_I);
}
void LED3_OFF(void)
{
SRU(HIGH,DPI_PBEN13_I);
}
void LED1_ON(void)
{
SRU(LOW,DPI_PBEN06_I);
}
void LED2_ON(void)
{
SRU(LOW,DPI_PBEN14_I);
}
void LED3_ON(void)
{
SRU(LOW,DPI_PBEN13_I);
}
void Config_SRU_INTS(void)
{
SRU(LOW,DAI_PB19_I); //assign pin buffer 19 low so it is an input
SRU(LOW,DAI_PB20_I); //assign pin buffer 20 low so it is an input
SRU(LOW,DAI_PB16_I); //assign pin buffer 16 low so it is an input
SRU(DAI_PB19_O,MISCA1_I); //route so that DAI pin buffer 19 connects to MISCA1
SRU(DAI_PB20_O,MISCA2_I); //route so that DAI pin buffer 20 connects to MISCA2
SRU(DAI_PB16_O,MISCA3_I); //route so that DAI pin buffer 16 connects to MISCA2
SRU(LOW,PBEN19_I); //assign pin 19 low so it is an input
SRU(LOW,PBEN20_I); //assign pin 20 low so it is an input
SRU(LOW,PBEN16_I); //assign pin 16 low so it is an input
}
//
// void Setup_Ints(void)
//
// PURPOSE: Configure the system to accept the push buttons as inputs
//
//
void Setup_Ints(void)
{
Config_SRU_INTS();
(*pDAI_IRPTL_PRI) = (SRU_EXTMISCA1_INT | SRU_EXTMISCA2_INT | SRU_EXTMISCA3_INT ); //unmask individual interrupts
(*pDAI_IRPTL_RE) = (SRU_EXTMISCA1_INT | SRU_EXTMISCA2_INT | SRU_EXTMISCA3_INT ); //make sure interrupts latch on the rising edge
//Set up interrupt priorities
sysreg_bit_set(sysreg_IMASK, DAIHI); //DAIHI//make DAI interrupts high priority
interrupt(SIG_DAIH,DAIroutine);
}
//
// void DAIroutine(int sig_int)
//
// PURPOSE: ISR for pushbutton 1,2,3,4
//
//
void DAIroutine(int sig_int)
{
int iTest;
iTest = (*pDAI_IRPTL_H); // reading pDAI_IRPTL_H clears the latched interrupt.
if( SRU_EXTMISCA1_INT == iTest )
{
LED1_ON();
LED2_OFF();
LED3_OFF();
}
else if( SRU_EXTMISCA2_INT == iTest )
{
LED1_OFF();
LED2_ON();
LED3_OFF();
}
else if( SRU_EXTMISCA3_INT == iTest )
{
LED1_OFF();
LED2_OFF();
LED3_ON();
}
}