• C6000系列之C6455DSP的GPIO模块


    转自:http://blog.csdn.net/ruby97/article/category/1134380

    C6000系列DSP的GPIO模块



    最近一直在做DSP与FPGA之间的视频传输工作,使用的通信方式是EDMA,为了系统的介绍通过EDMA方式在DSP与FPGA之间实现数据传输。


    首先介绍一下DSP-C6455中的GPIO与中断系统。以后再介绍DSP强大的EDMA模块,以及具体的数据传输实现。


    (注:  其实EDMA是C6455芯片中的一个模块,可以认为其是芯片内部的一个”协处理器”)



    ---------------------------华丽分割----------------------------------



    背景

    使用DSP+FPGA搭建的嵌入式系统进行视频采集,编解码,传输无疑是一个不错的选择。使用FPGA系统进行视频采集,DSP进行视频处理需要了解一下知识:

    • 1.   DSP-C6000系列的中断与GPIO系统
    • 2.   DSP-C6000系列的EDMA模块
    • 3.   FPGA的乒乓RAM
    • 4.   一种视频格式(例如VGA,PAL等)
    • 5.   视频处理算法

     

          本文将介绍DSP C6000系列的GPIO系统(针对C6455)



    ---------------------------华丽分割----------------------------------



    C6455的GPIO

          TMS320C6455中共有16个通用输入输出管脚。每一个管脚都可以单独进行配置成如下功能之一:

    •       通用输入管脚Input
    •       通用输出管脚Output
    •       中断&EDMA事件 管脚

    ---------------------------华丽分割----------------------------------


    GPIO框图

          首先看一下GPIO的框图:



    通过查看GPIO框图,我们可以得出许多信息:

    • DIR寄存器控制GPIO管脚是输入还是输出,其中,对应bit置0表示该管脚配置为输出管脚;对应bit置1表示该管脚配置为输入管脚
    • 若一个GPIO管脚配置为Output,给SET_DATA寄存器对应位置1,将使该管脚输出高电平,给CLR_DATA寄存器对应位置1,将使该管脚输出低电平。需要注意的是:向SET_DATA和CLR_DATA中写入0无作用
    • 若一个GPIO管脚配置为Input,可以通过读取IN_DATA寄存器中的对应位来获得管脚的状态。且向SET_DATA和CLR_DATA中写入0无作用
    • 若一个GPIO管脚配置为中断&EDMA事件模式,此时可以忽略该管脚的Input/Output配置。可以通过置位SET_RIS_TRIG和SET_FAL_TRIG寄存器的相应bit把GPIO管脚配置为中断/事件触发方式。如下图所示:


    由于C64+CPU无法直接访问RIS_TRIGFAL_TRIG寄存器,若要访问中断模式的配置状态,可以通过读取SET_RIS_TRIGSET_FAL_TRIG)或者CLR_RIS_TRIG(CLR_FAL_TRIG)来获取。



    ---------------------------华丽分割----------------------------------


    GPIO寄存器组      
    C6455中GPIO的寄存器组如下所示:

    其中,后面9个不再介绍了。唯独第一个寄存器之前没有介绍到

    查看官方文档:


    可以看出,只有该寄存器最低位置1时GPIO管脚才可以作为中断源。所以,只要你使用GPIO管脚中的某一个作为系统的中断源,那么该位必须置1。


    ---------------------------华丽分割----------------------------------


    GPIO管脚复用

          此外,使用GPIO时,还需要考虑到对应芯片的管脚复用问题,以6455为例,GPIO管脚复用情况如下图示:



    可见,16GPIO管脚中有大半是可以复用的。可以通过配置6455的外设配置寄存器来使能GPIO模块。即把6455中的PERCFG0寄存器中GPIO对应位置1,如下图示:







    ---------------------------华丽分割----------------------------------


    GPIO之CSL库

          使用CSL库的API函数配置DSP显然比逐一配置寄存器方面且容易理解。下面介绍一下如何使用CSL库把DSP的GPIO4配置成中断模式。

         

    • 第一步:使能GPIO模块

          使能之前,首先要解除锁,即向PERLOCK寄存器写入0x0F0A0B00,然后把PERCFG0寄存器中GPIO对应位置1。代码如下:

    1. <span style="font-family:'Microsoft YaHei';">Bool   gpioEn;  
    2. CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERLOCK,DEV_PERLOCK_LOCKVAL, UNLOCK);  
    3.    
    4. CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERCFG0, DEV_PERCFG0_GPIOCTL, ENABLE);  
    5.   
    6. do {  
    7.        gpioEn = (Bool)CSL_FEXT(((CSL_DevRegs*)CSL_DEV_REGS)->PERSTAT0,   
    8.                                  DEV_PERSTAT0_GPIOSTAT);  
    9. while (gpioEn != TRUE);  
    10. </span>  

    • 第二步:初始化GPIO模块

    1. <span style="font-family: 'Microsoft YaHei'; ">CSL_Status                    status;  
    2. CSL_GpioContext               pContext;  
    3. status   =     CSL_gpioInit(&pContext);</span>  

     

    • 第三步:打开GPIO模块
    • 第四步:使能GPIO管脚作为中断源的功能
    • 第五步:配置GPIO-PIN4的属性:方向,中断触发方式



    ---------------------------华丽分割----------------------------------



    完整的配置代码如下所示:


    1. <span style="font-family:'Microsoft YaHei';">/*----------------------------------------------------------------------------------- 
    2.  *  
    3.  *                  初始化GPIO      
    4.  *  
    5.  -----------------------------------------------------------------------------------*/  
    6. void Init_GPIO()  
    7. {  
    8.     Bool                        gpioEn;  
    9.     CSL_Status                  status;  
    10.     CSL_GpioContext             pContext;  
    11.     CSL_GpioHandle              hGpio;  
    12.     CSL_GpioObj                 gpioObj;  
    13.     CSL_GpioHwSetup             hwSetup;  
    14.     CSL_GpioPinConfig           config;  
    15. //    CSL_GpioPinNum            pinNum;  
    16.   
    17.     /* Unlock the control register */  
    18.     CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERLOCK, DEV_PERLOCK_LOCKVAL,   
    19.               UNLOCK);  
    20.                  
    21.     /* Enable the GPIO */  
    22.     CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERCFG0, DEV_PERCFG0_GPIOCTL,   
    23.               ENABLE);  
    24.   
    25.     do {  
    26.         gpioEn = (Bool) CSL_FEXT(((CSL_DevRegs*)CSL_DEV_REGS)->PERSTAT0,   
    27.                                    DEV_PERSTAT0_GPIOSTAT);  
    28.     } while (gpioEn != TRUE);  
    29.   
    30.         /* Initialize the GPIO CSL module */  
    31.     status = CSL_gpioInit(&pContext);  
    32.   
    33. #ifdef SHOW_PRINTF  
    34.     if (status != CSL_SOK) {  
    35.         printf("GPIO: Initialization error.\n");  
    36.         return;  
    37.     }  
    38.     else {  
    39.         printf("GPIO: Module Initialized.\n");  
    40.     }  
    41. #endif  
    42.   
    43.     /* Open the CSL module */  
    44.     hGpio = CSL_gpioOpen(&gpioObj, CSL_GPIO, NULL, &status);  
    45. #ifdef SHOW_PRINTF  
    46.     if ((hGpio == NULL) || (status != CSL_SOK)) {  
    47.         printf("GPIO: Error opening the instance.\n");  
    48.         return;  
    49.     }  
    50.     else {  
    51.         printf("GPIO: Module instance opened.\n");  
    52.     }  
    53. #endif  
    54.   
    55.     /* Setup hardware parameters */  
    56.     hwSetup.extendSetup = NULL;  
    57.       
    58.     /* Setup the General Purpose IO */  
    59.     status = CSL_gpioHwSetup(hGpio, &hwSetup);  
    60.   
    61.     /* Enable the bank interrupt */  
    62.     status = CSL_gpioHwControl(hGpio, CSL_GPIO_CMD_BANK_INT_ENABLE, NULL);  
    63. #ifdef SHOW_PRINTF  
    64.     if (status != CSL_SOK) {  
    65.         printf("GPIO: Command to enable bank interrupt... Failed.\n");  
    66.     }  
    67.     else {  
    68.         printf("GPIO: Command to enable bank interrupt... successful.\n");  
    69.     }  
    70. #endif  
    71.   
    72.     /* Configure pin 4 to generate an interrupt on Rising Edge, and 
    73.      * configure it as an input, then set the data High (Low->High). 
    74.      * Set Trigger:  
    75.      */  
    76.     config.pinNum       = CSL_GPIO_PIN4;  
    77.     config.trigger      = CSL_GPIO_TRIG_RISING_EDGE;  
    78.     config.direction    = CSL_GPIO_DIR_INPUT;  
    79.   
    80.     /* configure the gpio pin 4 */  
    81.     status = CSL_gpioHwControl(hGpio, CSL_GPIO_CMD_CONFIG_BIT, &config);  
    82. #ifdef SHOW_PRINTF  
    83.     if (status != CSL_SOK) {  
    84.         printf("GPIO: GPIO pin configuration error.\n");  
    85.         return;  
    86.     }  
    87.     else {  
    88.         printf("GPIO: GPIO pin configuration successful.\n");  
    89.     }  
    90. #endif  
    91. }</span> 

  • 相关阅读:
    数据类型的总结
    typeof加括号和不加括号的区别
    排序
    数据类型分为哪两类
    css中需要更小的字体如何实现
    一些细节注意点
    数值转换题
    如何用分支结构计算年份
    Scout YYF I
    D. AND, OR and square sum
  • 原文地址:https://www.cnblogs.com/youngforever/p/3104728.html
Copyright © 2020-2023  润新知