• ADSP-21489的开发详解:VDSP+自己编程写代码开发(4-按键控制 LED 灯)


    硬件准备

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    }

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    }

    //
    // 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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    }

    //
    // 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();
    }
    }

  • 相关阅读:
    AIOT入门指南:探索人工智能与物联网的交汇点
    高级深入--day41
    Redis持久化(RDB/AOF)
    静态链表习题初入门之(A-B)∪(B-A)
    【限时免费】20天拿下华为OD笔试之【回溯】2023B-第N个排序【欧弟算法】全网注释最详细分类最全的华为OD真题题解
    Geeker-Admin中ProTable表格分页之自定义接口页码、尺寸参数
    如何在 Vue 3 中使用 Ant Design
    【USB】macOS usb内核驱动开发入门
    【Java核心知识】ThreadLocal相关知识
    【网络原理】UDP和TCP协议重点知识汇总
  • 原文地址:https://blog.csdn.net/ADI_OP/article/details/128182837