查看: 850|回复: 0

C6000 DSP基础知识之 GPIO

[复制链接]

该用户从未签到

发表于 2020-11-21 19:28:24 | 显示全部楼层 |阅读模式
分享到:

一、   DSP的结构

(1)、哈佛结构:将程序和数据存储在不同的存储器中,每个独立存储器独立编址,独立访问。
   5.jpg


(2)、多级流水线:一种DSP指令(取指、译码、取操作数、执行).每个阶段称为一级流水线。

(3)、硬件乘法器。

(4)、特殊的DSP指令。

(5)、多总线,多处理单元。

二、   TMS320C6000系列DSP

C67X包括:程序取指单元、指令分配单元、指令译码单元、(A/B)2组通用寄存器(共32个)、8个功能单元、1组控制寄存器、控制逻辑、测试仿真和中断控制逻辑。TMS320C67X DSP的结构框图如下图所示:

6.jpg


C674X有两级缓存:32Kb L1P程序缓存、32Kb L1D数据缓存、256KbL2二级缓存。(初始条件下二级缓存当做内存来使用。L1才当做缓存使用)。

片内外设:EMIFA/B、EDMA3(x2)、Timers、GPIO、UART(x3)、SPI、I2C(x2)、HPI、USB1.0/USB2.0、McASP(x2)、EMAC肪宽发生器、VPIF、SATA、MMC/SD(8b)(x2)、HPI、MDIO、128KBRAM。

三、  DSP子系统


四、General-Purpose-Input/Output(GPIO)   Bank0-Band8  9*16=144个GPIO

一旦GPIO使能寄存器(GPIEN)被使能,GPIO引脚可以用做通用目的输入、输出。用户可以使用GPIO方向寄存器(GPDIR)独立配置每条GPIO引脚为输入或输出。

当配置为输出(GPxDIR位=1),GPIO值(GPVAL)寄存器:GPxVAL位的值就被送到相应的GPn引脚。

当配置为输入(GPxDIR位=0)时,输入状态可以从相应的GPxVAL读取。

除了通用目的输入/输出功能外,GPIO外设的边沿检测逻辑反映了配置为输入(GPxDIR位=0)的指定GPIO引脚是否发生一个信号的变化。GPIO三角Delta Register反映GPIO信号的变化。

当相应的使能输入发生从低电平到高电平的变化时,GPDH的GPxDH位被置1;

当相应的使能输入发生从高电平到低电平的变化时,GPDL的GPxDL位被置1;

7.jpg


  1. <p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">GPIO Enable Register (GPEN)、</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">GPIO Direction Register (GPDIR)、</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">GPIO Value Register (GPVAL)、</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">GPIO Delta High Register(GPDH)、</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">GPIO Delta Low Register (GPDL)、</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">GPIO High Mask Register (GPHM)、</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">GPIO Low Mask Register (GPLM)、</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">GPIO Global Control Register (GPGC)、</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">GPIO Interrupt Polarity Register (GPPOL)</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">// GPIO0[0] 1</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">    // GPIO1[0] 17</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">         // GPIO2[0] 33</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">    // GPIO3[0] 49</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">         // GPIO4[0] 65</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">    // GPIO5[0] 81</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">         // GPIO6[0] 97</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">         // GPIO7[0] 113</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">         // GPIO8[0] 129</font></font></p>
复制代码



3.1、怎样配置一个GPIO的输入输出?

1)、使能通用输入输出端口外设(GPIO)。

         //使能 GPIO 模块(对相应外设模块的使能也可以在 BootLoader 中完成)

PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);

2)、配置相应GPIO口为普通输入输出口(I/O复用中选择复用功能)。

savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) &

                  ~(SYSCFG_PINMUX1_PINMUX1_31_28));   //读取相应寄存器的值

HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) =

               (PINMUX1_GPIO0_0_ENABLE | savePinmux); //设置相应寄存器的值

HWREG:外设寄存器的值的宏定义。

3)、配置相应GPIO口为输入或输出。

GPIODirModeSet(SOC_GPIO_0_REGS, 1,  GPIO_DIR_OUTPUT);    GPIO_DIR_INPUT

4)、配置相应GPIO口输入或输出高底电平。

GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW);    //底电平 GPIO0[0]

             GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_HIGH);    //高电平 GPIO0[0]

3.2、如何配置GPIO中断?

1)、使能通用输入输出端口外设(GPIO)。

2)、配置相应GPIO口为普通输入输出口(I/O复用中选择复用功能)。

3)、配置相应GPIO口为输入。

4)、使能GPIO BANK中断。

5)、设置管脚中断触发类型。

6)、映射中断并注册中断服务函数。

GPIOIntTypeSet(SOC_GPIO_0_REGS, 7, GPIO_INT_TYPE_FALLEDGE); // 配置 USER0 KEY GPIO0[6] 为下降沿触发

GPIO_INT_TYPE_BOTHEDGE); // 配置USER1 KEY GPIO6[1] 为上升沿及下降沿触发

  1. <p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">// 使能 GPIO BANK 中断</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">    GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);    // USER0 KEY GPIO0</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">    GPIOBankIntEnable(SOC_GPIO_0_REGS, 6);    // USER1 KEY GPIO6</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">         // 注册中断服务函数</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">         IntRegister(C674X_MASK_INT4, USER0KEYIsr);</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">         IntRegister(C674X_MASK_INT5, USER1KEYIsr);</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">         // 映射中断到 DSP 可屏蔽中断</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">         IntEventMap(C674X_MASK_INT4, SYS_INT_GPIO_B0INT);</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">         IntEventMap(C674X_MASK_INT5, SYS_INT_GPIO_B6INT);   // SYS_INT_GPIO_B6INT中断事件(如下:)</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">         // 使能 DSP 可屏蔽中断</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">         IntEnable(C674X_MASK_INT4);</font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">         IntEnable(C674X_MASK_INT5);</font></font></p>
复制代码

7)、使能DSP中断。

IntDSPINTCInit();   // 初始化 DSP 中断控制器

         IntGlobalEnable();  // 使能 DSP 全局中断

中断服务函数:

    GPIOBankIntDisable(SOC_GPIO_0_REGS, 0);  // 禁用 GPIO BANK 0 中断

IntEventClear(SYS_INT_GPIO_B0INT);      // 清除 GPIO BANK 0 中断状态

………………  ;        //执行短小的中断函数。

    GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);  // 使能 GPIO BANK 0 中断

中断类型:

1)、复位中断(RESET)优先级最高

2)、不可屏蔽中断/异常:所有软件中断和两个外部中断RS、NMI。

3)、12个可屏蔽硬件中断(INT4-INT15)  12个事件中断源。

4)、可屏蔽硬件异常(EXCAP)。

事件:0-127个独立事件和组合事件(Event Combiner)

0~127个独立中断事件定义在interrupt.h头文件中: TimerInterrupts、Syscfg Interrupts、PRU Interrupts、EHRPWM Interrupts、EDMA Interrupts、EMU Interrupts、IDMA Interrupts、MMCSD Interrupts、USB Interrupts、SATA Interrupts、EMAC Interrupts、HPI Interrupts、I2C Interrupts、SPI Interrupts、UART Interrupts、GPIO Interrupts、ECAP Interrupts、EMIF Interrupts、DDR Interrupts、MCASP Interrupts、RTC Interrupts、PSC Interrupts、LCD Interrupts、MCBSP Interrupts、UPP Interrupts、VPIF Interrupts、INTC Interrupts、EMC Interrupts、PMC Interrupts、UMC Interrupts、PDC Interrupts、SYS Interrupts、DMC Interrupts、

组合事件Event Combiners:

8.jpg

9.jpg
中断事件选择

10.jpg


中断错误事件

11.jpg


中断向量表(功能:在相应中断发生后,跳转到相应的地址,执行相应的指令。)

1、  ISFP(interrupt service fetchpacket)中断服务取指包

2、  最多8条32位指令/14条紧凑指令(Compact Instance)

3、  中断向量表可以储存在DSP存储器的任何存储空间,只要满足入口地址对齐到1K字节即可。


回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条



手机版|小黑屋|与非网

GMT+8, 2024-5-17 11:23 , Processed in 0.103043 second(s), 16 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.