首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

DSP串口中断

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>  
返回列表