在ZStack里的uart功能封装在HAL/Include/hal_uart.h头文件里:
#define HAL_UART_BR_9600 0x00
#define HAL_UART_BR_19200 0x01
#define HAL_UART_BR_38400 0x02
#define HAL_UART_BR_57600 0x03
#define HAL_UART_BR_115200 0x04
/* Frame Format constant */
/* Stop Bits */
#define HAL_UART_ONE_STOP_BIT 0x00
#define HAL_UART_TWO_STOP_BITS 0x01
/* Parity settings */
#define HAL_UART_NO_PARITY 0x00
#define HAL_UART_EVEN_PARITY 0x01
#define HAL_UART_ODD_PARITY 0x02
/* Character Size */
#define HAL_UART_8_BITS_PER_CHAR 0x00
#define HAL_UART_9_BITS_PER_CHAR 0x01
/* Flow control */
#define HAL_UART_FLOW_OFF 0x00
#define HAL_UART_FLOW_ON 0x01
/* Ports */
#define HAL_UART_PORT_0 0x00
#define HAL_UART_PORT_1 0x01
#define HAL_UART_PORT_MAX 0x02
...
typedef void (*halUARTCBack_t) (uint8 port, uint8 event);
...
typedef struct
{
bool configured;
uint8 baudRate;
bool flowControl;
uint16 flowControlThreshold;
uint8 idleTimeout;
halUARTBufControl_t rx;
halUARTBufControl_t tx;
bool intEnable;
uint32 rxChRvdTime;
halUARTCBack_t callBackFunc;
}halUARTCfg_t;
...
extern void HalUARTInit ( void ); //uart工作模式初始化函数,在系统启动时已调用
extern uint8 HalUARTOpen ( uint8 port, halUARTCfg_t *config );//打开串口,并指定uart的配置参数
extern void HalUARTClose ( uint8 port ); //关闭串口
extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length ); //接收串口数据
extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length ); //发出串口数据
extern uint16 Hal_UART_RxBufLen ( uint8 port ); //返回串口port的需要接收的数据长度(接收缓冲区里的数据长度)
extern uint16 Hal_UART_TxBufLen ( uint8 port ); //返回串口port的尚未发出的数据长度(发送缓冲区里的数据长度)
...
//
串口的使用方法: 只要HalUARTOpen(…)打开串口后,再调用HalUARTRead(…)就可以接收数据, 调用HalUARTWrite(…)就可以发出数据了.
但用不着麻烦了,在工程MT/MT_UART.c里已经实现好由MT任务处理uart的驱动代码:
void MT_UartInit ()
{
halUARTCfg_t uartConfig;
/* Initialize APP ID */
App_TaskID = 0;
/* UART Configuration */
uartConfig.configured = TRUE;
uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE; //波特率
uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW; //流控
uartConfig.flowControlThreshold = MT_UART_DEFAULT_THRESHOLD;
uartConfig.rx.maxBufSize = MT_UART_DEFAULT_MAX_RX_BUFF;
uartConfig.tx.maxBufSize = MT_UART_DEFAULT_MAX_TX_BUFF;
uartConfig.idleTimeout = MT_UART_DEFAULT_IDLE_TIMEOUT;
uartConfig.intEnable = TRUE;
#if defined (ZTOOL_P1) || defined (ZTOOL_P2) //宏在工程配置里设置
uartConfig.callBackFunc = MT_UartProcessZToolData; //指定串口接收数据的函数
...
#endif
/* Start UART */
#if defined (MT_UART_DEFAULT_PORT)
HalUARTOpen (MT_UART_DEFAULT_PORT, &uartConfig); //打开串口,并指定配置
#else
/* Silence IAR compiler warning */
(void)uartConfig;
#endif
...
}
/
void MT_UartRegisterTaskID( byte taskID )
{
App_TaskID = taskID; //在MT_UART.c里用全局变量App_TaskID存放需要接收串口数据的任务号.
}
void MT_UartProcessZToolData ( uint8 port, uint8 event ) //
{
uint8 ch;
uint8 bytesInRxBuffer;
(void)event; // Intentionally unreferenced parameter
while (Hal_UART_RxBufLen(port)) //判断是否已经有数据接收
{
HalUARTRead (port, &ch, 1); //接收数据
...
}
...
}
//
MT任务的初始化:
void osalInitTasks( void ) //系统初始化所有任务的函数
{
uint8 taskID = 0;
...
#if defined( MT_TASK ) //宏可在工程配置里指定
MT_TaskInit( taskID++ );
#endif
...
MyApp_Init(taskID);
}
const pTaskEventHandlerFn tasksArr[] = {
...
#if defined( MT_TASK )
MT_ProcessEvent,
#endif
...
MyApp_ProcessEvent,
};
void MT_TaskInit(uint8 task_id)
{
MT_TaskID = task_id;
...
MT_UartInit(); //串口初始化函数, 我们不需要再次调用此函数了
...
}
...
//
要想让MT任务对串口进行操作,需要让宏MT_TASK和宏ZTOOL_P1成立才可以。
在工程里的配置:
///
在MyApp任务上加上串口的发出功能:
//注意修改下MT_UartInit里所用的参数
#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_9600
#define MT_UART_DEFAULT_OVERFLOW FALSE
//////////////////////
// 系统在启动时会自动调用MT_UartInit串口初始化函数,初始化第0个串口.
// HalUARTWrite(HAL_UART_PORT_0, ...) 调用此函数就可以发出数据了
MyApp.c //实现按键时输出字符串
#include "OnBoard.h"
#include "MyApp.h"
#include "hal_led.h"
#include "hal_key.h"
#include "MT_UART.h"
#include "hal_uart.h"
#include "MT.h"
#define TIME_OUT_EVENT 0x4
#define TIME_LEN 2000
uint8 mytask_id; //用于存放本身的任务号
void MyApp_Init(uint8 task_id )
{
mytask_id = task_id;
RegisterForKeys(mytask_id); //设置当前任务接收按键消息
}
uint16 MyApp_ProcessEvent(uint8 task_id, uint16 events )
{
keyChange_t *key_evt;
if ( events & SYS_EVENT_MSG ) //当有按键消息时,任务的事件会是SYS_EVENT_MSG
{
key_evt = (keyChange_t *)osal_msg_receive(mytask_id);
if (key_evt->hdr.event == KEY_CHANGE)
{
if (key_evt->keys & HAL_KEY_SW_1)
HalUARTWrite(HAL_UART_PORT_0, "btn1\n\r", 6);
if (key_evt->keys & HAL_KEY_SW_2)
HalUARTWrite(HAL_UART_PORT_0, "btn2\n\r", 6);
}
osal_msg_deallocate( (uint8 *)key_evt ); //回收消息的空间
}
if (events & TIME_OUT_EVENT) //定时器的事件
{
;
}
return 0;
}