前言
做了一个使用CC2530和ESP8266模块连接,检测温湿度和光照强度,通过ESP8266上传数据并且接受指令控制led。遇见很多坑,废寝忘食的全部解决了,特在此记录一下以供以后参考。
1.for语句的使用
一般情况编写zigbee程序用的是IAR8050,对于for语句有一个很隐秘的坑,就是如果用for语句构建的delay延迟函数会在编译烧录到单片机里却发现没有延迟,延迟函数似乎失效了。我上网找了一下发现是iar有个功能是编译时候会优化程序。

如图所示,这里我已经改成NONE了,之前是high,由于延时函数往往是单纯的for的循环计算,在高程度优化后,for语句以为内部没有内容,就会在编译的时候删掉,从而延迟失效。
2.串口引脚的重定义
根据CC2530的寄存器手册可知,如图所示

U0,U1两个串口分别各自有两套引脚方案,U0是P02,P03或者P14,P15,U1是P04和P05或者P16和P17,由于我的仿真器要用到P1口,而且U0连接着TTL转USB,所以和ESP8266的串口通讯需要用U1,但是在zstack中U1默认是用P16和P17作为TX和RX。而且zstack只能用一个USART,因为在zstack工程中,如图所示,使用U0或U1是靠配置中的宏定义ZTOOL_P2或者ZTOOL_P1确定的。

两者似乎不能同时存在,如果同时存在也是优先于ZTOOL_P2,在写串口函数HalUARTWrite中我们可以看到如下图。
使用哪个串口是由HAL_UART_DMA的值确定的,去寻找其宏定义如下图
由上图可以看到宏定义的值还是由ZTOOL_P2或者P1决定的,而且如果定义了P2,则P1似乎没有作用了。
在zstack中,U1默认使用P1口,而且没有选择为P0口的选项,如果使用U1,则zstack会默认配置P1IO口,通过HAL_uart.c文件可以找到串口初始化函数,默认使用DMA方式的串口。

进入这个函数后可以看到,zstack正是在这里配置了串口的IO口,分别赋值了PERCFG,PxSEL,ADCCFG,这几个关于IO口配置的寄存器。在给PERCFG赋值时,在使用U1的情况下,原来的程序是PERCFG |= HAL_UART_PERCFG_BIT;

最低0.47元/天 解锁文章
1156

被折叠的 条评论
为什么被折叠?



