标题:
DSP串口中断
[打印本页]
作者:
look_w
时间:
2017-9-23 14:39
标题:
DSP串口中断
本帖最后由 look_w 于 2017-9-23 15:54 编辑
七、仿真结果分析
最终的程序在下面。编写的程序功能是使用FIFO中断的形式发送一个数组,数组中起始数据是5,5,5,5。先发送这些数据(
注意串口接收与发送的都是字符数据,发送数字量的时候要注意转化
),然后在中断中修改第四个数据为中断的次数,然后发送新的数据。第一次的执行结果如图所示,
正确结果应该是5555,5551,...,分析结果可知,
似乎是在开启中断之后就产生一次串口发送中断。但是中断标志位清零的啊。(猜测是因为串口发送缓冲寄存器中此时没有数据,给理解成了发送完毕。难道需要对发送缓冲寄存器先赋值再开中断?)(测试了下,把第一次要发送的数据再启动中断之前放入了FIFO中,输出结果是正确的)
在处理上一个问题的时候,遇到的另一个问题如下:
如上,串口实验的时候为什么先禁止发送功能后面的配置就不起作用了呢?我是在最后又开启了发送功能,但是接收不到数据,如果开始的时候没有禁止发送功能就可以接收到数据。其实原因如下,
虽然最后开启发送功能了,但是最后SW RESET位确被写入了0,导致复位,所有的配置都被复位了。(由此也说明了配置寄存器的时候要小心,确定每位的功能。而且配置的时候尽量只配置你需要的那一位,其他的不要改动。用bit,不要用all)
最终的结果如图所示,达到了预期的结果。也得出当FIFO中的数据全部发送完毕才会产生中断。
八、总结
实现一个功能的时候首先查看相关的资料,例如数据手册,论坛、百度、书籍等,搜集各种相关资料,然后看别人是如何实现的,分析下相关步骤,理清好思路。针对不懂的地方继续查找资料,层层递进。(如果想省事,可以在别人正确代码的基础上进行修改,看他配置了什么寄存器,实现了什么功能,然后根据自己的需求,查看数据手册重新配置),实现的时候可以一个个小功能的实现,遇到疑惑的除求助外,也可试着观察不同的情况下会出现什么结果。总之就是多搜,多想,多动手,多总结。
<span style="font-size:18px;">#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#define SCIB 0
#define SCIC 1
// Prototype statements for functions found within this file.
void scic_fifo_init(void);
void scic_xmit(int a);
interrupt void uart_send(void);
// Global counts used in this example
Uint16 isrCount=0;
Uint16 ErrorCount=0;
Uint16 sdata[4]={5,5,5,5};//要发送的数据
void main(void)
{
Uint16 i=0;
// Step 1. Initialize System Control registers, PLL, WatchDog, Clocks to default state:
// This function is found in the DSP2833x_SysCtrl.c file.
InitSysCtrl();
// Step 2. Select GPIO for the device or for the specific application:
// This function is found in the DSP2833x_Gpio.c file.
// InitGpio(); skip this as this is example selects the I/O
// for SCI-A in this file itself
InitSciGpio();
// Step 3. Initialize PIE vector table:
// The PIE vector table is initialized with pointers to shell Interrupt
// Service Routines (ISR). The shell routines are found in DSP2833x_DefaultIsr.c.
// Insert user specific ISR code in the appropriate shell ISR routine in
// the DSP28_DefaultIsr.c file.
// Disable and clear all CPU interrupts:
DINT;
IER = 0x0000;
IFR = 0x0000;
// Initialize Pie Control Registers To Default State:
// This function is found in the DSP2833x_PieCtrl.c file.
// InitPieCtrl(); PIE is not used for this example
// Initialize the PIE Vector Table To a Known State:
// This function is found in DSP2833x_PieVect.c.
// This function populates the PIE vector table with pointers
// to the shell ISR functions found in DSP2833x_DefaultIsr.c.
InitPieVectTable();
// Enable CPU and PIE interrupts
// This example function is found in the DSP2833x_PieCtrl.c file.
EnableInterrupts();
// Step 4. Initialize all the Device Peripherals to a known state:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals(); skip this for SCI tests
// Step 5. User specific functions, Reassign vectors (optional), Enable Interrupts:
isrCount = 0;
ErrorCount = 0;
#if SCIB
scib_fifo_init(); // Initialize the SCI FIFO
scib_loopback_init(); // Initalize SCI
#elif SCIC
scic_fifo_init(); // Initialize the SCI FIFO
#endif
// Send a character ,先给发送缓冲寄存器赋值。
for(i=0;i<4;i++)
{
scic_xmit(sdata
+0x30);
}
scic_xmit(' ');
// Step 6. Send Characters forever starting with 0x00 and going through
// 0xFF. After sending each, check the recieve buffer for the correct value
EALLOW; </span>
<span style="font-size:18px;">// 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;
for(;;){ }
}
interrupt void uart_send(void)
{
Uint16 i;
isrCount++;
sdata[3]=isrCount;
for(i=0;i<4;i++)
{
scic_xmit(sdata
+0x30);
}
scic_xmit(' ');
if(isrCount==10)
{
ScicRegs.SCICTL1.bit.TXENA =0;//禁止发送缓冲器工作。
}
PieCtrlRegs.PIEACK.all=0xffff;//0x0080;
ScicRegs.SCIFFTX.bit.TXFFINTCLR=1; // Clear SCI Interrupt flag
}
// Transmit a character from the SCI'
void scic_xmit(int a)//发送一个数据a,类型为int
{
ScicRegs.SCITXBUF=a;//向数据缓冲寄存器中写入数据即可发送该数据
}
// Initalize the SCI FIFO
void scic_fifo_init()
{
// Test 1,SCIC DLB, 8-bit word, baud rate 9.6k, default, 1 STOP bit, no parity
//功能是配置发送模式
// Note: Clocks were turned on to the SCIC peripheral
// in the InitSysCtrl() function
// ScicRegs.SCICTL1.all =0x0000; //开始的时候先禁止接收与发送功能
ScicRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
//数据长度8位,一个结束位,无奇偶校验,空闲线模式,禁止回送
// ScicRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
ScicRegs.SCICTL1.all =0x0002; //允许发送,禁止接收
// ScicRegs.SCICTL2.all =0x0001;//发送缓冲器中断使能。似乎与下面的重复了
ScicRegs.SCICTL2.bit.TXINTENA =1;//发送缓冲器中断使能。
// ScicRegs.SCICTL2.bit.RXBKINTENA =1;
ScicRegs.SCIHBAUD =0x0001;
ScicRegs.SCILBAUD =0x00e7;
//上面是波特率设置,书上写的0x00e7
// ScicRegs.SCICCR.bit.LOOPBKENA =0;// enable(Disable) loop back
ScicRegs.SCICTL1.all =0x0022; // Relinquish SCI from Reset
//FIFO设置
ScicRegs.SCIFFTX.bit.TXFIFOXRESET=0;
// ScicRegs.SCIFFRX.bit.RXFIFORESET=0;
ScicRegs.SCIFFTX.all=0xE060;
// ScicRegs.SCIFFRX.all=0x204f;
ScicRegs.SCIFFCT.all=0x0;
}
//===========================================================================
// No more.
//===========================================================================
</span>
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0