DSP学习

DSP之时钟学习

先说软件设置:

时钟倍频Initpll在DSP280X_SysCtrl.c文件中的系统初始化函数 InitSysCtrl();中设置。

DSP学习

void InitSysCtrl(void)

{

// Disable the watchdog

DisableDog(); //首先应该关看门狗

// Initialize the PLL control: PLLCR and CLKINDIV

// DSP28_PLLCR and DSP28_CLKINDIV are defined in DSP280x_Examples.h

InitPll(DSP28_PLLCR,DSP28_CLKINDIV);//PLL时钟设置

InitPeripheralClocks();//外设时钟启动

}

//注:DSP28_PLLCR,DSP28_CLKINDIV这两个变量就是指定PLL倍频的数据,在DSP280x_Examples.h头文件中宏定义的,但是可以在此头文件中去修改这两个数值。如下就是宏定义的原型。

#define DSP28_CLKINDIV 0 // Enable /2 for SYSCLKOUT

//#define DSP28_CLKINDIV 1 // Disable /2 for SYSCKOUT

//#define DSP28_PLLCR 10

//#define DSP28_PLLCR 9

//#define DSP28_PLLCR 8

//#define DSP28_PLLCR 7

#define DSP28_PLLCR 6

//#define DSP28_PLLCR 5

//#define DSP28_PLLCR 4

//#define DSP28_PLLCR 3

//#define DSP28_PLLCR 2

//#define DSP28_PLLCR 1

//#define DSP28_PLLCR 0 // PLL is bypassed in this mode

// Initialize the peripheral clocks

进出CPU时钟CLKIN可以是PLL关闭可以是PLL旁路,还可以是PLL使能

DSP学习

注:

·晶振操作:

此模式允许使用外部为器件提供时基。晶体连接到X1/X2 引脚,XCLKIN 连接到低电平。

·外部时钟源操作:

此模式允许绕过内部振荡器。器件时钟根据引脚上的外部时钟源输入生成。必须将X1 连接到低电平并让X2 悬空。在这种情况下,外部振荡器时钟连接到XCLKIN 引脚,允许使用3.3V 时钟源。

允许使用X1 和X2 引脚将晶体连接到280x 器件。如果未使用晶体,则可以将外部振荡器直接连接到XCLKIN 引脚,X2 引脚保留悬空,X1 连接到低电平。请参阅

TMS320F2808、TMS320F2806、TMS320F2801、UCD9501 数字信号处理器数据手册(文献编号SPRS230) 1:来自X1,X2或者XCLKIN的时钟可以通过控制寄存器PLL 状态寄存器(PLLSTS)来控制是否需要经过PLL倍频,

DSP学习

DSP学习

当OSCOFF=0时来自X1,X2或者XCLKIN的时钟送至PLL,当OSCOFF=1时X1,X2或者XCLKIN的时钟不送PLL 2:a、简单的说就是若OSCOFF=1是关闭PLL,SYSCLKOUT直接就等于外部晶振或者晶体来的时钟OSCCLK 或者是OSCCLK/2,具体是OSCCLK/2还是OSCCLK还要通过设置寄存器PLLSTS[CLKINDIV]位,如下图:

DSP学习

b、OSCOFF=0且PLLOFF=0时就是打开PLL,通过设置PLLCR寄存器来控制倍频的倍数,控制SYSCLKOUT 的大小,见图PLLCR的值和CLKIN(SYSCLKOUT)对应关系:(还要设置PLLSTS[CLKINDIV]位)

DSP学习

c、当OSCOFF=0且PLLOFF=1时就是PLL作为旁路使用,PLL 关闭设置了PLLOFF 位时,PLL 模块应保持断电。器件必须处于PLL 旁路模式(PLLCR = 0x0000),然后才能将1 写入PLLOFF。当PLL 关闭(PLLOFF = 1) 时,不要为PLLCR 写入非零值。当PLLOFF = 1时,STANDBY 和HALT 低功率模式将如预期正常工作。在从HALT 或STANDBY 唤醒之后,PLL 模块将继续断电。

例:DSP280x_Examples.h头文件中

/*-----------------------------------------------------------------------------

Specify the PLL control register (PLLCR) and clock in divide (CLKINDIV) value.

if CLKINDIV = 0: SYSCLKOUT = (OSCCLK * PLLCR)/2

if CLKINDIV = 1: SYSCLKOUT = (OSCCLK * PLLCR)

-----------------------------------------------------------------------------*/

#define DSP28_CLKINDIV 0 // Enable /2 for SYSCLKOUT

//#define DSP28_CLKINDIV 1 // Disable /2 for SYSCKOUT 设置输出的时钟二分频与否 0表示二分频 1表示不二分频。

//#define DSP28_PLLCR 10

//#define DSP28_PLLCR 9

#define DSP28_PLLCR 6

//#define DSP28_PLLCR 5

//#define DSP28_PLLCR 4

//#define DSP28_PLLCR 3

//#define DSP28_PLLCR 2

//#define DSP28_PLLCR 1

//#define DSP28_PLLCR 0 // PLL is bypassed in this mode//旁路模式中使用

void InitPll(Uint16 val, Uint16 clkindiv) 函数也在DSP280X_SysCtrl.c中,

DSP学习

寄存器设置

Figure 3-3. Peripheral Clock Control 0 Register (PCLKCR0) 图3-2./3-3. 外设时钟控制寄存器0 (PCLKCR0/1)

DSP学习

DSP学习

DSP学习

图3-5. 高速外设时钟预分频器(HISPCP) 寄存器

DSP学习

// HISPCP/LOSPCP prescale register settings, normally it will be set to default values SysCtrlRegs.HISPCP.all = 0x001 ;//高速时钟HISPCP = SYSCLKOUT/2

SysCtrlRegs.LOSPCP.all = 0x002;//低速时钟HISPCP = SYSCLKOUT/4

// XCLKOUT to SYSCLKOUT ratio. By default XCLKOUT = 1/2 SYSCLKOUT

SysCtrlRegs.XCLK.bit.XCLKOUTDIV=10 ;

DSP之GPIO

DSP学习

1GPIO Port A MUX 1 (GPAMUX1) Register 引脚功能控制寄存器:GPAMUX1 控制0-15号引脚

DSP学习

GPAMUX2 控制16-31号引脚

DSP学习

DSP学习

注:GPIO复用功能寄存器MUX可以根据设置相应的位来达到改变GPIO功能的作用其中两位控制一个GPIO

GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0; // GPIO6 = GPIO6

2Figure 4-13. GPIO Port A Direction (GPADIR) Register

方向控制器GPADIR 控制31-0

DSP学习

GPBDIR控制34-32

DSP学习

注:方向寄存器是控制GPIO的方向的

寄存器的每一位控制一个GPIO

对其写0代表GPIO输入,写1代表GPIO输出

GpioCtrlRegs.GPADIR.bit.GPIO17 = 1; // GPIO17 = output

内部上拉控制寄存器GPAPUD 控制31-0引脚

DSP学习

GPBPUD 控制32-34引脚

DSP学习

注:内部上拉控制寄存器是用来开启/关闭内部上拉

GpioCtrlRegs.GPAPUD.bit.GPIO8 = 0; // Enable pullup on GPIO8

状态寄存器GPADAT控制GPIO31-0

DSP学习

状态寄存器GPBDAT 控制32-34

DSP学习

注:DAT状态寄存器可以用来读取GPIO的值也可用来对GPIO进行赋值

输入,则不能驱动端口输出0。

Reading a 0 indicates that the state of the pin is currently low, irrespective of the mode the pin is configured for.(读取0状态操作)

Reading a 1 indicates that the state of the pin is currently high irrespective of the mode the pin is configured for. (读取1状态操作)

GpioDataRegs.GPADDAT.all = 0xFFFDFFFF //GPIO16输出低电平

GPIO端口置位,清零,反转控制寄存器GPASET, GPACLEAR, GPATOGGLE 控制31-0引脚

DSP学习

DSP学习

注:对置位,清零,反转操作时对寄存器写0被忽略不计,只有当对其写1是才起作用,比如对某一位GPIO的GPACLEAR写1,则表示对此端口进行清零操作。

同理GPBSET, GPBCLEAR, GPBTOGGLE则是对32-34GPIO操作,

例:GpioDataRegs.GPASET.bit.GPIO12 = 1; //GPIO置1

XINT1, XINT2, XNMI中断源控制寄存器

DSP学习

DSP学习

注:此处只拿XINT1作为参考

想把哪个GPIO作为XINT1的中断源只需要设置对应位寄存器就OK

Register Field Descriptions 低功耗唤醒设置寄存器

DSP学习

很多工程师在对按键去抖动都会采用软件延时的方法,今天介绍下关于Piccolo DSP GPIO所具有的硬件去抖功能.

信号首先同步于系统时钟,在输入到内核改变之前要经过一定周期个数的量化,这种方式可以滤除噪声。量化窗口输入的结构示意图如图所示。

DSP学习

由图可知,外部的管脚输入信号经过一个量化窗口到达DSP内核。量化窗口的时间宽度取决于采样间隔和采样个数。采样间隔由GPxCTRL寄存器决定,采样个数由寄存器GPxQSELn决定。

如果QUxLPRDn = 0,采样间隔为一个系统周期整数倍。如果QUxLPRDn = N (N≠0),采样周期为系统周期的2N倍。如表所示

DSP学习

采样个数可以配置位三个或六个。通过寄存器GPAQSEL1、GPAQSEL2、GPBQSEL1来配置,当外部管脚电平状态发生变化时,量化窗口检测到三个或六个周期内相同的状态时,才把此次状态改变传送到内核,否则会当成杂波滤除。

量化窗口的宽度与采样周期和采样个数有关,当采样周期和采样个数确定之后,量化窗口的宽度就确定了。量化窗口与采样周期及采样个数的关系如表所示。

DSP学习

现举例说明量化窗口的用法及效果。假如某个GPIO引脚为数字输入,量化模式为6个采样周期量化,采样周期寄存器中QUxLPRDn值为一,则采样周期为两个系统时钟周期宽度,量化输入的结果如图所示。

DSP学习

注:值得注意的是在DEBUG 的时候必须,当触发中断的时候不能用单步执行程序,因为由于DSP有端口硬件消抖的功能,输入的状态必须和系统时钟一致才能触发外中断的发生,应该用RUN直接执行程序。

DSP之外部中断

PIE

CPU有1各部可屏蔽中断NMI。

14个可屏蔽中断INT1---INT14。

2812内有很多外设每一个外设可以产生一个或多个中断、CPU没有能力同时处理所有中断请求专门设计一个PIE外设中断控制器。

DSP学习

PIE支持96个中断12组每组8个中断。

而且每组都被反馈到CPU内核12条中短线的某一条上面。

其实我们作用了96中断的45个。

DSP学习

相关推荐
相关主题
热门推荐