📄 sio_sample.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 + -