没有合适的资源?快使用搜索试试~ 我知道了~
zigbee串口.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 129 浏览量
2023-03-05
12:52:55
上传
评论
收藏 792KB PDF 举报
温馨提示
试读
28页
。
资源推荐
资源详情
资源评论
第 14 讲:Zstack 2006 串口机制学习
我们将串口机制的学习分为如图 X 所示的四大部分:串口配置、串口初始化、
发送数据和接收数据。
图 X 串口机制四大模块
串口配置:串口的配置主要完成配置使用 UART0 或者 UART1,同时决定是
否使用 DMA,协议栈默认使用 DMA,我们化繁为简不适用 DMA。主要在文件
hal_board_cfg.h 中完成。
串口初始化:串口的初始化主要完成相关常量的初始化即打开串口串口的工
作。主要涉及函数有 SPIMgr_Init ()和 HalUARTOpen()。
发送数据:发送数据主要完成将要发送的数据通过串口传递出去,主要涉及
到的函数有 HalUARTWrite()和串口发送中断服务函数 HAL_ISR_FUNCTION()。
接收数据:接收数据主要完成将串口传递的数据接收并传递给相应的层(通常
为 应 用 层 ) , 主 要 涉 及 的 函 数 有 HalUARTPoll()和 串 口 接 收 中 断 服 务 函 数
HAL_ISR_FUNCTION()。
1
串口配置
串口的配置主要决定是否使用 DMA,以及使用 UART0 还是 UART1,主要
在文件 hal_board_cfg.h 中完成,摘录如下:
#ifndef HAL_UART
//如果使用串口,必须至少编译以下四者之一
#if (defined ZAPP_P1) || (defined ZAPP_P2) || (defined ZTOOL_P1) || (defined
ZTOOL_P2)
#define HAL_UART TRUE
#else
#define HAL_UART FALSE
#endif
#endif
#if HAL_UART
//默认使用 UART0
#define HAL_UART_0_ENABLE TRUE
#define HAL_UART_1_ENABLE FALSE
#if HAL_DMA
#if !defined( HAL_UART_DMA )
//默认使用 DMA
#define HAL_UART_DMA 0
#endif
#else
#undef HAL_UART_DMA
#define HAL_UART_DMA 0
#endif
#if !defined( HAL_UART_ISR )
//默认不适用普通 UART
#define HAL_UART_ISR 1
#endif
#if !defined( HAL_UART_CLOSE )
#define HAL_UART_CLOSE FALSE
#endif
#else
#define HAL_UART_0_ENABLE FALSE
#define HAL_UART_1_ENABLE FALSE
#define HAL_UART_DMA FALSE
#define HAL_UART_ISR FALSE
#define HAL_UART_CLOSE FALSE
#endif
2
串口初始化
一、串口初始化
void SPIMgr_Init ()
{
halUARTCfg_t uartConfig;
App_TaskID = 0;
//UART 配置
uartConfig.configured = TRUE;
uartConfig.baudRate = SPI_MGR_DEFAULT_BAUDRATE;
uartConfig.flowControl = SPI_MGR_DEFAULT_OVERFLOW;
uartConfig.flowControlThreshold = SPI_MGR_DEFAULT_THRESHOLD;
uartConfig.rx.maxBufSize = SPI_MGR_DEFAULT_MAX_RX_BUFF;
uartConfig.tx.maxBufSize = SPI_MGR_DEFAULT_MAX_TX_BUFF;
uartConfig.idleTimeout = SPI_MGR_DEFAULT_IDLE_TIMEOUT;
uartConfig.intEnable = TRUE;
//根据编译选项配置回调函数
#if defined (ZTOOL_P1) || defined (ZTOOL_P2)
uartConfig.callBackFunc = SPIMgr_ProcessZToolData;
#elif defined (ZAPP_P1) || defined (ZAPP_P2)
uartConfig.callBackFunc = SPIMgr_ProcessZAppData;
#else
uartConfig.callBackFunc = NULL;
#endif
//打开串口
#if defined (SPI_MGR_DEFAULT_PORT)
HalUARTOpen (SPI_MGR_DEFAULT_PORT, &uartConfig);
#else
(void)uartConfig;
#endif
//初始化全局变量 SPIMgr_MaxZAppBufLen、SPIMgr_ZAppRxStatus
#if defined (ZAPP_P1) || defined (ZAPP_P2)
SPIMgr_MaxZAppBufLen = 1;
SPIMgr_ZAppRxStatus = SPI_MGR_ZAPP_RX_READY;
#endif
}
二、打开串口
uint8 HalUARTOpen( uint8 port, halUARTCfg_t *config )
{
uartCfg_t **cfgPP = NULL;
uartCfg_t *cfg;
3
#if HAL_UART_0_ENABLE
if ( port == HAL_UART_PORT_0 )
{
cfgPP = &cfg0;
}
#endif
//如果编译了 HAL_UART_CLOSE 则先关闭串口
#if HAL_UART_CLOSE
HalUARTClose( port );
#else
HAL_UART_ASSERT( *cfgPP == NULL );
#endif
*cfgPP = (uartCfg_t *)osal_mem_alloc( sizeof( uartCfg_t ) );
cfg = *cfgPP;
cfg->rxMax = config->rx.maxBufSize;
cfg->txMax = config->tx.maxBufSize;
cfg->txBuf = osal_mem_alloc( cfg->txMax+1 );
cfg->rxHead = cfg->rxTail = 0;
cfg->txHead = cfg->txTail = 0;
cfg->rxHigh = config->rx.maxBufSize - config->flowControlThreshold;
cfg->rxCB = config->callBackFunc;
#if HAL_UART_0_ENABLE
if ( port == HAL_UART_PORT_0 )
{
//设定波特率
U0BAUD = (config->baudRate == HAL_UART_BR_38400) ? 59 : 216;
U0GCR = (config->baudRate == HAL_UART_BR_38400) ? 10 : 11;
//UART0 接收使能
U0CSR |= CSR_RE;
#if HAL_UART_DMA == 1
„„
#else
cfg->flag = 0;//初始化标志位 flag 为 0
cfg->rxBuf = osal_mem_alloc( cfg->rxMax+1 );
URX0IE = 1;//UART0 接收中断使能
IEN2 |= UTX0IE; //UART0 发送中断使能
#endif
//如果使用流控,进行相关设定
if ( config->flowControl )
4
{
cfg->flag |= UART_CFG_FLW;
U0UCR = UCR_FLOW | UCR_STOP;
P0SEL |= HAL_UART_0_P0_RTS;
P0DIR |= HAL_UART_0_P0_CTS;
RX0_FLOW_ON;
}
else
{
U0UCR = UCR_STOP;//本身默認就是高位停止位
}
}
#endif
return HAL_UART_SUCCESS;
}
首先注意该函数中指针的关系,如图 X 所示。以**cfgPP 为桥梁,函数中对
指针*cfg 的操作实际是相当于对全局指针*cfg0 的操作。
图 X 指针关系
函数主要功能是完成的对串口的配置,例如串口波特率的设定,串口接收中
断使能等。同时该函数也初始化了串口接收缓存和串口发送缓存。具体分析如下:
1、设定串口相关内容,接收使能。
①、设定波特率
U0GCR = (config->baudRate == HAL_UART_BR_38400) ? 10 : 11;
U0BAUD = (config->baudRate == HAL_UART_BR_38400) ? 59 : 216;
②、中断使能、允许接收
URX0IE = 1
IEN2 |= UTX0IE
U0CSR |= CSR_RE;
③、设定结束电平
U0UCR = UCR_STOP
2、设定了 cfg0。
①、数据接收缓存
根据初始化函数中的参数为接收缓存分配内存,并将头指针 cfg->rxHead 和
尾指针 cfg->rxTail 归零。并根据初始化函数参数设定了准满的高度 rxHigh。
cfg->rxMax = config->rx.maxBufSize;
fg->rxBuf = osal_mem_alloc( cfg->rxMax+1 );
cfg->rxHead = cfg->rxTail = 0;
cfg->rxHigh = config->rx.maxBufSize - config->flowControlThreshold;
5
剩余27页未读,继续阅读
资源评论
G11176593
- 粉丝: 6705
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功