首页 uart驱动(for keil rtx) .doc

uart驱动(for keil rtx) .doc

举报
开通vip

uart驱动(for keil rtx) .docuart驱动(for keil rtx) .doc uart驱动(for keil rtx) #define UART0_BPS 9600#define UART0_RXBUF_SIZE 32#define UART0_TXBUF_SIZE 32#define UART_NO_ERR 0#define UART_TX_EMPTY 1extern void uart0_init (void);extern void uart0_putc (uint8_t c);extern void uart0_puts (u...

uart驱动(for keil rtx)  .doc
uart驱动(for keil rtx) .doc uart驱动(for keil rtx) #define UART0_BPS 9600#define UART0_RXBUF_SIZE 32#define UART0_TXBUF_SIZE 32#define UART_NO_ERR 0#define UART_TX_EMPTY 1extern void uart0_init (void);extern void uart0_putc (uint8_t c);extern void uart0_puts (uint8_t *pbuf, uint16_t len);extern uint8_t uart0_getc (void);typedef struct { OS_SEM rx_sem; // Rx信号量 uint16_t rx_t; // Rx缓冲中字符数 uint8_t *rx_pi; // 指向下 一字符将被插入的位置 uint8_t *rx_po; // 指向下一字符将被提取的 位置 uint8_t rx_buf[UART0_RXBUF_SIZE]; // Rx缓冲 OS_SEM tx_sem; // Tx信号量 uint16_t tx_t; // Tx缓冲中字符数 uint8_t *tx_pi; // 指向下一字符将被插入的位置 uint8_t *tx_po; // 指向下一字符将 被提取的位置 uint8_t tx_buf[UART0_TXBUF_SIZE]; // Tx缓冲 uint8_t tx_busy; // Tx忙标志} UART0_BUF;static UART0_BUF uart0_buf;static UART0_BUF *pbuf0 = uart0_buf;void uart0_putrx (uint8_t c){ if (pbuf0->rx_t < UART0_RXBUF_SIZE) { pbuf0->rx_t ; *pbuf0->rx_pi = c; if(pbuf0->rx_pi == pbuf0->rx_buf[UART0_RXBUF_SIZE]) { pbuf0->rx_pi = pbuf0->rx_buf[0]; } isr_sem_send (pbuf0->rx_sem); }}uint8_t uart0_gettx (uint8_t *perr){ uint8_t c; if (pbuf0->tx_t > 0) { pbuf0->tx_t--; c = *pbuf0->tx_po ; if (pbuf0->tx_po == pbuf0->tx_buf[UART0_TXBUF_SIZE]) { pbuf0->tx_po = pbuf0->tx_buf[0]; } isr_sem_send (pbuf0->tx_sem); *perr = UART_NO_ERR; return (c); } else { *perr = UART_TX_EMPTY; return (0); }}void uart0_proc (void) __irq{ uint8_t iir, c; uint8_t i, err; p; 0x01) ==0) { sp; 0x0E) { case 0x04: case 0x0C: for (i=0; i<16; i ) { if ((U0LSR 0x01)==0) break; uart0_putrx (U0RBR); } break; case 0x02: for (i=0; i<16; i ) { c = uart0_gettx (err); if (err == UART_NO_ERR) { U0THR = c; } else { pbuf0->tx_busy = 0; break; } } break; } } VICVectAddr = 0x00;}void uart0_init (void){ PINSEL0 = 0xFFFFFFF0; PINSEL0 |= 0x00000005; U0LCR = 0x83; U0DLM = (FPCLK / 16) / UART0_BPS / 256; U0DLL = (FPCLK / 16) / UART0_BPS % 256; U0LCR = 0x03; U0FCR = 0x87; U0IER = 0x03; pbuf0->rx_t = 0; pbuf0->rx_pi = pbuf0->rx_buf[0]; pbuf0->rx_po = pbuf0->rx_buf[0]; os_sem_init (pbuf0->rx_sem, 0); pbuf0->tx_t = 0; pbuf0->tx_pi = pbuf0->tx_buf[0]; pbuf0->tx_po = pbuf0->tx_buf[0]; os_sem_init (pbuf0->tx_sem, UART0_TXBUF_SIZE); pbuf0->tx_busy = 0; VICVectCntl0 = 0x26; VICVectAddr0 = (uint32_t)uart0_proc; VICIntEnable|= 0x40;}uint8_t uart0_getc (void){ uint8_t c; os_sem_, 0xFFFF); irq_lock (); pbuf0->rx_t--; c = *pbuf0->rx_po ; if (pbuf0->rx_po == pbuf0- >rx_buf[UART0_RXBUF_SIZE]) { pbuf0->rx_po = pbuf0- >rx_buf[0]; } irq_unlock (); return (c);}void uart0_putc (uint8_t c){ os_sem_, 0xFFFF); irq_lock (); pbuf0->tx_t ; *pbuf0->tx_pi = c; if (pbuf0->tx_pi == pbuf0->tx_buf[UART0_TXBUF_SIZE]) { pbuf0->tx_pi = pbuf0->tx_buf[0]; } if (pbuf0->tx_busy == 0) { pbuf0->tx_busy = 1; pbuf0->tx_t--; c = *pbuf0->tx_po ; if (pbuf0->tx_po == pbuf0->tx_buf[UART0_TXBUF_SIZE]) { pbuf0->tx_po = pbuf0->tx_buf[0]; } os_sem_send (pbuf0->tx_sem); U0THR = c; } irq_unlock ();}void uart0_puts (uint8_t *pbuf, uint16_t len){ while (len--) { uart0_putc (*pbuf ); }}
本文档为【uart驱动(for keil rtx&#41; &#46;doc】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_337177
暂无简介~
格式:doc
大小:16KB
软件:Word
页数:3
分类:
上传时间:2018-04-27
浏览量:21