📄 uart_api.c
字号:
/****************************************Copyright (c)**************************************************
**
**
** 杭州央海软件科技有限公司
**
** http://www.osmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
** 文 件 名: uart_app.c
** 创 建 人: 罗辉联
** 创建日期: 2006年7月23日
** 描 述: 串口应用程序函数定义,变量声明等
**
**--------------历史版本--------------------------------------------------------------------------------
** 修 改 人: 罗辉联
** 版 本: V1.0
** 日 期: 2006年7月23日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
/******************************************* 局部宏定义 ************************************************/
#define UART_GPIO GPIO0
#define UART_RX_PIN (UART3_RX_PIN)
#define UART_TX_PIN (UART3_TX_PIN)
#define UART_NUMBER UART3
#define UART_IRQ_NUMBER UART3_IRQ
typedef char * uart_va_list;
#define uart_sizeof_int(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))
#define uart_va_start(ap,v) (ap = (uart_va_list)&v +uart_sizeof_int(v))
#define uart_va_arg(ap,t) (*(t *)((ap += uart_sizeof_int(t)) - uart_sizeof_int(t)))
#define uart_va_end(ap) (ap = (uart_va_list)0)
//#define UART_SEND_BYTE(ch) UART_ByteSend(UART_NUMBER, (UWORD8 *)(ch))
#define UART_SEND_BYTE(ch) CommPutChar (COMM3, ch, 0)
/****************************************** 全局变量定义 **********************************************/
MMI_MSG_STRUCT_T *uart_msg = (void*)0; /* 定义全局指针需要这样赋初值 */
/**************************************** 局部函数原型声明 *********************************************/
/*********************************************************************************************************
** 函数名称: uart3_init
** 功能描述: 串口应用初始化函数:串口管脚分配,串口属性配置,串口打开关闭配置
** 串口中断配置,接收缓冲区初始化,该函数被主程序在初始化时调用
**
** 参 数: 无
**
** 返 回 值: 无
**
** 作 者: 罗辉联
** 日 期: 2006年5月22日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗辉联
** 日 期: 2006年6月10日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void uart3_init(UWORD32 bps)
{
GPIO_ModeConfig(UART_GPIO, UART_TX_PIN, GPIO_AF_PP); //选择GPIO PIN 作为串口管脚使用
GPIO_ModeConfig(UART_GPIO, UART_RX_PIN, GPIO_IN_COMS);
UART_ONOFFConfig(UART_NUMBER, ENABLE); //打开 UART
UART_FIFOConfig(UART_NUMBER, DISABLE); //禁止 FIFOs
UART_FIFOReset(UART_NUMBER, UART_RXFIFO); //复位 UART_RxFIFO
UART_FIFOReset(UART_NUMBER, UART_TXFIFO); //复位 UART_TxFIFO
UART_LoopbackConfig(UART_NUMBER, DISABLE); //禁止 Loop Back
//串口属性:No parity
UART_AttributeConfig(UART_NUMBER, bps, UART_NO_PARITY, UART_1_0_STOPBITS, UARTM_8D);
//-Baudrate=57600Bps
//-1 stop bit
//-8 data bits
UART_RXConfig(UART_NUMBER, ENABLE); //允许RX
//允许TxEmptyIE,RxBufNotEmptyIE中断
UART_ITConfig(UART_NUMBER,/*UART_TXEMPTY|*/UART_RXBUFFULL,ENABLE);
IRQ_PriorityConfig(UART_IRQ_NUMBER,3); //设置UART0中断优先级
IRQ_ONEITConfig(UART_IRQ_NUMBER,ENABLE); //允许UART0全局中断
CommInit();
}
/*********************************************************************************************************
;** 函数名称: uart3_irq
;** 功能描述: 串口3中断服务处理程序
;**
;** 参 数: 无
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月12日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void uart3_irq(void)
{
UWORD8 receive_data;
UWORD8 send_byte,err;
if((UART3_SR & (UART_RXBUFFULL))) /* 判断是否有接收中断 */
{
receive_data = UART3_RxBUFR;
CommPutRxChar (COMM3, receive_data); /* 将收到的数据压入到接收缓冲区 */
}
else if((UART3_SR & (UART_TXEMPTY))) /* 判断是否有发送中断 */
{
if(CommTxBufIsEmpty(COMM3) == FALSE)
{
send_byte = CommGetTxChar (COMM3, &err);
UART3_TxBUFR = send_byte;
}
else
CommTxIntDis(COMM3);
}
UART3_TxRSTR = 0xFFFF;
UART3_RxRSTR = 0xFFFF; /* 复位发送FIFO */
}
/********************************************************************************************************
;** 函数名称: uart_recv_task_core
;** 功能描述: UART接收任务core函数,主要实现从接收缓冲区中读取一贞完整的数据
;**
;** 参 数: *pdata
;**
;** 返 回 值: None
;**
;** 作 者: 罗辉联
;** 日 期: 2006年10月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void uart3_recv_task_core(void *pdata)
{
INT8U buf[DATA_FRAME_SIZE],i,err;
pdata = pdata; /* 避免编译警告 */
for (;;) /* uart任务核心处理部分 */
{
buf[0] = CommGetChar(COMM3,0,&err); /* 接收数据头 */
for (i = 1; i < DATA_FRAME_SIZE; i++)
{
buf[i] = CommGetChar(COMM3,0,&err);
}
uart_msg->msg_id = 2; //MMI_MSG_UART_FRAME = 2;
uart_msg->callback_func = NULL;
uart_msg->msg_param[0] = (INT32U)buf;
uart_msg->msg_param[1] = DATA_FRAME_SIZE;
mmi_msg_send(uart_msg);
}
}
/*********************************************************************************************************
** 函数名称: uart_printf
** 功能描述: 以查询的方式向串口发送字符串
**
** 参 数: format: 将要发送的字符串
**
** 返 回 值: 无
**
** 作 者: 李海军
** 日 期: 2006年5月21日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗辉联
** 日 期: 2006年11月10日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void uart_printf(char * format, ...)
{
char * s = 0;
int d = 0, i = 0;
unsigned char ch[sizeof(int) * 2 + 2] = {0};
uart_va_list ap = 0;
uart_va_start(ap, format);
while (* format)
{
if (* format != '%')
{
UART_SEND_BYTE(*format++);
continue;
}
switch (*(++format))
{
case 's':
case 'S':
s = uart_va_arg(ap, char *);
for ( ; *s; s++)
{
UART_SEND_BYTE(*s);
}
break;
case 'c':
case 'C':
UART_SEND_BYTE(uart_va_arg(ap, char));
break;
case 'd':
case 'D':
d = uart_va_arg(ap, int);
for(i = 0; i < sizeof(int) * 2; i++)
{
ch[i] = (unsigned char)(d&0x0f) + '0';
if(ch[i] > '9')
ch[i] += 7;
d >>= 4;
}
ch[i++] = 'x';
ch[i] = '0';
for(i = sizeof(int) * 2 + 2; i > 0; i--)
UART_SEND_BYTE(ch[i -1]);
break;
default:
UART_SEND_BYTE(*format);
break;
}
format++;
}
ch[0] = '\n';
UART_SEND_BYTE(ch[0]);
uart_va_end(ap);
}
/********************************************* end of file ********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -