前言
EFR32那个平台好用是好用,但是网上能找的资料太少了,玩不明白,至今没有弄清楚那个平台的触发回调函数的流程
还是回头用CC2530吧,虽然没EFR32这么先进,但是更加符合我的开发习惯和逻辑,配合 Z-Stack 也比较方便。
设备介绍
CC2530 挺常见的zigbee 开发板,网上教程很多但 Z-Stack 的不是很全,而且开发板型号可能有细微差异,我这次就被坑了。
串口选择
因为串口0作为调试串口,和传感器通讯就必须要使用额外的串口1
网上找到的资料,都说CC2530有两个串口,每个串口有两个组引脚:
串口0:
位置一:RX - P02,TX - P03
位置二:RX - P14,TX - P15
串口1:
位置一:RX - P05,TX - P04
位置二:RX - P17,TX - P16
但是我手里的这块板子似乎的串口位置被引到了右上角红圈位置,而P04-05,P16-17,两组引脚似乎不能作为串口使用
解析和配置 Z-Stack
在左边工程文件中的HAL文件夹下可以找到 hal_uart.c 文件,里面有一一个 HalUARTInit() 函数,里面可以看到通过三个宏来控制初始化流程:
通过这三个宏可以找到在上面的 Config 目录下有一个 hal_board_cfg.h 文件, 在那儿我们可以看到 串口相关配置:
在这里可以看到默认情况下使用 DMA 后就不开启 ISR 串口了
然后知道默认的宏定义后,我们回到HalUARTInit() 函数继续往下追
既然默认走的 DMA 分支,那么我们就去 HalUARTInitDMA() 函数里看看
原来串口的两组引脚的选择是在初始化的时候 通过刚才我们看见那几组宏来控制引脚的使用
可以很清楚的发现,Z-Stack 使用串口的关节就在那几个宏上面了
那么我们搜索这几个宏,就可以追到HalUARTOpen()函数
可以看到在这里我们终于发现选择两个串口的地方
从这可以看出两个串口不能同时配置成 DMA 或者 SPI
串口0默认为 DMA 了我们也不去修改了,串口1选择SPI只需要回到 hal_board_cfg.h 文件中
将默认的 HAL_UART_ISR 0改成2即可
去 HalUARTInitISR()看了一下 和HalUARTInitDMA() 函数差不多
也是配置两组引脚的选择,默认走的P1引脚,到这看上去就结束了是吧????
当时我也是这么认为的!后面逻辑看上去都完整的对不对?都配置好的啊?
事实证明还是我太年轻,想太多。当我仿照MT库的样子初始化串口
然后写了两个输出函数后
串口0一切正常,串口1死活没动静,我人都傻了
反复检查代码发现都没问题
这时我注意到板子右上角有一个 RX1 和 TX1 的样子,马萨卡!
这个板子该不会把串口1 固定接到那儿了吧?
然后我把串口接到 RX1 和 TX1 上,还是没反应
我不确定这个 RX1 和 TX1 对应的是 P0 还是 P1 位置,
默认 P1 位置没反应那就有可能是 P0 了
于是我一通翻找
在 hal_uart_isr.c 函数中 发现如下定义
这些应该是配置相关寄存器的宏,HAL_UART_ISR == 2 的时候选择的是 P1 位置,然后将IO设置为输入输出
将 *HalUARTInitISR()*函数中 HAL_UART_ISR 的判断修改为 == 2 时进入
这样串口1就会 从 P0 位置输出了
接上串口线,果然有输出出来了
总结
这次最大的一个教训就是,有时候硬件,会被各厂商做出一些修改,并不一定完全按照手册来!得多试试,揣摩一下硬件厂商