DSP实验学习一

DSP

标签:笔记


实验一:GPIO控制

1、GPXMUX1/2(功能选择寄存器)

GPXMUXn图片

每组IO一般有32个IO口可以配置,GPXMUX1对应X组低16位IO口,GPXMUX2对应X组高个IO口。
MUX功能
00普通IO口
01第一种外设功能
10第二种外设功能(若有第二种外设功能)
11第三种外设功能(若有第三种外设功能)

2、GPXDIR(方向控制寄存器)

GPXDIR图片

GPXDIR功能
0配置GPIO引脚为输入(默认配置)
1配置GPIO引脚为输出

3、GPXSET(置位寄存器)

GPXSET

GPXSET功能
0无影响
1若置GPIO引脚为输出,写1配置GPIO引脚为高电平

4、GPXCLEAR(强制拉低寄存器)

GPXCLEAR

GPXCLEAR功能
0无影响
1若置GPIO引脚为输出,写1配置GPIO引脚为低电平

5、GPXTOGGLE(输出状态翻转寄存器)

GPXTOGGLE

GPXTOGGLE功能
0配置GPIO引脚为输入(默认配置)
1若置GPIO引脚为输出,写1配置GPIO引脚进行翻转

5、GPXDAT(数据寄存器)

GPXDAT

GPXDAT功能
0写0:强制为0(状态必须配置GPIO为输出)
1写1:强制为1(状态必须配置GPIO为输出)

实验二:外部中断控制

代码

#include"DSP28x_Project.h"
//蜂鸣器为GPIO53,利用外部中断控制蜂鸣器响和停止
//1、利用外部中断1或2控制(GPIOA)
//2、利用外部中断3-7控制(GPIOB)
interrupt void xint1_isr(void);//声明中断函数
void initgpio(void);//声明gpio函数
volatile Uint32 xint1count;//定义中断计数变量
/*volatile一般说来volatile关键字是一种类型修饰符,
 * 用它声明的类型变量表示可以被某些编译器未知的因素更改,
 * 比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,
 * 编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地
 * 址的稳定访问。,volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;*/
void main(void) {
	InitSysCtrl();//初始化系统控制
	DINT; //关闭全局中断
	InitPieCtrl();//初始化PIE控制
	IER=0X0000;
	IFR=0X0000;//cpu级中断使能和中断标志清零
	InitPieVectTable();//初始化PIE向量表
	//初始化系统、全局中断、初始化PIE控制、CPU中断标志和使能、初始化PIE向量表。
	initgpio();//初始化GPIO
	xint1count=0;//中断计数变量赋初值
	EALLOW;//关闭写保护
	PieVectTable.XINT1=&xint1_isr;//将中断服务函数映射到向量表中
	EDIS;//打开写保护
	PieCtrlRegs.PIEIER1.bit.INTx4=1;//使能PIE第一组第四个中断。
	IER |=M_INT1;//打开cpu级中断1的使能,
	EINT;//初始化gpio、配置向量映射、使能cpu级中断、全局中断。
	XIntruptRegs.XINT1CR.bit.POLARITY=1;//上升沿产生中断  0或2:下降沿 3:上升或下降沿
	XIntruptRegs.XINT1CR.bit.ENABLE=1;//使能外部中断XINT1
	for(;;)
		{

		}
}
void initgpio(void)
{
	EALLOW;
	GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 0;        // GPIO
	GpioCtrlRegs.GPBDIR.bit.GPIO53 = 1;         // output
	GpioDataRegs.GPBDAT.bit.GPIO53=1;           //付初值

	GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;         // GPIO
	GpioCtrlRegs.GPADIR.bit.GPIO13 = 0;          // input
	GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 2;        // Xint1 Synch to SYSCLKOUT only
	GpioCtrlRegs.GPACTRL.bit.QUALPRD3 = 0xFF;   // Each sampling window is 510*SYSCLKOUT

	GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 13;   //选择中断源触发引脚
	EDIS;
}
interrupt void xint1_isr(void)
{
	GpioDataRegs.GPBTOGGLE.bit.GPIO53 = 1;   // GPIO0翻转
	xint1count++;//中断计数变量加1

	// Acknowledge this interrupt to get more from group 1
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
	//读1:已经有其他组发送中断请求,写1:可以清零,通知当没有中断执行时优先较高的中断会响应
}

GPXQSELn(GPIO选择限制寄存器)

GPXQSELn
X:A、B n:1、2

GPXQSELn功能
00与系统时钟同步(GPIO配置外设和通用有效)
01采用3个采样周期宽度限制GPIO配置外设和通用有效)
10采用6个采样周期宽度限制GPIO配置外设和通用有效)
11不同步(配置GPIO为外设),与00系统时钟同步(配置GPIO为通用io口)

GPXCTRL(GPIO控制限制寄存器)

GPXCTRL

GPXCTRL位字段功能
31-24QUXLPRD3GPIO24-31引脚采样周期:0x00:采样T=T(SYSCLKOUT)0X01:采样T=2xT(SYSCLKOUT) 0X??:采样T=2x0X??xT(SYSCLKOUT)
23-16QUXLPRD2GPIO16-23引脚采样周期0x00-0xff:0-510T(SYSCLKOUT);
15-8QUXLPRD1GPIO8-15引脚采样周期
7-0QUXLPRD0GPIO0-7引脚采样周期

GPIOXINTnSEL(GPIO中断选择寄存器)

GPIOXINTnSEL
X:A时 n为1或2
X:B时 n为3-7

GPIOXINTnSEL功能
15-5保留
4-0选择X端口的GPIO引脚作为XINTn的中断源默认为00000(选择GPIO0或GPIO32)

XINTnCR

XINTnCR
n为1-7

XINTnCR位字段功能
15-4保留保留
3-2Polarity00:下降沿 01:上升沿 10:下降沿 11:上升或下降沿
1保留保留
0Eable0:关闭中断 1:是使能中断

实验三:ADC实验

代码

#include "DSP28x_Project.h"
Uint16 SampleTable[4]={0};//初始为0 用于存储结果
void main(void)
{
   InitSysCtrl();
   EALLOW;
   SysCtrlRegs.HISPCP.all = 0x3;	// HSPCLK = SYSCLKOUT/ADC_MODCLK
   //将高速时钟进行分频,适合ADC的频率。25MHZ
   EDIS;
   DINT;
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
   InitPieVectTable();
   InitAdc();
   AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x0;//ADC时钟分频器分频数:2*ADCCLKPS
   AdcRegs.ADCTRL1.bit.CPS=0;//ADC时钟预分频器0:不分频(默认)	1:2分频
   AdcRegs.ADCTRL1.bit.ACQ_PS = 0x1;  //采集窗口为两个(ACQ_PS+1)ADC时钟
   AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;//1:级联模式	0:双序列模式;
   AdcRegs.ADCTRL3.bit.SMODE_SEL=0;//0:顺序模式(默认)		1:同步模式。
   AdcRegs.ADCTRL1.bit.CONT_RUN = 1;//1:连续转换模式。	0:启动/停止模式。
   AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0;
   //0:转换通道完成后转换指针复位到初始状态。1:到达最后排序通道后再复位通道指针。
   AdcRegs.ADCCHSELSEQ1.all = 0x9108;//通道0、1、2、3分别为:B0、A0、B1、A1
   AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 03;//最大转换通道数=通道数+1(或从0开始)
   AdcRegs.ADCTRL2.all = 0x2000;//从当前位置启动SEQ1;0020:启动SEQ2
   for(;;)
   {
       while (AdcRegs.ADCST.bit.INT_SEQ1== 0){}//当中断执行完后继续执行
       AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//清除SEQ1的中断标志位
       SampleTable[0]= ( (AdcRegs.ADCRESULT0)>>4);//将结果保存到变量中
       SampleTable[1]= ( (AdcRegs.ADCRESULT1)>>4);
       SampleTable[2]= ( (AdcRegs.ADCRESULT2)>>4);
       SampleTable[3]= ( (AdcRegs.ADCRESULT3)>>4);
   }
}

HISPCP(高速标记预分频器)

对时钟进行分频

ADCTRL1(ADC控制寄存器1)

位名描述
15--
14RESETADC模块软件复位(三个时钟周期不能改变相关寄存器)
0:无影响 1:复位
13-12SUSMOD1/0仿真暂停方式
11-8ACQ_PS[3-0]设置采集窗口大小,控制SOC脉冲宽度,确定采样开关闭合时间
SOC的脉冲宽度是(ACQ_PS+1)个ADCCLK周期
7CPSADC内核时钟预分频位,用来对HSPCLK进行分频
0:不分频 1:2分频(fclk/2)_fclk为经过ADCCLKPS[3-0]之后分频的时钟
6CONT_RUN连续运行选择模式 0:启动-停止方式 1:连续运行模式
5SEQ_OVRD序列发生器运行方式
0:转换完成后通道排序器指针复位到初始状态
1:最后一个排序15转换完成后,排序指针从初始状态开始。
4SEQ_CASE级取序列发生器工作方式(2个8;还是1个16)
0:双序列模式 1:级联模式
3-0--

ADCTRL2(ADC控制寄存器2)

位名描述
15ePWM_SOCB_SEQ必须在级联模式下
0:无作用 1:允许ePWMSOCB启动级联的序列发生器
14RST_SEQ1复位序列发生器 0:无作用 1:立即复位序列发生器SEQ1到CONV00状态
13SOC_SEQ10:写0,清除悬挂的SOC触发信号 1:软件触发,从当前位置启动SEQ1
12--
11INT_ENA_SEQ1SEQ1中断使能
0:禁止SEQ1中断请求 1:使能SEQ1中断请求
10INT_MOD_SEQ1SEQ1中断使能
0:每个SEQ1序列转换结束时,置位SEQ1中断标志位
1:每隔一个SEQ1序列转换结束时,置位SEQ1中断标志位
9--
8ePWM_SOCA_SEQ1SEQ1事件管理器A的SOC屏蔽位
0:不能通ePWMxSOCA触发启动SEQ1 1:允许通过···
7EXT_SOC_SEQ1SEQ1的外部信号启动转换位
0:无作用 1:通过设定的GPIOXINT2SEL可以使用端口A中的XINT2信号启动ADC转换过程
6RST_SEQ2复位序列发生器 0:无作用 1:立即复位序列发生器SEQ2到CONV08状态
5SOC_SEQ20:写0,清除悬挂的SOC触发信号 1:软件触发,从当前位置启动SEQ2
4--
3INT_ENA_SEQ2SEQ2中断使能
0:禁止SEQ2中断请求 1:使能SEQ2中断请求
2INT_MOD_SEQ2SEQ2中断使能
0:每个SEQ2序列转换结束时,置位SEQ2中断标志位
1:每隔一个SEQ2序列转换结束时,置位SEQ2中断标志位
1--
0ePWM_SOCA_SEQ2SEQ2事件管理器A的SOC屏蔽位
0:不能通ePWMxSOCA触发启动SEQ2 1:允许通过···

ADCTRL13(ADC控制寄存器3)

位名描述
15-8--
7-6ADCBGRFDN[1:0]0:带逢和参考电路掉电 1:上电
5ADCPWDNADC电源控制(控制带逢和参考电路外的ADC其他模拟电路供电)
0:掉电 1:上电
4-1ADCCKLPS[3:0]ADC内核时钟分频器HSPCLK/{(ADCCLKPS[3:0])*(ADCTRL1[7]+1)}
0SMOD_SEL0:顺序采样模式 1:同步采样模式

ADCCHSELSEQn()

位名位名位名位名
ADCCHSELSEQ1ADCCHSELSEQ2ADCCHSELSEQ3ADCCHSELSEQ4
15-12CONN03CONN07CONN11CONN15
11-8CONN02CONN06CONN10CONN14
7-4CONN01CONN05CONN09CONN13
3-0CONN00CONN04CONN08CONN12

ADCMAXCONV()

位名描述
15-7--
6-4MAX_CONV2对SEQ2操作
3-0MAX_CONV其中MAX_CONV[2:0]对SEQ1进行操作,整个对SEQ进行操作

ADCST()

15-8--
7EOS_BUF2SEQ2的序列缓冲器结束位
6EOS_BUF1SEQ1的序列缓冲器结束位
5INT_SEQ2_CLR中断清除位 0:无效 1:写1进行清除SEQ2中断标志位
4INT_SEQ1_CLR中断清除位 0:无效 1:写1进行清除SEQ1中断标志位
3SEQ2_BSYSEQ2忙标志位 0:表示空闲状态 1:表示正在进行,忙状态
2SEQ1_BSYSEQ1忙标志位 0:表示空闲状态 1:表示正在进行,忙状态
1INT_SE2SEQ2 中断标志位 0:表示无中断事件 1:SEQ2中断事件产生
0INT_SE1SEQ1 中断标志位 0:表示无中断事件 1:SEQ1中断事件产生
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值