2021-10-22

@TMS320F28335入门学习记录——小菜睿的艰难旅途

小菜睿的DSP艰难摸索(一)

之前没有接触过DSP相关内容的学习,由于实验室需要用到型号为TMS320F28335的DSP开发板进行电机驱动控制,因此只能一点点儿啃了。后来一狠心,买了块DSP的开发板进行学习,对着教程和视频一点一点学。后来发现光看书和视频还是不行,首先要读懂程序,然后可以给自己出个小问题,自己动手编程进行解决,看能不能获取到自己想要的结果。

资料分享

市面上有很多关于DSP的相关书籍,后来精挑细选,选择了三本书作为自己学习DSP的辅导教材。

1.《手把手教你学DSP——基于TMS320F28335》
2.《TMS 320F 28x 源码解读》
3.《TMS320F28335DSP开发实战》

除了书籍以外,一些开发板附带的资料也是很丰富的,像普中的开发板以及研旭的开发板附带的资料都可以,还有就是去TI官网上下载相关模块的文档,上面的介绍也特别详细,但是需要有一定的英文阅读功底。

看门狗的应用

在书《手把手教你学DSP——基于TMS320F28335》提到了看门狗的应用。详细情况大家可以看看书上的具体内容。(不过说真的,这书上后面附带的程序排版是稍微有点乱。)
话不多说,直接上图。

2021-10-22_第1张图片

2021-10-22_第2张图片
2021-10-22_第3张图片

大家可以先根据书上的这部分内容实验看看,看看运行结果怎么样。

看门狗拓展学习

当对看门狗整个机制有了一定了解以后,可尝试将看门狗和Led灯或者数码管结合起来。

1.当看门狗喂狗次数达到100的整数倍时,让led1亮灭一次。
2.用数码管显示led1亮灭的次数,当统计次数达到200时,将数码管初始化从新开始记录。

我刚刚完成了第一个拓展问题的解答,第二问等后期做完来了再放上来。。
第一问不难,无非就是在主程序里增加一个判断语句,通过if(LoopCount%100==0)控制led1灯的亮灭。

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "leds.h"
interrupt void wakeint_isr(void);  //声明中断函数,该函数主要用来看门狗醒来报警
void delay(void);

Uint32 WakeCount;  //看门狗醒来的次数
Uint32 LoopCount;  //可以看成是喂狗的次数
Uint32 i;          //led灯闪的次数。

void delay(void)
{
    Uint16 		i;
	Uint32      j;
	for(i=0;i<32;i++)
		for (j = 0; j < 100000; j++);
}

void main(void)
{
	LED_Init();  //led初始化
	InitSysCtrl();  //初始化系统控制:锁相环、看门狗、外设时钟使能
	//InitGpio();  //GPIO初始化。如果加上这句,会导致led灯不亮。
	DINT;  //清理所有中断,初始化中断向量表:禁止CPU中断
	InitPieCtrl();  //初始化PIE控制寄存器至默认状态,默认状态是所有的PIE都被禁止;所有标志位都被清楚。
	IER = 0x0000;
	IFR = 0x0000; //禁止所有CPU中断,清楚CPU中断相关标志位。
	InitPieVectTable();  //初始化中断向量表,中断向量就是采用指针指向中断服务程序入口地址。

	EALLOW;
	PieVectTable.WAKEINT = &wakeint_isr;
	EDIS;

	WakeCount = 0;
	LoopCount = 0;
    i = 0;
	EALLOW;
	SysCtrlRegs.SCSR = BIT1;  //0x0002
	EDIS;

	PieCtrlRegs.PIECTRL.bit.ENPIE = 1;  //使能PIE相关模块。
	PieCtrlRegs.PIEIER1.bit.INTx8 = 1;  //使能看门狗中断,1组第8中断。
	IER |= M_INT1;                     //使能CPU中断。 赋值位运算符号,开中断1。
	EINT;                               //使能全局中断。

	ServiceDog();  //复位看门狗计数器,实际就是喂狗。
	
	EALLOW;
	SysCtrlRegs.WDCR = 0x0028;  //看门狗使能。
	EDIS;
	
	for(;;)
	{
		LoopCount++;
		if((LoopCount%100) == 0)
			{
			    delay();
			    LED1_TOGGLE;
			    delay();
				i++;
			}
		//ServiceDog();   //喂狗。
	}
}
// 看门狗醒中断服务函数。
interrupt void wakeint_isr(void)
{

	WakeCount++;
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

以上是这次学习的整个过程,希望和大家一起学习,一起进步!!!

你可能感兴趣的:(dsp)