早在去年的这个时候就搞定了28335的串口实验,包括使用和不使用fifo的,今天再度捡起,竟然耗费了将近一天的时间来搞明白,菜鸟真心伤不起,现在记录下不使用fifo的串口中断实验过程和自己曾经和现在犯得错误。
1:硬件连接
首先:dsp的仿真器的连接让我很无语,不过按照这个步骤应该是没有问题的。
上电顺序:1连接好dsp板子和仿真器的jtag线,2仿真器的usb口和电脑连接,3板子上电,4ccs软件connect(Alt+c)
下电顺序:1ccs软件disconnect(Alt+c),2板子下电,3拔下仿真器的usb口和电脑连接,4拔下dsp板子和仿真器的jtag线
可见:上电和下电是相反的,严格按照这个顺序基本不会出错。注意,千万不要在板子上电的时候插拔jtag口。
2:dsp28335启动过程
说明: 复位后,跳转到0x3FFFC0地址,该地址在Boot Rom中,这个是复位向量,直接跳到Init Boot。
Init Boot,是复位后第一个被调用的汇编程序,在Boot Rom中,功能,初始化设备,读取gpio状态,来选择bootloader模式。
一般如果是RAM或者flash启动,这个时候他的入口地址放的code_start,然后跳转到c_init00
(在DSP2833x_CodeStartBranch.asm),也可以看到
c_init00:完成c环境和全局变量的初始化,在RTS Library ,rts2800_fpg32.lib中。
最后进入我们的main函数。这样才是dsp的启动过程。
3回到串口中断上来
对于串口中断,最重要的莫过于串口的寄存器设置问题以及串口中断函数。这次博客中不涉及到fifo的串口中断,串口的寄存器配置为:
注意:我这里波特率为9600,但是系统的时钟和书上的不一样,因此,数值是不一样的,你需要自己计算。(随便找本书都能找到计算波特率的公式)
[html] view plaincopy
- #include "DSP2833x_Device.h"
- #include "DSP2833x_Examples.h"
- void sci_init(void);
- interrupt void uartIsr(void);
- interrupt void uart_send(void);
- void delay(void);
- unsigned char m;
- void main(void)
- {
- InitSysCtrl();
- DINT;
- IER = 0x0000;
- IFR = 0x0000;
- InitPieCtrl();
- InitPieVectTable();
- EnableInterrupts();
- InitScicGpio();
- sci_init();
- EALLOW;
- PieVectTable.SCIRXINTC = &uartIsr;
- PieVectTable.SCITXINTC = &uart_send;
- EDIS;
- PieCtrlRegs.PIECTRL.bit.ENPIE=1;
- PieCtrlRegs.PIEIER8.bit.INTx5=1;
- PieCtrlRegs.PIEIER8.bit.INTx6=1;
- IER|=M_INT8;
- EINT;
- ERTM;
- while(1);
- }
- void sci_init(void)
- {
- EALLOW;
- ScicRegs.SCICCR.all =0x0007;
- ScicRegs.SCICTL1.all =0x0003;
- // ScicRegs.SCICTL2.all =0x0003;
- ScicRegs.SCICTL2.bit.TXINTENA=1;
- ScicRegs.SCICTL2.bit.RXBKINTENA=1;
- ScicRegs.SCIHBAUD =0x0001;
- ScicRegs.SCILBAUD =0x0086;
- ScicRegs.SCICTL1.bit.SWRESET=1;
- EDIS;
- }
- void uart_send(void)
- {
- PieCtrlRegs.PIEACK.all=0x0080;
- }
- void uartIsr(void)
- {
- m=ScicRegs.SCIRXBUF.all;
- ScicRegs.SCITXBUF=m;
- PieCtrlRegs.PIEACK.all=0x0080;
- }
4.测试结果:
虽然简单,也忙活了一下,记录下来,勿在犯错!
//工程,注意改一下波特率哦。