嵌入式开发之DSP学习

一、ARM、DSP、FPGA

        ARM具有比较强的事务管理功能,可以用来跑界面以及应用程序等,其优势主要体现在控制方面;ARM是32位的单片机,其内部硬件资源的性能较高,可以加载操作系统成为其主要特点,有了操作系统,就可以像pc机那样多任务实时处理,就是同一时间内能完成多个任务,而且不会互相影响。

        DSP主要是用来计算的,比如进行加密解密、调制解调等,优势是强大的数据处理能力和较高的运行速度。

        FPGA可以用VHDL或verilog HDL来编程,灵活性强,由于能够进行编程、除错、再编程和重复操作,因此可以充分地进行设计开发和验证。当电路有少量改动时,更能显示出FPGA的优势,其现场编程能力可以延长产品在市场上的寿命,而这种能力可以用来进行系统升级或除错。

ARM、DSP、FPGA比较——非常详细深入_wuqx_blogs的博客-CSDN博客_arm和dsp和fpga

二、DSP

最近所用到的芯片是DSPF28335和DSP28034。

F28335的特点:

1)F28335为哈佛结构的DSP,在逻辑上有4M × \times× 16位的程序空间和4M × \times× 16位的数据空间,物理上将程序空间和数据空间统一成一个4M × \times× 16位的空间。
2)F28335片内共有34K × \times× 16位单周期单次访问随机储存器 SARAM,分为10 个块,分别位M0、M1、L0~L7。
3)M0和M1快SARAM的大小均为 1K × \times× 16位,当复位后,堆栈指向M1块的起始地址,堆栈指针向上生长。M0和M1段都可以映像到程序区和数据区。
4)L0~L7块SARAM的大小均为 4K × \times× 16位,既可以映射到程序空间,也可以映射到数据空间,其中L0~L3可映射到两块不同的地址空间并且受片上FLASH中的密码保护,以免存在上面的程序或者数据,被他人非法复制。
5)F28335片上有 256K × \times× 16位嵌入式FLASH储存器和 1K × \times× 16位一次可编程EEPROM储存器,均受片上Flash中的密码保护。FLASH储存器由8个 32K × \times× 16位扇区组成,用户可以对其中任何一个扇区进行擦除、编程和检验,而其他扇区不变。但是,不能在其中一个扇区上执行程序来擦除和编程其他的扇区。

(1条消息) DSP_紫宸094的博客-CSDN博客

2.1 DSP入门

        通过传感数将非电物理量转换为模拟电信号,预处理一般包括放大器和滤波器两部分,信号经过放大器的放大变为具有一定幅值的模拟输入信号,而滤波器(低通或带通)的作用则是滤除输入模拟信号中的无用频率成分和噪声,避免采样后发生频谱混叠失真。A/D转换器的任务是在满足奈奎斯特采样定理的条件下,将模拟信号转换为数字信以,DSP负责对输入数字信号进行某些算法,如卷积、相关、滤波或快速傅里叶变换(FFT)等。经过处理之后的数字信号再进行DA转换,由于转换输出的模拟信号中含有许多高频成分,因此要通过重建滤波器滤除这些高频信号,以获得平滑的模拟输出信号。

        实际上,为了完成数字信号处理的任务,除了图1-1所示的DSP基本结构之外,还必须在DSP系统中配置人机接口、存储器、通信接口、测试接口和电源设备等。
 

(1)ARM是32位的;DSP有16位的,也有更高的

(2)所有说从运算能力上看,C51最弱,DSP最强,ARM居中

(3)DSP频率很高(高的达到300MHz 以上),所以功耗大。ARM芯片面积也很小,ARM7是0.55平方毫米,功耗也比较小。频率大约在(几十到200MHz之间)

(4)DSP则主要应用于需要进行复杂计算的高端系统,例如图像处理,加密解密,导航系统等,外围module一般较少

ARM具有比较强的事务管理功能,可以用来跑界面以及应用程序等,其优势主要体现在控制方面,DSP主要是用来计算的,比如进行加密解密、调制解调等,优势是强大的数据处理

一般说来,ARM的功耗小,适合于对功耗要求比较苛刻的地方,而DSP功耗较大。你不能假设他们主频相同然后比较优劣,因为两者的主频一般并不相同。ARM的优点不在于主频,而在于片上外设比较丰富,接口多种多样,适合于各种嵌入式系统。DSP当然就是以速度高为优点,用途比较专。

DSP(数字信号处理器)技术概要_开心死啦.的博客-CSDN博客_dsp技术

DSP到底是个什么鬼?看完你就懂了_EDA365电子论坛的博客-CSDN博客_dsp

献给初学者-DSP入门教程_newbie_xymt的博客-CSDN博客_dsp编程

2.2 DSP指令

1、EINT、DINT

作用:EINT开中断,DINT关中断

2、ERTM、DRTM

作用:ERTM使能调试事件,DRTM禁止调试事件

3、ESTOP0

这是一个汇编指令,是用于DSP仿真的,它有两个方面的知识:

(1)当用仿真器连接时如果ESTOP0置位(ESTOP0=1),那么整个DSP停止运行(相当于断电指令,程序跑到这里就会停止)。(2)当不用仿真程序时,在程序中写这条指令相当于NOP(空指令),只是占了CPU的一个周期而已

4、EALLOW和EDIS

作用:EALLOW设置状态寄存器1的C6位,此时处于禁写状态的寄存器解禁

           EDIS清除状态寄存器1的C6位,寄存器重新恢复禁止写入状态

DSP由于在上电复位之后,状态寄存器基本上都是清零,而这样的状态下正是上述特殊寄存器禁止改写的状态。为了能够对这些特殊寄存器进行初始化,所以在对上述特殊寄存器进行改写之前,一定要执行汇编指令asm(“EALLOW”)或者宏定义EALLOW来设置状态寄存器1的C6位,在设置完寄存器之后,一定要注意执行汇编指令asm(“EDIS”)或者宏定义EDIS来清除状态寄存器1的C6位,来防止杂散代码或指针破坏寄存器内容。

【DSP】DSP2833x.h中定义的指令EINT、DINT、ERTM、DRTM、EALLOW、EDIS、ESTOP0的含义_aoxiang_ywj的博客-CSDN博客_dint指令是什么意思

DSP与STM32单片机的区别是什么 - 控制/MCU - 电子发烧友网 (elecfans.com)

2.3 DSP中的CMD文件

链接命令文件(Link Command Files),以后缀.cmd结尾,简称CMD文件。CMD文件的两大功能是指示存储空间和分配段到存储空间。在编写CMD文件时,主要采用MEMORY和SECTIONS 两条伪指令。

DSP中的cmd文件 - 走看看 (zoukankan.com)

 2.4 DSP中断

中断PIE即外设设备发出中断,统一到CPU进行处理操作。

DSP中断管理分为3个层次:外设级,PIE级,CPU级。
其中,外设级中断管理负责具体外设中断源的允许与禁止,PIE级中断管理负责对外设级中断分组并按照优先级管理,CPU内核级中断管理则负责处理直接向CPU申请的中断请求。

DSP控制器的外设中断扩展模块(PIE),对中断进行集中化扩展,使每一级CPU中断均可以响应多个中断源。

DSP入门:中断PIE_剑起沧澜的博客-CSDN博客_pie中断

TMS320F28335中断向量表

在 F28335 中采用 PIE 中断向量表来解决上述问题,通过 PIE 中断向量表使得 96 个可能产生的中断都有各自独立的 32 位入口地址。PIE 向量表由 256X16B的 SRAM 内连续存放,如果这部分空间不用作 PIE 模块时,可用作数据 RAM。复位时,PIE 向量表内容没有定义。 CPU 的中断优先级有高到低依次是从INT1-INT12。每组 PIE 控制的 8 个中断优先级依次是从 INTx.1-INTx.8。PIE 向量表如下所示:

TMS320F28335中断向量表_虹月铺江船的博客-CSDN博客_28335中断向量表

2.5 DSP硬件环境

首先我们需要知道运行DSP所需的最基本的硬件组件,也就是大家平时所说的最小系统。
只要DSP有了最小系统,他就能够正常运行起来,实现基本的功能。如果还需要什么功能,只需要在这个基础上增加一些外设就行了。
DSP的最小系统包括:时钟电路、电源电路、外部连接电路、复位电路
时钟电路
时钟电路,号称数字电路的心脏,其重要性可想而知。这里所说的时钟电路,是DSP的外部时钟电路,DSP内部也内嵌有时钟,只不过时钟的频率低一点,精度差一点。一般来说,所有的数字芯片都会有外部时钟电路的。

电源电路
电源电路,就是供电的。

外部连接电路
外部连接电路,是指如:串口,JTAG这样的能够与上位机通信的连接电路。做DSP开发,JTAG接口是必不可少的,它既能用于下载程序,也能用于调试代码。说到JTAG,必须要提到一个东西–DSP仿真器。仿真器是个什么东西?JTAG是个接口,仿真器就是有JTAG接口的调试工具,它本身也是个电路板,它两端有接口,用于连接DSP和电脑。仿真器的usb口插入电脑,JTAG接口插入DSP的外部链接电路上的JTAG口上,通电之后,就实现了电脑与DSP之间的连接。

复位电路
复位电路,就是在上电的时候,将DSP的一些特殊寄存器置于初始状态,确定DSP的工作模式,给DSP的硬件和软件一个确定的、唯一的起点。当然,除了上电,一般也有按键复位。

2.6 DSP实验参考

(一)DSP28335基础教程——GPIO输出(流水灯实验)_Sk Electronics的博客-CSDN博客_dsp流水灯

2.7 DSP中GPIO的寄存器

DSPF28069——GPIO寄存器记录1_sxhpai的博客-CSDN博客_gpamux1和gpamux2

2.8 时钟

时钟相关寄存器

外设时钟控制寄存器PCLKCR0、PCLKCR1、PCLKCR2、PLCLKCR3
低速外设时钟预分频器寄存器LOSPCP
内部振荡器调整寄存器(INTOSCnTRIM)
时钟寄存器(XCLK)
时钟控制寄存器(CLKCTL)
PLL控制寄存器、PLL状态寄存器、PLL锁定周期寄存器(PLLCR、PLLSTS、PLLLOCKPRD)
PLL2控制寄存器、PLL2乘法寄存器、PLL2锁存状态寄存器(PLL2CTL、PLL2MULT、PLL2STS)
SYSCLK2计数器寄存器(SYSCLK2CNTR)
EPWM DMA/CLA配置寄存器(EPWMCFG)

DSPF28069——时钟记录5_sxhpai的博客-CSDN博客

三、问题记录

3.1 PieCtrlRegs.PIEACK.all = PIEACK_GROUP7

例: PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;//中断已应答,可以从组1接收更多中断

除了PIEACK_GROUP7还可以设置其他参数,例如在收发通讯的时候

interrupt void scia_Tx_isr() {

        PieCtrlRegs.PIEACK.all=M_INT9;

}

四、经验记录

1.GPIO口有输入输出选项,这是和IO口不同的地方

2.在一个n×n的矩阵键盘,要识别其中的某一个按键是否被按下,可以采用逐行扫描的方法

3.数组可以直接传入到指针里面

#include <stdio.h>
 
/* 函数声明 */
double getAverage(int *arr, int size);
 
int main ()
{
   /* 带有 5 个元素的整型数组  */
   int balance[5] = {1000, 2, 3, 17, 50};
   double avg;
 
   /* 传递一个指向数组的指针作为参数 */
   avg = getAverage( balance, 5 ) ;
 
   /* 输出返回值  */
   printf("Average value is: %f\n", avg );
   
   return 0;
}

double getAverage(int *arr, int size)
{
  int    i, sum = 0;      
  double avg;          
 
  for (i = 0; i < size; ++i)
  {
    sum += arr[i];
  }
 
  avg = (double)sum / size;
 
  return avg;
}

猜你喜欢

转载自blog.csdn.net/qq_43681154/article/details/126379090