Freescale 9S12 系列单片机应用笔记(SCI)3

发布者:谁与争锋1最新更新时间:2016-05-06 来源: eefocus关键字:Freescale  9S12  系列  单片机 手机看文章 扫描二维码
随时随地手机看文章
这次介绍如何在 uC/OS-II 上实现串口驱动。


 

  1. /*sci_ucos.h*/  
  2. #ifndef _SCI_RTOS_H_  

  3.  

    #define _SCI_RTOS_H_

     

    #define  SCI_RX_BUF_SIZE     64                /* Number of characters in Rx ring buffer             */  

  4. #define  SCI_TX_BUF_SIZE     64                /* Number of characters in Tx ring buffer             */

    /*  

  5. *********************************************************************************************************  
  6. *                                               CONSTANTS  
  7. *********************************************************************************************************  
  8. */

    #ifndef  NUL  

  9. #define  NUL                 0x00  
  10. #endif

    /* ERROR CODES                                        */  

  11. #define  SCI_NO_ERR            0                /* Function call was successful                       */  
  12. #define  SCI_BAD_CH            1                /* Invalid communications port channel                */  
  13. #define  SCI_RX_EMPTY          2                /* Rx buffer is empty, no character available         */  
  14. #define  SCI_TX_FULL           3                /* Tx buffer is full, could not deposit character     */  
  15. #define  SCI_TX_EMPTY          4                /* If the Tx buffer is empty.                         */  
  16. #define  SCI_RX_TIMEOUT        5                /* If a timeout occurred while waiting for a character*/  
  17. #define  SCI_TX_TIMEOUT        6                /* If a timeout occurred while waiting to send a char.*/

      

  18. #define  SCI_PARITY_NONE       0                /* Defines for setting parity                         */  
  19. #define  SCI_PARITY_ODD        1  
  20. #define  SCI_PARITY_EVEN       2

      

  21. /* 
  22. ********************************************************************************************************* 
  23. *                                               DATA TYPES 
  24. ********************************************************************************************************* 
  25. */  
  26. typedef struct {  
  27.     short  RingBufRxCtr;                            /* Number of characters in the Rx ring buffer              */  
  28.     OS_EVENT  *RingBufRxSem;                        /* Pointer to Rx semaphore                                 */  
  29.     unsigned char  *RingBufRxInPtr;                 /* Pointer to where next character will be inserted        */  
  30.     unsigned char  *RingBufRxOutPtr;                /* Pointer from where next character will be extracted     */  
  31.     unsigned char   RingBufRx[SCI_RX_BUF_SIZE];     /* Ring buffer character storage (Rx)                      */  
  32.     short  RingBufTxCtr;                            /* Number of characters in the Tx ring buffer              */  
  33.     OS_EVENT  *RingBufTxSem;                        /* Pointer to Tx semaphore                                 */  
  34.     unsigned char  *RingBufTxInPtr;                 /* Pointer to where next character will be inserted        */  
  35.     unsigned char  *RingBufTxOutPtr;                /* Pointer from where next character will be extracted     */  
  36.     unsigned char   RingBufTx[SCI_TX_BUF_SIZE];     /* Ring buffer character storage (Tx)                      */  
  37. } SCI_RING_BUF;

      

  38. /** 
  39.  * To obtain a character from the communications channel.  
  40.  * @param port, port can be SCI0 / SCI1 
  41.  * @param to,   is the amount of time (in clock ticks) that the calling function is willing to 
  42.  *             wait for a character to arrive.  If you specify a timeout of 0, the function will 
  43.  *             wait forever for a character to arrive. 
  44.  * @param err,  is a pointer to where an error code will be placed: 
  45.  *               *err is set to SCI_NO_ERR     if a character has been received 
  46.  *               *err is set to SCI_RX_TIMEOUT if a timeout occurred 
  47.  *               *err is set to SCI_BAD_CH     if you specify an invalid channel number  
  48.  * @return  The character in the buffer (or NUL if a timeout occurred)        
  49.  */  
  50. unsigned char  SCIGetCharB (unsigned char ch, unsigned short to, unsigned char *err);

     /** 

  51.  * This function is called by your application to send a character on the communications 
  52.  * channel.  The function will wait for the buffer to empty out if the buffer is full. 
  53.  * The function returns to your application if the buffer doesn't empty within the specified 
  54.  * timeout.  A timeout value of 0 means that the calling function will wait forever for the 
  55.  * buffer to empty out.  The character to send is first inserted into the Tx buffer and will 
  56.  * be sent by the Tx ISR.  If this is the first character placed into the buffer, the Tx ISR 
  57.  * will be enabled. 
  58.  * 
  59.  * @param port, port can be SCI0 / SCI1 
  60.  * @param c     is the character to send. 
  61.  * @param to    is the timeout (in clock ticks) to wait in case the buffer is full.  If you 
  62.  *              specify a timeout of 0, the function will wait forever for the buffer to empty. 
  63.  * @return      SCI_NO_ERR      if the character was placed in the Tx buffer 
  64.  *              SCI_TX_TIMEOUT  if the buffer didn't empty within the specified timeout period 
  65.  *              SCI_BAD_CH      if you specify an invalid channel number 
  66.  */  
  67. unsigned char SCIPutCharB (unsigned char port, unsigned char c, unsigned short to);

    /** 

  68.  * To initialize the communications module. 
  69.  * You must call this function before calling any other functions. 
  70.  */  
  71. void  SCIBufferInit (void);

    /** 

  72.  * To see if any character is available from the communications channel. 
  73.  * 
  74.  * @param port, port can be SCI0 / SCI1 
  75.  * @return   If at least one character is available, the function returns 
  76.  *            FALSE(0) otherwise, the function returns TRUE(1). 
  77.  */  
  78. unsigned char  SCIBufferIsEmpty (unsigned char port);

      

  79. /** 
  80.  * To see if any more characters can be placed in the Tx buffer. 
  81.  * In other words, this function check to see if the Tx buffer is full.  
  82.  * 
  83.  * @param port, port can be SCI0 / SCI1 
  84.  * @return   If the buffer is full, the function returns TRUE  
  85.  *           otherwise, the function returns FALSE. 
  86.  */  
  87. unsigned char SCIBufferIsFull (unsigned char port);

    #endif  

  88.   
  89.    

 
  1. /** 

  2.  * SCI(Serial Communication Interface)  Buffered Serial I/O     
  3.  * @file sci_ucos.c 
  4.  * @author Li Yuan 
  5.  * @platform mc9s12XX 
  6.  * @date 2012-7-22 
  7.  * @version 1.0.1 
  8.  */

      

  9. #include "derivative.h"      /* derivative-specific definitions */  
  10. #include   
  11. #include "includes.H"  
  12. #include "sci.h"  
  13. #include "sci_rtos.h"

    /**  

  14.  *       GLOBAL VARIABLES  
  15.  */  
  16. SCI_RING_BUF  SCI0Buf;  
  17. SCI_RING_BUF  SCI1Buf;

      

  18. /** 
  19.  * To obtain a character from the communications channel.  
  20.  * @param port, port can be SCI0 / SCI1 
  21.  * @param to,   is the amount of time (in clock ticks) that the calling function is willing to 
  22.  *             wait for a character to arrive.  If you specify a timeout of 0, the function will 
  23.  *             wait forever for a character to arrive. 
  24.  * @param err,  is a pointer to where an error code will be placed: 
  25.  *               *err is set to SCI_NO_ERR     if a character has been received 
  26.  *               *err is set to SCI_RX_TIMEOUT if a timeout occurred 
  27.  *               *err is set to SCI_BAD_CH     if you specify an invalid channel number  
  28.  * @return  The character in the buffer (or NUL if a timeout occurred)        
  29.  */  
  30. unsigned char  SCIGetCharB (unsigned char port, unsigned short to, INT8U *err)  
  31. {  
  32. #if OS_CRITICAL_METHOD == 3u                           /* Allocate storage for CPU status register     */  
  33.     OS_CPU_SR  cpu_sr = 0u;  
  34. #endif  
  35.     unsigned char c;  
  36.     unsigned char oserr;  
  37.     SCI_RING_BUF *pbuf;

        switch (port)   

  38.     {                                          /* Obtain pointer to communications channel */  
  39.         case SCI0:  
  40.              pbuf = &SCI0Buf;  
  41.              break;

            case SCI1:  

  42.              pbuf = &SCI1Buf;  
  43.              break;

            default:  

  44.              *err = SCI_BAD_CH;  
  45.              return (0);  
  46.     }  
  47.     OSSemPend(pbuf->RingBufRxSem, to, &oserr);             /* Wait for character to arrive             */  
  48.       
  49.     if (oserr == OS_TIMEOUT)   
  50.     {                                                      /* See if characters received within timeout*/  
  51.         *err = SCI_RX_TIMEOUT;                            /* No, return error code                    */  
  52.         return (NUL);  
  53.     }   
  54.     else   
  55.     {  
  56.         OS_ENTER_CRITICAL();  
  57.         pbuf->RingBufRxCtr--;                              /* Yes, decrement character count           */  
  58.         c = *pbuf->RingBufRxOutPtr++;                      /* Get character from buffer                */  
  59.         if (pbuf->RingBufRxOutPtr == &pbuf->RingBufRx[SCI_RX_BUF_SIZE]) {     /* Wrap OUT pointer     */  
  60.             pbuf->RingBufRxOutPtr = &pbuf->RingBufRx[0];  
  61.         }  
  62.         OS_EXIT_CRITICAL();  
  63.         *err = SCI_NO_ERR;  
  64.         return (c);  
  65.     }  
  66. }

     /** 

  67.  * This function is called by your application to send a character on the communications 
  68.  * channel.  The function will wait for the buffer to empty out if the buffer is full. 
  69.  * The function returns to your application if the buffer doesn't empty within the specified 
  70.  * timeout.  A timeout value of 0 means that the calling function will wait forever for the 
  71.  * buffer to empty out.  The character to send is first inserted into the Tx buffer and will 
  72.  * be sent by the Tx ISR.  If this is the first character placed into the buffer, the Tx ISR 
  73.  * will be enabled. 
  74.  * 
  75.  * @param port, port can be SCI0 / SCI1 
  76.  * @param c     is the character to send. 
  77.  * @param to    is the timeout (in clock ticks) to wait in case the buffer is full.  If you 
  78.  *              specify a timeout of 0, the function will wait forever for the buffer to empty. 
  79.  * @return      SCI_NO_ERR      if the character was placed in the Tx buffer 
  80.  *              SCI_TX_TIMEOUT  if the buffer didn't empty within the specified timeout period 
  81.  *              SCI_BAD_CH      if you specify an invalid channel number 
  82.  */  
  83. unsigned char SCIPutCharB (unsigned char port, unsigned char c, unsigned short to)  
  84. {  
  85. #if OS_CRITICAL_METHOD == 3u                              /* Allocate storage for CPU status register */  
  86.     OS_CPU_SR  cpu_sr = 0u;  
  87. #endif

        SCI_RING_BUF *pbuf;  

  88.     unsigned char oserr;  
  89.     switch (port)   
  90.     {                                                     /* Obtain pointer to communications channel */  
  91.         case SCI0:  
  92.              pbuf = &SCI0Buf;  
  93.              break;

            case SCI1:  

  94.              pbuf = &SCI1Buf;  
  95.              break;

            default:  

  96.              return (SCI_BAD_CH);  
  97.     }

        OSSemPend(pbuf->RingBufTxSem, to, &oserr);             /* Wait for space in Tx buffer              */  

  98.     if (oserr == OS_TIMEOUT)   
  99.     {  
  100.         return (SCI_TX_TIMEOUT);                           /* Timed out, return error code             */  
  101.     }  
  102.     OS_ENTER_CRITICAL();  
  103.     pbuf->RingBufTxCtr++;                                  /* No, increment character count            */  
  104.     *pbuf->RingBufTxInPtr++ = c;                           /* Put character into buffer                */  
  105.     if (pbuf->RingBufTxInPtr == &pbuf->RingBufTx[SCI_TX_BUF_SIZE])   
  106.     {       
  107.         pbuf->RingBufTxInPtr = &pbuf->RingBufTx[0];        /* Wrap IN pointer                          */  
  108.     }  
  109.     if (pbuf->RingBufTxCtr == 1)                           /* See if this is the first character       */  
  110.     {                           
  111.         SCIEnableTxInt(port);                              /* Yes, Enable Tx interrupts                */  
  112.     }  
  113.     OS_EXIT_CRITICAL();  
  114.     return (SCI_NO_ERR);  
  115. }

    /** 

  116.  * To initialize the communications module. 
  117.  * You must call this function before calling any other functions. 
  118.  */  
  119. void  SCIBufferInit (void)  
  120. {  
  121.     SCI_RING_BUF *pbuf;

        pbuf                  = &SCI0Buf;                      /* Initialize the ring buffer for SCI0     */  

  122.     pbuf->RingBufRxCtr    = 0;  
  123.     pbuf->RingBufRxInPtr  = &pbuf->RingBufRx[0];  
  124.     pbuf->RingBufRxOutPtr = &pbuf->RingBufRx[0];  
  125.     pbuf->RingBufRxSem    = OSSemCreate(0);  
  126.     pbuf->RingBufTxCtr    = 0;  
  127.     pbuf->RingBufTxInPtr  = &pbuf->RingBufTx[0];  
  128.     pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];  
  129.     pbuf->RingBufTxSem    = OSSemCreate(SCI_TX_BUF_SIZE);

        pbuf                  = &SCI1Buf;                     /* Initialize the ring buffer for SCI1     */  

  130.     pbuf->RingBufRxCtr    = 0;  
  131.     pbuf->RingBufRxInPtr  = &pbuf->RingBufRx[0];  
  132.     pbuf->RingBufRxOutPtr = &pbuf->RingBufRx[0];  
  133.     pbuf->RingBufRxSem    = OSSemCreate(0);  
  134.     pbuf->RingBufTxCtr    = 0;  
  135.     pbuf->RingBufTxInPtr  = &pbuf->RingBufTx[0];  
  136.     pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];  
  137.     pbuf->RingBufTxSem    = OSSemCreate(SCI_TX_BUF_SIZE);  
  138. }

    /** 

  139.  * To see if any character is available from the communications channel. 
  140.  * 
  141.  * @param port, port can be SCI0 / SCI1 
  142.  * @return   If at least one character is available, the function returns 
  143.  *            FALSE(0) otherwise, the function returns TRUE(1). 
  144.  */  
  145. unsigned char  SCIBufferIsEmpty (unsigned char port)  
  146. {

    #if OS_CRITICAL_METHOD == 3u                           /* Allocate storage for CPU status register     */  

  147.     OS_CPU_SR  cpu_sr = 0u;  
  148. #endif  
  149.     unsigned char empty;  
  150.     SCI_RING_BUF *pbuf;  
  151.     switch (port)   
  152.     {                                                     /* Obtain pointer to communications channel */  
  153.         case SCI0:  
  154.              pbuf = &SCI0Buf;  
  155.              break;

            case SCI1:  

  156.              pbuf = &SCI1Buf;  
  157.              break;  
  158.         default:  
  159.              return (0xff);  
  160.              break;  
  161.     }  
  162.     OS_ENTER_CRITICAL();  
  163.     if (pbuf->RingBufRxCtr > 0)  
  164.     {                                                      /* See if buffer is empty                   */  
  165.         empty = 0;                                         /* Buffer is NOT empty                      */  
  166.     }   
  167.     else   
  168.     {  
  169.         empty = 1;                                         /* Buffer is empty                          */  
  170.     }  
  171.     OS_EXIT_CRITICAL();  
  172.     return (empty);

    }

    /** 

  173.  * To see if any more characters can be placed in the Tx buffer. 
  174.  * In other words, this function check to see if the Tx buffer is full.  
  175.  * 
  176.  * @param port, port can be SCI0 / SCI1 
  177.  * @return   If the buffer is full, the function returns TRUE  
  178.  *           otherwise, the function returns FALSE. 
  179.  */  
  180. unsigned char SCIBufferIsFull (unsigned char port)  
  181. {  
  182. #if OS_CRITICAL_METHOD == 3u                           /* Allocate storage for CPU status register     */  
  183.     OS_CPU_SR  cpu_sr = 0u;  
  184. #endif  
  185.     char full;  
  186.     SCI_RING_BUF *pbuf;  
  187.     switch (port)   
  188.     {                                                     /* Obtain pointer to communications channel */  
  189.         case SCI0:  
  190.              pbuf = &SCI0Buf;  
  191.              break;

            case SCI1:  

  192.              pbuf = &SCI1Buf;  
  193.              break;

            default:  

  194.              return (255);  
  195.     }  
  196.     OS_ENTER_CRITICAL();  
  197.     if (pbuf->RingBufTxCtr < SCI_TX_BUF_SIZE) {           /* See if buffer is full                    */  
  198.         full = 0;                                      /* Buffer is NOT full                       */  
  199.     } else {  
  200.         full = 1;                                       /* Buffer is full                           */  
  201.     }  
  202.     OS_EXIT_CRITICAL();  
  203.     return (full);  
  204. }

      

  205. // This function is called by the Rx ISR to insert a character into the receive ring buffer.  
  206. static void  SCIPutRxChar (unsigned char port, unsigned char c)  
  207. {

        SCI_RING_BUF *pbuf;

        switch (port)   

  208.     {                                                     /* Obtain pointer to communications channel */  
  209.         case SCI0:  
  210.              pbuf = &SCI0Buf;  
  211.              break;

            case SCI1:  

  212.              pbuf = &SCI1Buf;  
  213.              break;

            default:  

  214.              return;  
  215.     }  
  216.     if (pbuf->RingBufRxCtr < SCI_RX_BUF_SIZE) {           /* See if buffer is full                    */  
  217.         pbuf->RingBufRxCtr++;                              /* No, increment character count            */  
  218.         *pbuf->RingBufRxInPtr++ = c;                       /* Put character into buffer                */  
  219.         if (pbuf->RingBufRxInPtr == &pbuf->RingBufRx[SCI_RX_BUF_SIZE]) { /* Wrap IN pointer           */  
  220.             pbuf->RingBufRxInPtr = &pbuf->RingBufRx[0];  
  221.         }  
  222.         (void)OSSemPost(pbuf->RingBufRxSem);               /* Indicate that character was received     */  
  223.     }  
  224. }

      

  225. // This function is called by the Tx ISR to extract the next character from the Tx buffer.  
  226. //    The function returns FALSE if the buffer is empty after the character is extracted from  
  227. //    the buffer.  This is done to signal the Tx ISR to disable interrupts because this is the  
  228. //    last character to send.  
  229. static unsigned char SCIGetTxChar (unsigned char port, unsigned char *err)  
  230. {  
  231.     unsigned char c;  
  232.     SCI_RING_BUF *pbuf;

        switch (port)   

  233.     {                                          /* Obtain pointer to communications channel */  
  234.         case SCI0:  
  235.              pbuf = &SCI0Buf;  
  236.              break;

            case SCI1:  

  237.              pbuf = &SCI1Buf;  
  238.              break;

            default:  

  239.              *err = SCI_BAD_CH;  
  240.              return (0);  
  241.     }  
  242.     if (pbuf->RingBufTxCtr > 0) {                          /* See if buffer is empty                   */  
  243.         pbuf->RingBufTxCtr--;                              /* No, decrement character count            */  
  244.         c = *pbuf->RingBufTxOutPtr++;                      /* Get character from buffer                */  
  245.         if (pbuf->RingBufTxOutPtr == &pbuf->RingBufTx[SCI_TX_BUF_SIZE]) {     /* Wrap OUT pointer     */  
  246.             pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];  
  247.         }  
  248.         (void)OSSemPost(pbuf->RingBufTxSem);               /* Indicate that character will be sent     */  
  249.         *err = SCI_NO_ERR;  
  250.         return (c);                                        /* Characters are still available           */  
  251.     } else {  
  252.         *err = SCI_TX_EMPTY;  
  253.         return (NUL);                                      /* Buffer is empty                          */  
  254.     }  
  255. }

      

  256. void SCI0_ISR_Handler(void)  
  257. {  
  258.     char status;  
  259.     char data;  
  260.     unsigned char err;  
  261.       
  262.     status = SCI0SR1;

        if(status & 0x0F) // 0x1F = 0001 1111, if status is not Receive Data Reg Full Flag  

  263.     {  
  264.         // See if we have some kind of error     
  265.         // Clear interrupt (do nothing about it!)     
  266.         data = SCI0DRL;   
  267.     }  
  268.     else if(status & 0x20) //Receive Data Reg Full Flag  
  269.     {    
  270.         data = SCI0DRL;   
  271.         SCIPutRxChar(SCI0, data);                    // Insert received character into buffer       
  272.     }  
  273.     else if(status & 0x80)  
  274.     {  
  275.         data = SCIGetTxChar(SCI0, &err);             // Get next character to send.                 
  276.         if (err == SCI_TX_EMPTY)   
  277.         {                                            // Do we have anymore characters to send ?     
  278.                                                      // No,  Disable Tx interrupts                  
  279.             SCIDisTxInt(SCI0);  
  280.         }   
  281.         else   
  282.         {  
  283.             SCI0DRL = data;        // Yes, Send character                       
  284.         }                                             
  285.     }       
  286.   

  287. void SCI1_ISR_Handler (void)  
  288. {  
  289.     char status;  
  290.     char data;  
  291.     unsigned char err;  
  292.       
  293.     status = SCI1SR1;

        if(status & 0x0F) // 0x1F = 0001 1111, if status is not Receive Data Reg Full Flag  

  294.     {  
  295.         // See if we have some kind of error     
  296.         // Clear interrupt (do nothing about it!)     
  297.         data = SCI1DRL;  
  298.     }      
  299.     else if(status & 0x20) //Receive Data Reg Full Flag  
  300.     {    
  301.         data = SCI1DRL;  
  302.         SCIPutRxChar(SCI1, data);                    // Insert received character into buffer       
  303.     }  
  304.     else if(status & 0x80)  
  305.     {  
  306.         data = SCIGetTxChar(SCI1, &err);             // Get next character to send.                 
  307.         if (err == SCI_TX_EMPTY)   
  308.         {                                            // Do we have anymore characters to send ?     
  309.                                                      // No,  Disable Tx interrupts                  
  310.             SCIDisTxInt(SCI1);  
  311.         }   
  312.         else   
  313.         {  
  314.             SCI1DRL = data;        // Yes, Send character                       
  315.         }                                             
  316.     }   
  317. }

     

    #pragma CODE_SEG NON_BANKED  

  318. interrupt VectorNumber_Vsci0 void SCI0_ISR(void)  
  319. {

    #if defined( __BANKED__) || defined(__LARGE__) || defined(__PPAGE__)  

  320.     __asm ldaa   PPAGE;           //  3~, Get current value of PPAGE register                                  
  321.     __asm psha;                   //  2~, Push PPAGE register onto current task's stack  
  322. #endif  
  323.        
  324.     __asm inc OSIntNesting;      //OSIntNesting++;

        //if (OSIntNesting == 1)   

  325.     //{  
  326.     //    OSTCBCur->OSTCBStkPtr = Stack Pointer ;  
  327.     //}  
  328.     __asm   
  329.     {  
  330.       ldab OSIntNesting             
  331.       cmpb #$01                    
  332.       bne SCI0ISR1        

          ldx OSTCBCur             

  333.       sts 0, x     
  334. SCI0ISR1:                                                       
  335.     }

    #if defined( __BANKED__) || defined(__LARGE__) || defined(__PPAGE__)      

  336.     __asm call SCI0_ISR_Handler;   
  337.     __asm call OSIntExit;     
  338. #else  
  339.     __asm jsr SCI0_ISR_Handler;     
  340.     __asm jsr OSIntExit;   
  341. #endif  

    #if defined( __BANKED__) || defined(__LARGE__) || defined(__PPAGE__)  

  342.     __asm pula;                   // 3~, Get value of PPAGE register  
  343.     __asm staa PPAGE;             // 3~, Store into CPU's PPAGE register                                  
  344. #endif

    }    

    interrupt VectorNumber_Vsci1 void SCI1_ISR(void)  

  345. {

    #if defined( __BANKED__) || defined(__LARGE__) || defined(__PPAGE__)  

  346.     __asm ldaa   PPAGE;           //  3~, Get current value of PPAGE register                                  
  347.     __asm psha;                   //  2~, Push PPAGE register onto current task's stack  
  348. #endif  
  349.        
  350.     __asm inc OSIntNesting;      //OSIntNesting++;

        //if (OSIntNesting == 1)   

  351.     //{  
  352.     //    OSTCBCur->OSTCBStkPtr = Stack Pointer ;  
  353.     //}  
  354.     __asm   
  355.     {  
  356.       ldab OSIntNesting             
  357.       cmpb #$01                    
  358.       bne SCI1ISR1        

          ldx OSTCBCur             

  359.       sts 0, x     
  360. SCI1ISR1:                                                       
  361.     }

    #if defined( __BANKED__) || defined(__LARGE__) || defined(__PPAGE__)      

  362.     __asm call SCI1_ISR_Handler;   
  363.     __asm call OSIntExit;     
  364. #else  
  365.     __asm jsr SCI1_ISR_Handler;     
  366.     __asm jsr OSIntExit;   
  367. #endif

    #if defined( __BANKED__) || defined(__LARGE__) || defined(__PPAGE__)  

  368.     __asm pula;                   // 3~, Get value of PPAGE register  
  369.     __asm staa PPAGE;             // 3~, Store into CPU's PPAGE register                                  
  370. #endif

    }    

  371.   

 

下面给个简单的例子:

 
  1. #include       /* common defines and macros */  

  2. #include "derivative.h"      /* derivative-specific definitions */

    #include  "INCLUDES.H"  

  3. #include  "crg.h"  
  4. #include  "sci.h"  
  5. #include  "sci_rtos.h"

    OS_STK  AppStartTaskStk[64];

    static void  AppStartTask (void *pdata);

    void main(void)   

  6. {  
  7.     /* put your own code here */  
  8.     OS_CPU_SR cpu_sr;

        CRGInit();  

  9.     CRGSetRTIFreqency(0x54);  // 200Hz 

        EnableInterrupts;  

  10.       
  11.     OS_ENTER_CRITICAL() ;  
  12.     SCIInit(SCI0) ;  
  13.     SCIInit(SCI1) ;  
  14.     OS_EXIT_CRITICAL() ;  
  15.       
  16.     OSInit();  
  17.        
  18.     SCISetIEBit(SCI0, SCI_RIE) ;  
  19.     SCISetIEBit(SCI1, SCI_RIE) ;  
  20.     SCIBufferInit();  
  21.       
  22.     (void) OSTaskCreate(AppStartTask, (void *)0x4321, (void *)&AppStartTaskStk[63], 0);  
  23.     (void)OSStart();   
  24.       
  25.     for(;;)   
  26.     {  
  27.         _FEED_COP(); /* feeds the dog */  
  28.     } /* loop forever */  
  29.       
  30.     /* please make sure that you never leave main */  
  31. }

    static void  AppStartTask (void *pdata)  

  32. {  
  33.     INT8U err;  
  34.     char C;  
  35.     (void) pdata;  
  36.     for(;;)   
  37.     {   
  38.         C = SCIGetCharB(SCI1, 0, &err);  
  39.         if(err == SCI_NO_ERR)  
  40.        (void) SCIPutCharB (SCI1, C, 0);  
  41.     }  
  42. }

     

      
  43.  

关键字:Freescale  9S12  系列  单片机 引用地址:Freescale 9S12 系列单片机应用笔记(SCI)3

上一篇:基于P89LPC922的多点温度采集系统
下一篇:Freescale 9S12 系列单片机应用笔记(SCI)2

推荐阅读最新更新时间:2024-03-16 14:53

e络盟提供Bulgin的Buccaneer系列连接器和压电式开关系列
这些环境密封连接器和开关是恶劣环境应用的理想之选。 e络盟日前宣布供应来自全球电源、防护及环境密封产品领先制造商Bulgin的全新Buccaneer 7000系列连接器和压电式开关,进一步丰富其已超过20多万种连接器的产品库存。Buccaneer系列防尘防水型连接器适用于工业机械和建筑自动化等恶劣环境下的各种电源总线应用。 Bulgin母公司Elektron Technology亚太区销售经理Ron Situ表示: 我们很高兴通过e络盟平台为客户提供这些坚固耐用的连接器和高端开关产品。通过进一步扩充Bulgin的产品范围,我们将为客户在严苛应用的系统设计方面提供更大的灵活性。同时,我们的客户也
[工业控制]
e络盟提供Bulgin的Buccaneer<font color='red'>系列</font>连接器和压电式开关<font color='red'>系列</font>
ARM9微控制器LPC3180的软硬件平台设计
摘要 介绍以Philips LPC3180微控制器为核心的嵌入式软硬件平台设计;对系统设计的硬件部分和软件部分进行详细的分析,并针对LPC3180芯片特性着重讨论了其软件系统构建以及系统启动流程。实验结果表明,LPC3180嵌入式系统平台结合片内硬件浮点运算单元,具有高性能的浮点运算处理能力,可满足复杂的嵌入式应用场合的要求。 关键词 LPC3180 ARM9 软硬件平台 嵌入式应用系统设计包括硬件平台和软件平台两部分。前者是以嵌入式微控制器/微处理器为核心的硬件系统;后者则是围绕嵌入式操作系统构建的软件系统。两者在设计上是密不可分的,并且需要在设计之间进行权衡优化,根据实际应用进行外扩和裁剪。 基于ARM92
[单片机]
Microchip重夺8位单片机销售额全球第一桂冠
Microchip Technology宣布根据权威行业分析机构Gartner最新发布的2014排名报告,Microchip重登全球8位单片机(MCU)销售额第一宝座。这一成绩充分印证了Microchip在8位PIC 单片机产品线方面所做出的坚定承诺和创新努力。 尽管近年来许多MCU供应商逐渐降低8位MCU产品投入,Microchip仍继续坚持对其8位、16位和32位产品线进行全面创新。而Gartner 2014年度报告显示Microchip在这三大产品领域的市场占有率仍保持着持续增长的势头。在2014年度16位MCU市场排名前十位的供应商中,Microchip是增长速度最快的企业,其增速超过其他排名前十企业增速的
[单片机]
Microchip重夺8位<font color='red'>单片机</font>销售额全球第一桂冠
基于TOPSwitch-GX系列的多输出开关电源
1 引言   多路输出开关电源广泛应用在各种复杂小功率电子系统中,就多路输出而言,通常只有输出电压低、输出电流变化范围大的一路作为主电路进行反馈调节控制,以保证在输入电压及负载变化时保持输出电压稳定,由于受变压器各个绕组间的漏感和绕组电阻等的影响,辅助输出电压随输出负载的变化而变化,通常,当主输出满载和辅助输出轻载时,辅助输出电压将升高,而当主输出轻载和辅助输出满时,辅助输出电压将降低,这就是多路输出的负载交叉调整率问题,笔者基于 TOPSwitch-GX系列设计了一种多路输出开关电源,很好的解决了多路输出的负载交叉调整率问题,该电源在各种工况下都能稳定输出,主输出电压纹波小于3%,各路辅助输出纹波小于5%,负载交叉调整率小于
[电源管理]
单片机执行程序的过程
为了加深初学者对51单片机指令的理解,现在把指令执行的过程在此详细说明,希望对你有启发! 单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。 取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。 分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。 计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。 一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线
[单片机]
51单片机学习笔记6 -- 定时器中断
1.引脚复用 通过原理图可以发现定时器0(T0)和定时器1(T1)是P3.4引脚和P3.5引脚的复用功能,当将这两个引脚配置为定时器功能时,引脚外接的传感器(模块)将不能正常使用,即引脚同一时间只能作为一个功能使用(普通I/O或复用功能) T0、T1是两个16位定时器/计数器,每经过1个机器周期内部的16位计数寄存器的值加1,当计数器装满时会溢出,在定时模式时单次最大的定时时间是 65535*1.085us 的时间(单位us) 2.定时器配置 定时器0配置需要用到的寄存器(TCON、TMOD、TL0、TH0) 1.定时器/计数器控制寄存器TCON TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出
[单片机]
51<font color='red'>单片机</font>学习笔记6 -- 定时器中断
51单片机堆栈操作指令举例说明
堆栈操作 指令 有两条: PUSH direct POP direct 第一条指令称之为推入,就是将direct中的内容送入堆栈中,第二条指令称之为弹出,就是将堆栈中的内容送回到direct中。推入指令的执行过程是,首先将SP中的值加1,然后把SP中的值当作地址,将direct中的值送进以SP中的值为地址的RAM单元中。例: MOV SP,#5FH MOV A,#100 MOV B,#20 PUSH ACC PUSH B 则执行第一条PUSH ACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后, 内存60H单元的值就是100,同样,执行PUSH B时,是将SP+
[单片机]
51单片机控制舵机实验
简介:这里用到PCF8591 ADDA芯片和51单片机和一个电位器。通过控制电位器,产生PWM波,控制舵机旋转。并在数码管上显示角度。 电路图 这是程序,、 /*----------------------------------------------- 名称:IIC协议 PCF8591ADDA转换 内容:此程序通过IIC协议对DAAD芯片操作,读取电位器的电压,并输出模拟量,用LED亮度渐变指示,晶体选用12MHz ------------------------------------------------*/ #include reg52.h #include intrins.h //包
[单片机]
51<font color='red'>单片机</font>控制舵机实验
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved