DSP实验学习一

DSP

标签:笔记


文章目录

  • DSP
    • 实验一:GPIO控制
      • 1、GPXMUX1/2(功能选择寄存器)
      • 2、GPXDIR(方向控制寄存器)
      • 3、GPXSET(置位寄存器)
      • 4、GPXCLEAR(强制拉低寄存器)
      • 5、GPXTOGGLE(输出状态翻转寄存器)
      • 5、GPXDAT(数据寄存器)
    • 实验二:外部中断控制
      • 代码
      • GPXQSELn(GPIO选择限制寄存器)
      • GPXCTRL(GPIO控制限制寄存器)
      • GPIOXINTnSEL(GPIO中断选择寄存器)
      • XINTnCR
    • 实验三:ADC实验
      • 代码
      • HISPCP(高速标记预分频器)
      • ADCTRL1(ADC控制寄存器1)
      • ADCTRL2(ADC控制寄存器2)
      • ADCTRL13(ADC控制寄存器3)
      • ADCCHSELSEQn()
      • ADCMAXCONV()
      • ADCST()

实验一: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-24 QUXLPRD3 GPIO24-31引脚采样周期:0x00:采样T=T(SYSCLKOUT)0X01:采样T=2xT(SYSCLKOUT) 0X??:采样T=2x0X??xT(SYSCLKOUT)
23-16 QUXLPRD2 GPIO16-23引脚采样周期0x00-0xff:0-510T(SYSCLKOUT);
15-8 QUXLPRD1 GPIO8-15引脚采样周期
7-0 QUXLPRD0 GPIO0-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-2 Polarity 00:下降沿 01:上升沿 10:下降沿 11:上升或下降沿
1 保留 保留
0 Eable 0:关闭中断 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 - -
14 RESET ADC模块软件复位(三个时钟周期不能改变相关寄存器)
0:无影响 1:复位
13-12 SUSMOD1/0 仿真暂停方式
11-8 ACQ_PS[3-0] 设置采集窗口大小,控制SOC脉冲宽度,确定采样开关闭合时间
SOC的脉冲宽度是(ACQ_PS+1)个ADCCLK周期
7 CPS ADC内核时钟预分频位,用来对HSPCLK进行分频
0:不分频 1:2分频(fclk/2)_fclk为经过ADCCLKPS[3-0]之后分频的时钟
6 CONT_RUN 连续运行选择模式 0:启动-停止方式 1:连续运行模式
5 SEQ_OVRD 序列发生器运行方式
0:转换完成后通道排序器指针复位到初始状态
1:最后一个排序15转换完成后,排序指针从初始状态开始。
4 SEQ_CASE 级取序列发生器工作方式(2个8;还是1个16)
0:双序列模式 1:级联模式
3-0 - -

ADCTRL2(ADC控制寄存器2)

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

ADCTRL13(ADC控制寄存器3)

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

ADCCHSELSEQn()

位名 位名 位名 位名
ADCCHSELSEQ1 ADCCHSELSEQ2 ADCCHSELSEQ3 ADCCHSELSEQ4
15-12 CONN03 CONN07 CONN11 CONN15
11-8 CONN02 CONN06 CONN10 CONN14
7-4 CONN01 CONN05 CONN09 CONN13
3-0 CONN00 CONN04 CONN08 CONN12

ADCMAXCONV()

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

ADCST()

15-8 - -
7 EOS_BUF2 SEQ2的序列缓冲器结束位
6 EOS_BUF1 SEQ1的序列缓冲器结束位
5 INT_SEQ2_CLR 中断清除位 0:无效 1:写1进行清除SEQ2中断标志位
4 INT_SEQ1_CLR 中断清除位 0:无效 1:写1进行清除SEQ1中断标志位
3 SEQ2_BSY SEQ2忙标志位 0:表示空闲状态 1:表示正在进行,忙状态
2 SEQ1_BSY SEQ1忙标志位 0:表示空闲状态 1:表示正在进行,忙状态
1 INT_SE2 SEQ2 中断标志位 0:表示无中断事件 1:SEQ2中断事件产生
0 INT_SE1 SEQ1 中断标志位 0:表示无中断事件 1:SEQ1中断事件产生

你可能感兴趣的:(教育)