⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sio_sample.c

📁 oki67500系列arm工程例程源代码
💻 C
字号:
/*************************************************************************************/
/*                                                                                   */
/*      Copyright (C) 2003 Oki Electric Industry Co., LTD.                           */
/*                                                                                   */
/*      System Name     :  ML675001 series                                           */
/*      Module Name     :  SIO Sample Functions                                      */
/*      File   Name     :  sio_sample.c                                              */
/*      Revision        :  1.00                                                      */
/*      Date            :  2003/08/18                                                */
/*                                                                                   */
/*************************************************************************************/
#include "ML675001.h"
#include "common.h"
#include "irq.h"
#include "cache.h"

/* constants */
#define CCLK        (60000000L)     /* CCLK (Hz) */
#define CGBGR       (1)             /* clock gear */
#define CLKSIO      (CCLK/CGBGR)    /* frequency CLKSIO (Hz) */
#define BAUDRATE    (115200)          /* baud rate of SIO (baud) */
#define VALUE_OF_SIO                /* value of SIOBT register */\
            ((256 * (16 * BAUDRATE) - CLKSIO) / (16 * BAUDRATE))

#define SIO_BUF_SIZE 256        /* ring buffer size */

#define rw_buf_in(value)        /* inserts a character in the ring buffer */\
(rw_buf[rw_in] = (value), rw_in++, rw_size++, \
 rw_in = (rw_in >= SIO_BUF_SIZE) ? 0 : rw_in)

#define rw_buf_out(receive)     /* outputs a character from the ring buffer */ \
((receive) = rw_buf[rw_out], rw_out++, rw_size--, \
 rw_out = (rw_out >= SIO_BUF_SIZE) ? 0 : rw_out)

/* function */
int  main(void);                        /* main routine */
void init_sio(void);                    /* initialize sio */
static void reg_irq_handler(void);      /* registration of IRQ handler */
static void setup_sio(void);            /* set up of sio registers */
static void set_gear(void);             /* setting clock gear */
static void puts_sio(const char*,int);  /* output transmission data */
void sio_handler(void);                 /* sio handler */
void led_on(UHWORD);                    /* light led */

/* global variables */
static volatile UBYTE rw_buf[SIO_BUF_SIZE];
static volatile int rw_in, rw_out;
static volatile int rw_size;
static volatile int transmit_flag;  /* 1:complete transmit 0: not complete transmit */
static volatile char error_flag;    /* 0:error not happen 1: overrun error
                                       2:parity error 3:framing error 4:overflow error */

/****************************************************************************/
/*  Entry point                                                             */
/*  Function : main                                                         */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   0                                                   */
/****************************************************************************/
int main(void)
{
    UWORD input;


    init_cache();  /* Initialize CACHE memory */
    cache_on(CACHE_BANK0);  /* Bank0 : Cache enable */

    init_irq(); /* initialize irq */
    reg_irq_handler();  /* registration of irq handler */
    init_sio(); /* initialize sio */
    setup_sio();    /* set up of sio registers */
    /* initialize led */
    init_led();   /* set output mode */
    led_on(LED_START_PATTERN);  /* light led start pattern */
    error_flag = 0; /* initialize error_flag */
    irq_en();   /* enable irq */
    /* setting clock gear */
    set_gear();
    /* setting of port */
    set_hbit(GPCTL,0x0002);     /* selection of a secondary function (gpctl 1bit)*/
    put_hvalue(SIOBCN,SIOBCN_BGRUN);    /* start baud rate timer */
    while(1){
        if(error_flag >0 || rw_size != 0){  /* error happen ? 
                                               & is there any data to transmit ? */
            if(error_flag > 0 ){    /* error ? */
                if(error_flag == 1) puts_sio("\r\nOERR\r\n", 8);         /* overrun error ? */
                else if(error_flag == 2) puts_sio("\r\nPERR\r\n", 8);    /* parity error ? */
                else if(error_flag == 3) puts_sio("\r\nFERR\r\n", 8);    /* framing error ? */
                else if(error_flag == 4) puts_sio("\r\nOVFD\r\n", 8);    /* overflow error ? */
                else
                    ;
                error_flag = 0;
            }
            else{   /* no error */
                irq_dis();  /* disable irq */
                rw_buf_out(input);
                irq_en();   /* enable irq */
                if(input == 0x1B)   /* esc */
                    break;
                else if(0x20 <= input && input <= 0x7E){    /* printable character */
                    transmit_flag = 0;
                    put_hvalue(SIOBUF,input);
                }
                else if(input == 0x0D){     /* enter */
                    transmit_flag = 0;
                    put_hvalue(SIOBUF,0x0D);
                    while(transmit_flag == 0)   /* complete transmit ? */
                        ;
                    transmit_flag = 0;
                    put_hvalue(SIOBUF,0x0A);
                }
                else
                    ;
            }
            while(transmit_flag == 0)   /* complete transmit ? */
                ;
        }
    }
    put_hvalue(SIOCON,0x00);    /* disable sio interrupts */
    put_wvalue(ILC0, 0x0);      /* disable all interrupts */
    put_wvalue(ILC1, 0x0);      /* disable all interrupts */

    irq_dis();  /* disable all interrupts */
    led_on(LED_NORMAL_END_PATTERN);    /* light led end pattern */

    return(0);
}
/****************************************************************************/
/*  Registration of IRQ Handler                                             */
/*  Function : reg_irq_handler                                              */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   Nothing                                             */
/*  Note : Initialize of IRQ needs to be performed before this process.     */
/****************************************************************************/
void reg_irq_handler(void)
{
    /* register IRQ handlers into handler table */
    IRQ_HANDLER_TABLE[INT_SIO] = sio_handler;

    /* setup interrupt level */
    set_wbit(ILC1, ILC1_ILR10 & ILC1_INT_LV2);  /* sio(nIRQ[10]) -> level2 */

    return;
}
/*****************************************************************************/
/*  Initialize SIO                                                           */
/*  Function : init_sio                                                      */
/*      Parameters                                                           */
/*          Input   : Nothing                                                */
/*          Output  : Nothing                                                */
/*****************************************************************************/
void init_sio(void)
{
    /* initialize a buffer */
    rw_in = rw_out = rw_size = 0;

    transmit_flag = 1;

    put_hvalue(SIOBCN, 0x00);   /* stop baud rate timer */
    put_hvalue(SIOSTA, 0x37);   /* clear SIOSTA */
    put_hvalue(SIOCON, 0x00);   /* clear SIOCON */
    put_hvalue(SIOBT,  0x00);   /* clear SIOBT */
    put_hvalue(SIOTCN, 0x00);   /* clear SIOTCN */
}
/****************************************************************************/
/*  Setup of SIO registers                                                  */
/*  Function : setup_sio                                                    */
/*      Parameters                                                          */
/*          Input   : Nothing                                               */
/*          Output  : Nothing                                               */
/****************************************************************************/
void setup_sio(void)
{
    /* a setup of SIOBT (set a reload value) */
    put_hvalue(SIOBT,VALUE_OF_SIO);

    /* a setup of SIOCON (8 bits of data length, parity bit none, a stop bit 1) */
    put_hvalue(SIOCON,SIOCON_LN8|SIOCON_PDIS|SIOCON_TSTB1);

    return;
}
/****************************************************************************/
/*  Setting Clock Gear                                                      */
/*  Function : set_gear                                                     */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   NOthing                                             */
/****************************************************************************/
void set_gear(void)
{
    put_hvalue(CGBCNT0,0x003c); /* enable writing CGBCNT0 register */
    put_hvalue(CGBCNT0,0x0000); /* 1-minute circumference */
    
    return;
}
/****************************************************************************/
/*  Output transmission data                                                */
/*  Function : puts_sio(*s,l)                                               */
/*      Parameters                                                          */
/*          Input   : Pointer to transmission data                          */
/*                    Length of transmission data                           */
/*          Output  : Nothing                                               */
/****************************************************************************/
void puts_sio(const char *s, int l)
{
    int i = 0;
    while(i <= l){
        transmit_flag = 0;
        put_hvalue(SIOBUF,s[i]);    /* output one character */
        while(transmit_flag == 0)   /* complete transmit ? */
            ;
        i++;
    }
    return;
}
/*****************************************************************************/
/*  SIO handler                                                              */
/*  Function : sio_handler(void)                                             */
/*      Parameters                                                           */
/*          Input   : Nothing                                                */
/*          Output  : Nothing                                                */
/*****************************************************************************/
void sio_handler(void)
{
    UWORD sta = get_hvalue(SIOSTA);
    UWORD buf;
    
    if(sta & SIOSTA_RVIRQ){     /*  received interrupt ? */
        /* receive */
        put_hvalue(SIOSTA,SIOSTA_RVIRQ);    /* clear RVIRQ flag */
        buf = get_hvalue(SIOBUF);
        /* error happened */
        if(sta & 0x07){
            if((sta & 0x07) & SIOSTA_OERR) error_flag = 1;      /* overrun error ? */
            else if((sta & 0x07) & SIOSTA_PERR) error_flag = 2; /* parity error ? */
            else if((sta & 0x07) & SIOSTA_FERR) error_flag = 3; /* framing error ? */
            else
                ;
            put_hvalue(SIOSTA,(sta & 0x07));    /* clear error status */
        }
        else if((rw_size >= SIO_BUF_SIZE))   error_flag = 4;    /* overflow error ? */
        /* error did not happen */
        else{
            rw_buf_in(buf);
        }
    }
    else if(sta & SIOSTA_TRIRQ){
        /* transmit */
        put_hvalue(SIOSTA,SIOSTA_TRIRQ);    /* clear TRIRQ flag */
        transmit_flag = 1;
    }
    return ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -