本篇博文最后修改时间:2017年05月22日,19:53。
一、简介
本文集合了香瓜整理的CC2541的新手常见问题,不断更新。
二、版权声明
1)作者:甜甜的大香瓜
2)声明:喝水不忘挖井人,转载请注明出处。
3)纠错/业务合作:897503845@qq.com
4)香瓜BLE之CC2541群:127442605
5)本文出处:原创连载资料《简单粗暴学蓝牙4.0(CC2541篇)》
6)完整开源资料下载地址(电脑端打开):
7)香瓜CC2541开发板套件购买:
三、新手问题集
********************准备阶段问题集*******************
1.2.0、做蓝牙4.0开发需要购买哪些设备?
答:
购买链接:
1、产品介绍
1)开发板(必备)
板载 LED、按键、蜂鸣器、串口等外设,用于学习蓝牙通信与控制。
2)仿真器/下载器(必备)
可连接开发板与电脑,将电脑的编译文件下载进开发板里。也可在线仿真实时看代码运行情
况。
3)OLED显示屏(选购)
可以插在开发板上,主要用来显示当前连接或断开等状态信息。
4)USB Dongle抓包工具(选购)
几乎每个蓝牙工程师人手一个。有线通信用的是示波器抓取波形看信号,而蓝牙通信则用
usb dongle 在空中抓取广播包、通信包。相比于昂贵的示波器,USB Dongle 相当便宜。
注意以下几点:
①USB Dongle里可选择两种常用固件之一:抓包(配套电脑软件 packet sniffer,作为主从
机之外的第三方来抓取主从机通信数据)、btool(配套电脑软件 btool,可将 USB Dongle作
为电脑端的蓝牙主机,并能查看到收发指令)。香瓜店铺默认下载的是抓包固件。
②它的核心芯片是蓝牙 4.0 的 CC2540,所以它能抓取蓝牙 4.0。
③更换固件需要 CC254x的仿真器 CC Debugger 来更换。(btool功能不常用,一般情况可不必更换固件)
5)传感器套件(选购)
内含:声音传感器、MPU6050、DHT11、继电器、RGB 灯、人体传感器。
这几个常用传感器,让你进一步学习如何用 CC2640R2F 控制外设。
2、针对不同 开发目的的推荐套餐
1)手机与 CC254X开发板的通信
开发板(必备)+仿真器(必备)+OLED(选购)+USB Dongle(选购)+传感器套件(选
购)
2)两块 CC254X开发板之间的通信
2*开发板(必备)+1*仿真器(必备)+2*OLED(强烈推荐)+USB Dongle(选购)+传感
器套件(选购)
1.2.1、新手入门,有什么学习资源吗?
答:
1)香瓜CC254X开发板购买地址
淘宝店铺:opengua.taobao.com
2)开发资源(必装软件+书籍)
3)学习博客
①甜甜的大香瓜(已停更博客):甜甜的大香瓜-CSDN博客
②红-萝卜:红-萝-卜-CSDN博客
③ziye334:LOFTER(乐乎) - 让兴趣,更有趣
4)TI官网
①CC2541相关资料界面:
CC2541 数据表、产品信息和支持 | 德州仪器 TI.com.cn
②蓝牙技术支持版块:
5)好文推荐
①《BLE sniffer guide》:http://processors.wiki.ti.com/index.php/BLE_sniffer_guide
②《如何测量BLE的功耗》:
如何测量BLE的功耗(点击率最高的应用报告之一) - 蓝牙论坛 - Bluetooth - E2E™ 设计支持
③《关于CC2530存储器映射的讨论》:
④《CC2540/CC2541进入PM3深度休眠的条件及其休眠机制的剖析》:
CC2540/CC2541进入PM3深度休眠的条件及其休眠机制的剖析_cc2541深度休眠后重启-CSDN博客
⑤《BLE 包结构及传输速率》:
⑥《CC2541 128bit UUID 官方教程有错修改方法》:
1.2.2、新手入门,如何学习较快?
答:
所谓“磨刀不误砍柴工”,该看的书要看,书不在多,看完任何一本都可入门。
该跑的例程要跑,多自己想办法解决问题,仅靠问别人来学习,那是像驴一样被鞭策前进。
香瓜提供一种学习方法:
1)阅读《简单粗暴学蓝牙4.0(CC2541篇)》、《低功耗蓝牙开发权威指南》、TI官方资料、《Core_v4.0》、《蓝牙4.0BLE开发完全手册》。
2)把香瓜开发板的初级到高级的例程全部跑完。
3)技术群、论坛中多交流,不局限于提问,多帮助他人。
4)将技术知识写成博客分享给大家,让大家一起阅读、测试你的博客,一起完善你的博客。
5)做项目。
1.2.3、怎么样的手机才支持蓝牙4.0、蓝牙5?
答:
1、蓝牙4.0
软硬件方面同时达到以下要求:
1)软件上:安卓4.3版本以上。
2)硬件上:支持蓝牙4.0。
注:苹果手机iphone4S开始支持蓝牙4.0。
2、蓝牙5
个别最新手机已支持硬件蓝牙5,如:小米6。
软件是否支持蓝牙5暂不明了。
1.2.4、什么是蓝牙的主机、从机?
答:类似于电台广播(从机)与收音机(主机),一个电台广播能让多个收音机接收到。
同样的,蓝牙从机也可以发出一定范围内(一般是几十米以内)的蓝牙广播信号,此时周边的蓝牙主机都能接收到蓝牙从机的广播信息。
除此之外,蓝牙主机还能与蓝牙从机一对一连接,连接之后可进行加密或不加密的数据通信。
1.2.5、蓝牙能否一主多从、一从多主?
答:
可以分时地实现一主多从,即表面上看起来是一个主机能控制3个从机,实际上是快速地依次连接、通信、断开3个从机。
可以不连接地实现一从多主,也就是从机广播、主机接收广播信息。
1.2.6、蓝牙主从机通信的方式有几种?
答:两种,一种非连接方式、一种连接方式。
非连接方式(单向传输):从机广播数据,主机接收。
连接方式(双向传输):主机连接从机,主从机可互传数据。
1.2.7、蓝牙信号是否会受到干扰?
答:是的,因为蓝牙信号、WIFI信号等都是在2.4GHz,所以周边如果有大量蓝牙设备、WIFI设备,或者有墙壁等阻碍物,蓝牙信号都会受到影响。
1.2.8、如何调整蓝牙通信的距离?
答:
1)软件调整:可通过软件来设置蓝牙的发射功率,发射功率越大,距离越远。
2)硬件调整:
①天线的选择(粗调):天线有pcb天线、陶瓷天线、外置天线等,简单来说体积越大、价格越高的天线信号越好。
②(微调):天线电路的阻抗匹配要调到最优。
1.2.9、是不是蓝牙通信距离越远越好?
答:不是。要根据你的项目来选择合适的距离。
例如防丢器最适合周边10米以内,如果蓝牙距离过远,可能钱包丢了100米防丢器才在手机上报警。
1.2.10、BLE跟蓝牙什么关系?
答:简单地说,蓝牙(Bluetooth)分为两种,大数据量的蓝牙和小数据量的蓝牙。
1)大数据量的蓝牙,叫传统蓝牙或者经典蓝牙(Classic Bluetooth),它牺牲功耗换取数据量。如:蓝牙耳机、蓝牙音箱。
2)小数据量的蓝牙,就是BLE(Bluetooth Low Energy),它具有低至uA级别的功耗优势,常用在简单的控制领域。如蓝牙灯、蓝牙窗帘、蓝牙小车、蓝牙门锁。
经典蓝牙和BLE是不能相互通信的,因为是两种不同的协议。
1.2.11、手机中的蓝牙是经典蓝牙还是BLE?
答:手机中的蓝牙芯片一般是双模芯片,即支持经典蓝牙,也支持BLE。
一般手机自带的蓝牙操作界面,都仅支持经典蓝牙。(不同手机厂商会做不同的定制,不是绝对)。
所以香瓜建议大家在开发BLE产品过程中,不要使用手机自带的蓝牙操作界面,直接使用支持BLE的app。
1.2.12、手机BLE能作从机广播吗?
答:
可以。但市面上大部分BLE app都是作主机的,你需要安装作从机的BLE app才能广播数据。
1)苹果手机:使用lightblue。(既支持主机、又支持从机)
2)安卓手机:无,需要找app工程师定制。
1.2.13、主机、从机、客户端、服务器是什么关系?
答:
主机与从机是蓝牙底层的概念,主动发起连接的设备都是主机,被连接的设备则是从机。例如:手机(主机)主动连接蓝牙灯(从机)。
客户端与服务器是上层(GATT层)的概念,客户端往往需要从服务器获取数据。例如:手机(客户端)获取蓝牙灯(服务器)的亮灭情况。
一般来说,主机都是客户端,从机都是服务器。
但也有些例外,例如蓝牙手表(从机、客户端)和手机(主机、服务器),当手机来电时,手机会主动把电话号码“通知”给手表。
之所以要明确四者的关系,是因为我们在开发过程中,要明晰主机才有发起连接的权利、服务器才有使用notify函数的权利,所以不要惊讶于为什么主机可以使用notify函数,因为此时主机是服务器罢了。
1.2.14、手机端有什么蓝牙app好用吗?
答:
见《简单粗暴学蓝牙4.0(CC2541篇)》的“第三章 软件的安装及使用”章节。
1.2.15、BLE的认证是怎么回事?
答:
如果产品上有蓝牙logo,则要BQB认证。
如果要出货到美国,要FCC认证。
如果要出货到欧洲,要CE认证。
*******************开发阶段问题集********************
1.3.1、为何有时固件端更新了代码,手机APP端却看不到现象?
答:
手机可能缓存了之前固件的数据(在更新过固件之后,都需要清除手机端的缓存!!!),因此要清除缓存,清除缓存的方法如下:
方法一:关闭app、关闭蓝牙总开关、打开蓝牙总开关、打开app。
方法二:手机重启。
1.3.2、蓝牙广播停止、蓝牙通信断开的原因是什么?
答:
蓝牙通信跟你打电话是一样的:假设你跟朋友打电话,互相说话的间隔是3秒一句话,超过30秒无人接听就会挂断。
此时如果你突然离开1分钟去上厕所,给你打电话的人必然会挂断电话。
因为你的上厕所时间超过了对方愿意等待的时间。
反过来看你的蓝牙通信会断开,说明你的事件处理时间已经超过了“连接间隔+超时时间”。
你要么缩小事件处理时间,要么增大“连接间隔+超时时间”
1.3.3、为什么有些工程会异常(打开时软件崩溃退出、编译没错而仿真却出错、使用别人的工程出错)?
答:
很可能是移动过了文件夹导致了IAR查找不到了文件路径。
要养成好的习惯,拿到别人的工程,要做以下两步:
1)将整个工程文件夹放到“无中文、简短”的路径下,如“E:\”。
2)打开工程后rebuild all。
1.3.4、为什么我的串口收发不正常、串口乱码??
答:
阅读《简单粗暴学蓝牙4.0(CC2541篇)》的《CC2541之串口收发》。
1.3.5、为什么有些函数中有些变量前加void?
答:
这是防止编译警告。去掉这一句,IAR会警告这个id没被使用。
1.3.6、为什么看到别人代码中使用notify时,用到的特征值句柄为0x002E、0x0035,哪里来的?
答:
数值为多少对我们程序员来说并不重要,我们只需要能获取到这个值就可以了。
阅读《简单粗暴学蓝牙4.0(CC2541篇)》的《CC2541之notify》
1.3.7、为什么看到别人代码中使用GATT_Notification(0, &pReport, FALSE)的连接句柄是0?
答:
数值为多少对我们程序员来说并不重要,我们只需要能获取到这个值就可以了。
阅读《简单粗暴学蓝牙4.0(CC2541篇)》的《CC2541之notify》
1.3.8、CC2541的工程能下到CC2540中、CC2540的工程能下到CC2541中吗?
答:
不能。
但是同一个文件夹下的CC2541和CC2540的代码是通用的。假设已经开发好了CC2541工程,此时想做一个CC2540工程,只需要:
1)打开同文件夹下的CC2540工程。
2)将CC2540工程中的IAR配置设置得与CC2541工程完全一致。(比如预编译宏一致、添加头文件路径一致、添加的驱动一致)。
1.3.9、为什么我的packet sniffer抓不到通信数据包?
答:蓝牙4.0BLE cc2540 usb-dongle的 SmartRF Packet Sniffer 抓取数据方法 【原创,多图】_cc2540 usb dongle-CSDN博客
1.3.10、CC2541通信时一个数据包最多能传几个字节?
答:
20个应用数据+几个底层数据。
1.3.11、CC2540和CC2541有什么区别?
答:
见《简单粗暴学蓝牙4.0(CC2541篇)》的《CC2541之与CC2540的区别》。
1.3.12、从机怎么给主机发送数据?
答:
见《简单粗暴学蓝牙4.0(CC2541篇)》的《CC2541之notify》。
1.3.13、为什么我的按键按了没反应?
答:
见《简单粗暴学蓝牙4.0(CC2541篇)》的《CC2541之按键》。
1.3.14、我用HalLedSet函数开led,为什么有时会闪烁?
答:
如果开启了低功耗,在主轮询期间会间歇性进入低功耗,在HalSleep.c中的halSleep函数内会短暂关闭led。(调用的是“HalLedEnterSleep();”)
解决闪烁问题的两种方法:
1)不使用低功耗。
2)在iar设置中先“HAL_LED=FALSE”,然后直接对寄存器操作。
1.3.15、为什么手机自带的蓝牙软件扫描不到CC2541的广播?
答:
支持蓝牙4.0的手机的蓝牙大多数都是双模的,也就是支持CC2541这类的BLE蓝牙,还支持蓝牙耳机这种大数据类型的传统蓝牙。
而自带的蓝牙软件就是可搜索蓝牙耳机,而不能搜索到BLE,因为他们协议不一样。
如果想搜索到CC2541,需要下载一个支持BLE的APP来搜索。
1.3.16、为什么2541flash只有256K,却能下载大于256K的hex?
答:
因为实际下载进2541的flash里的是bin文件。hex可以理解为“包头数据+bin+校验数据”(详情自行百度),总之hex比bin大,hex大小约为bin的2倍多一些。
1.3.17、如何查看工程的bin大小?
答:
1)生成bin文件后查看:生成bin的方法请参考论坛上方的香瓜博客,《CC2541之OAD》。
2)在IAR的编译信息中查看:
点击iar上方的Tools——Options进行下图的设置,然后rebuild all。就可以看到代码中实际的flash使用情况。
1.3.18、CC2541是否能同时使用两个串口?
答:
可以,一个使用dma方式,一个使用isr方式。
1.3.19、在香瓜开发板上如何点亮oled?
答:
香瓜开发板的lcd与ti的oled不一样,所以需要拿香瓜开发板的oled驱动替换掉协议栈的oled驱动。
见《简单粗暴学蓝牙4.0(CC2541篇)》的《CC2541之oled》。
1.3.20、使用BTool软件时显示超时,是怎么回事?
答:
见《简单粗暴学蓝牙4.0(CC2541篇)》的《CC2541之BTool》。
1.3.21、进行修改了CC2541端的名称、修改了CC2541端的特征值等操作,为什么手机上显示的仍然是之前的显示数据?
答:
原因是app缓存了这些数据。在更新过CC2541的代码之后,都需要清除手机端的缓存!!!
常用几种清缓存的方法:
1)关闭app、关闭蓝牙总开关、打开蓝牙总开关、打开app。
2)手机重启。
1.3.22、CC2540、CC2541都能作为packet sniffer的抓包工具,进行抓包吗?
答:
CC2540可以,CC2541不可以。TI没提供2541的抓包hex。
1.3.23、CC2541被手机连接上以后,是否还能广播数据让其他设备搜到?
答:
连接状态下可再广播,但需要IAR设置中修改宏成PLUS_BROADCASTER。
阅读《简单粗暴学蓝牙4.0(CC2541篇)》的《CC2541之连接时广播》。
1.3.24、32M、32K外部晶振能不能省略?
答:
1)需要用到蓝牙功能时,32M外部晶振不能省略。
2)需要用到低功耗时,32K外部晶振不能省略。
阅读《简单粗暴学蓝牙4.0(CC2541篇)》的《CC2541之32.768kHZ外部晶振》。
1.3.25、CC2541的OSAL中使用的定时器是哪个定时器?
答:
timer2。
1.3.26、协议栈中的SimpleBLECentral例程,如何修改才能搜索周围的ble设备(如手环等)?
答:
SimpleBLECentral例程在扫描时做了扫描过滤。
1)如果想把所有设备添加进来,把simpleBLEFindSvcUuid函数的使用注释掉即可。
2)如果想增加一个UUID的从机设备,添加:
else if(simpleBLEFindSvcUuid(……))//新的UUID
{
//增加设备
}
可阅读《简单粗暴学蓝牙4.0(CC2541篇)》的《CC2541之解析simpleBLECentralEventCB》加强理解。
1.3.27、CC2541的RF工作频率是多少?
答:
CC2540:RF frequency range 2402~2480MHz。
CC2541:RF frequency range 2379~2496MHz。
1.3.28、CC2541的adc采样位有几位?
答:
12bit,最高位为符号位,实际有效采样为11bit。
1.3.29、CC2541从机如何获取主机MAC地址?
答:
在simplebleperipheral.c中有:
uint8_t peerAddress[B_ADDR_LEN];
GAPRole_GetParameter(GAPROLE_CONN_BD_ADDR, peerAddress);
1.3.30、主机端接收灵敏度如何设置?
答:
1.3.31、ANCS是什么?
答:
苹果通知中心(Apple Notification Center Service, ANCS)。
1)CC2541是从机,IOS是主机且不需要app。
2)CC2541是客户端、IOS是服务器。
3)ANCS必须要绑定(不一定要密码)。
4)基本步骤如下:
①CC2541广播。
②IOS连接。
③绑定过程。
④CC2541扫描IOS的服务和特征值。
⑤CC2541打开IOS的notify开关。
⑥IOS有来电时,发送notify消息提醒包给CC2541。
⑦CC2541发送读取电话的指令给IOS。
⑧IOS返回电话数据。
1.3.32、CC2541从机的广播间隔拉长为3S,导致CC2541主机连接很慢,怎么解决?
答:
可以在CC2541主机端开启高速扫描:
TI的GAPCentralRole_EstablishLink连接函数的第一个参数,false改为ture。
1.3.33、simpleBLEcentral工程连接simpleBLEperipheral后,发现服务很慢,如何解决?
答:
工程在连接之后默认为延时1S才去发现服务,可以缩短这个时间。
1.3.34、如何知道一块CR1632(120mAh)在自己的设备上能用多久?
答:
1)使用示波器测试设备电流以及电流持续时间。
2)通过测得的数据,算出电流平均值。
例如:1秒1次RF通信、RF通信持续1ms,其中RF通信时电流有18ma,其他时间段为10uA。
那么电流平均值=1秒内总电流/1秒=(18000uA*0.001S+10uA*0.999S)/1S=28uA。
3)计算有效电池电量
例如:CC2541有效电压是2V以上,CR1632是额定电压3V,因此CR1632的120mAh对于CC2541都是有效电池电量。
4)计算使用时长=有效电池电量/电流平均值=120mAh/28uA=120000uAh/28uA=4285.7h=178.6天。
1.3.35、如果从机申请更新参数失败了,会执行什么操作?
答:
GAPRole_SendUpdateParam函数中的最后一个形参,即是更新参数失败后的执行操作。
它一共有3个选项(无动作、重发、断开连接):
#define GAPROLE_NO_ACTION 0 // Take no action upon unsuccessful parameter updates
#define GAPROLE_RESEND_PARAM_UPDATE 1 // Continue to resend request until successful update
#define GAPROLE_TERMINATE_LINK 2 // Terminate link upon unsuccessful parameter updates
1.3.36、为什么我用GAPRole_GetParameter(GAPROLE_CONN_ADDR,peerAddress)获取主机(手机)的mac地址后,每次重启后mac地址就变了?
答:
由于手机安全机制,不会以真实mac地址去连接蓝牙设备。但cc2541作为从机可从绑定信息中获取真实的mac地址,参考代码如下:
idx = gapBondMgrResolvePrivateAddr( pDevAddr );
if ( (idx < GAP_BONDINGS_MAX) && (pResolvedAddr) )
{
VOID gapBondMgrGetPublicAddr( idx, pResolvedAddr );
}
break;
1.3.37、如何将多个hex合成一个hex?
答:
1)写多个 hex 进芯片里。
2)用flash programmer从芯片里读出1个hex。
此时这个hex就是合成好的的hex,方便用于需烧写多个hex的量产。
1.3.38、蓝牙从机设备生产时该如何测试?
答:
蓝牙从机设备内部增加测试指令,用于测试的手机使用测试app,不停地连接、发送测试指令、断开从机,收到测试指令的从机关闭广播一段时间。
1.3.39、packet sniffer如何过滤出某个设备的广播包信息?
答:
【BLE4.0】Packet sniffer 过滤广播MAC地址_蓝牙抓包 mac 地址过滤-CSDN博客
1.3.40、假设特征值6的数据长度是20,如何能让app发送少于20字节数据给CC2541?
答:
默认是只允许发指定字节的,可通过如下方法修改:
1.3.41、已有CC2541工程,如何在CC2540芯片中使用?
答:
CC2541工程是不能直接下载到CC2540芯片中的,但我们可以以CC2541工程做一个同样功能的CC2540工程。
如上图,在同一个文件夹下有CC2540和CC2541工程,并且这两个工程所用到的源文件全部都是一致的。
1、打开两个IAR,分别打开CC2541工程、CC2540工程
2、对比两个工程,在CC2540工程中添加CC2541中已添加的驱动文件
3、分别点开两个工程的option设置(快捷键alt+F7)
如上图,右键-options。
4、参考CC2541中的路径、预编译宏,在CC2540的option设置中修改,如下图
5、rebuild all工程,此时CC2540工程即与CC2541具备一样的功能(特殊的IIC和USB等硬件差异功能例外),可以直接下载进CC2540芯片中了。
1.3.42、如何用flash programmer下载代码?
答:
1、硬件连接:电脑-香瓜cc debugger下载器-香瓜CC254X开发板
2、打开flash programmer
3、
注意第二个红框显示当前连接的模块芯片为CC2541,第三个红框要选择要下载的CC2541代码(不能是CC2540代码)。
然后最后最下面那个红框是烧写,点击后显示OK即可。
1.3.43、低功耗怎么做?低功耗串口又怎么做?
答:
如上图所示,低功耗一共有3个档次,PM3是最低功耗档。一般我们所说的低功耗主要为PM2和PM3两个档。
可以简单理解为:
1)PM2为半睡眠模式,此模式下有广播、可连接。
2)PM3为全睡眠模式,此模式下无广播、不可连接。主要通过按键中断来唤醒(当然也可通过复位)。
注意几点:
1)如果你的设备需要低功耗,则需要32K外部晶振,否则由于内部32K的RC震荡电路的时钟不准确,会导致唤醒后的蓝牙连接会断开。
2)唤醒后会进行晶振切换,此过程需要时间。因此唤醒后不要马上来使用外设,可调用个定时器延时(具体要多久,可用示波器查看晶振切换时间,香瓜猜想是几十ms)后使用。
1、以TI提供的官方从机代码为例,介绍如何进入PM2和PM3
1)工程的宏定义里要有“POWER_SAVING”。
注:只要开启了这个低功耗宏,协议栈就会自动控制是否进入低功耗。此时由于只有定时器的周期事件,因此协议栈会在PM2,功耗大概几十ua~几百ua。
2)在PM2基础上,关闭定时器周期事件、关闭广播,即可进入PM3,功耗大概在小几十ua以内,理论在10ua左右。
2、低功耗串口的使用
CC2540 低功耗串口, POWER_SAVING 模式 下 串口 0 的使用 - 所长 - 博客园
1.3.44、IIC的两个引脚如何作为普通IO口使用?
答:
I2CWC |= (1<<7); //引脚设置为GPIO功能 //I2CWC &= ~(1 << 1) ; //SCL OUTPUT //I2CWC |= (1 << 1) ; //SCL INPUT //I2CWC &= ~(1 << 0) ; //SDAL OUTPUT //I2CWC |= (1 << 0) ; //SDA INPUT //I2CIO &= ~(1 << 1) ; //SCL 0 //I2CIO |= (1 << 1) ; //SCL 1 //I2CIO &= ~(1 << 0) ; //SDAL 0 //I2CIO |= (1 << 0) ; //SDA 1 |
上述代码为香瓜的未测试代码,需读者自行测试。
具体需要配置为输入还是输出,可自行去掉注释符号。
注意这两个IO口没有中断功能。
1.3.45、串口波特率如何修改?
答:
1.3.46、如何使用串口1收发?
答:
添加宏定义:
HAL_UART_DMA=2 |
这样会映射到串口1的alt2引脚P16(TX)和P17(RX)上。
1.3.47、编译时提示警告信息“Warning[Pe1665]: concatenation with "=" in macro "HAL_CONFIG_IO_OUTPUT_PREP" does not create a valid token”?
答:
1、双击任意一条警告,跳转到警告的语句后,右键go to definition of。
2、删除下图中的两处“##”
备:这里的##是C语言宏定义的一种写法,它起连接的作用,即将##和传入的参数一一对应起来组合成一个新的关键字。
***************仿真器CC Debugger问题集*****************
1.4.1、下载线需要几根?如何连接?
答:
见《简单粗暴学蓝牙4.0(CC2541篇)》的《CC2541之CC Debugger》。
*****************开发工具问题集**********************
1.5.1、IAR版本与协议栈版本该如何选择?
答:
建议使用如下对应关系:
1)iar8.10.4可以使用1.3.2的协议栈
2)iar8.20.2可以使用1.3.2和1.4.0的协议栈
3)iar9.10可以使用1.4.1的协议栈
注:当高版本的iar(如9.10版本)使用低版本协议栈(如1.4.0版本),可作如下图的修改来达到编译通过。
1.5.2、为什么有时候IAR中设置不了断点?
答:
IAR断点最多设置3个。可以点击view-breakpoint,将已有的断点全部删除后,重新设置不超过3个的断点。
1.5.3、仿真状态下,为什么查看的变量值看不到?
答:
因为变量被优化了,只需关闭IAR优化后,再次仿真,即可通过watch窗口查看变量值。
1.5.4、为什么工程中有些是灰色的文件?
答:
IAR中的文件都可以选择“编译”或“不编译”。打叉的文件是不编译的,如果工程中需要编译它,可以点击该文件右键——Options——把Exclude form build的勾去除。
1.5.5、工程中的“CC2541DK-MINI Keyfob”是什么?
答:
iar允许在一个工程中自定义多个配置,用于同一套代码对不同板子的快速切换。
“CC2541DK-MINI Keyfob”就是TI公司的一块开发板对应的工程配置,我们通常会选择“CC2541”这个配置(推荐)。
1.5.6、IAR打开工程时出现“The project file’SimpleBLEPeripheral’is in an old format……”是怎么回事?
答:
这是你使用的iar版本,比目前打开的工程所使用的iar版本更高,选“是”即可。
*************香瓜CC254X开发板问题集***************
1.6.1、香瓜CC254X核心板的各个引脚是什么?
答:
GND | 3.3V | 核心板正面 | RESET | P00 |
P22 | P21 | P01 | P02 | |
P20 | P17 | P03 | P04 | |
P16 | P15 | P05 | P06 | |
P14 | P13 | P07 | P10 | |
D+/SCL | D-/SDA | P11 | P12 |