本帖最后由 769484623 于 2017-7-12 12:38 编辑
这次我打算做个心率+骑行速度计算的小项目,如果时间允许,我也会做下APP,并上传上来共享给大家。
我以前曾经使用过CC2540,并进行了一些相关开发,但当我第一次上手CC2640的时候仍然让我感觉不太适应。 拿到昇润科技提供的SDK后,我又从官网下载了最新的SDK,用来对比使用。毕竟基于 ti-RTOS,了解了原系统有助于了解二次封装的系统。 昇润科技的SDK目标致力于让开发者能够快速的进行开发,所以底层的很多细节如密码配对、UUID描述的更改,都是开发者不可控的。有利即有弊嘛,这个也是可以理解的。CC2640的TI-RTOS添加了多线程的一些特性,如信号量、句柄等。M4内核让较复杂的调度成为了可能
昇润科技的SDK给了相关的使用说明,但有的地方还是有一点错误的(因为举例所用SDK比较老),比如SDK从机模板的目录就不是文档说明中的Project,而是在TTC_CC2640_R2_SDKexamplesrtosCC2640R2_LAUNCHXLblestackSDKtirtosiar下面。
我使用的是最新的IAR FOR ARM,大家可以从官网下载,可以完美支持昇润科技的SDK。插上XDS调试器后发现没有驱动(万恶的360),只能手动安装。(位于IAR FOR ARM 的 /arm/drivers/ti-xds中。唯一的那个EXE就是驱动安装包)
装好驱动后的样子
打开工程文件后,第一件事当然就是生成固件烧录了。这里我们需要注意,需要先生成并烧录Stack,之后才能烧录APP。
就在这里我出现了一个问题:找不到XXXXXX.flash. 这不是啥大问题,把Override 恢复就好了。 APP设置同理。
之后我们成功的生成并download了对应的固件! 打开 手机蓝牙,能搜索到TTC_CC2640的蓝牙,代表固件生成成功。
之后该是点灯了。 点灯这个在CC2540上很简单,因为51的内核无法添加过多功能,其RTOS也是比较简陋的。但在CC2640的RTOS上就比较麻烦了。 昇润科技将IO0~IO31分为了4个组,每个IO对应的组如下图:
由于只有一个带跳线的LED,所以我将其与最近的IO口相连(IO0,即IO3_6),用一个跳线帽就可以搞定。 按键使用的是下降沿触发,所以按键一端接IO3_5,另一端直接接地。 没添加按键去抖,所以各位做复现实验时可能发现LED会多次翻转。这个是正常现象……(好吧,怪我懒)
下面放出代码。
- //LED.C
- #include "Led.h"
- #include "TTCBLESDKCommDef.h"
- #include "TTCSDKBoard.h"
- #include "TTCBleSDKManager.h"
- #include
- #define SYSTEM_CLOCK_EVENT 0x01
- static Clock_Struct sysClock;
- static Event_Handle sysClockEventHandle;
- static PIN_Handle systemClockPinHandle;
- static PIN_State systemClockPinState;
- PIN_Config GPIO[] = {
- IO3_5 | PIN_INPUT_EN | PIN_PULLUP ,
- IO3_6 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MED,
- PIN_TERMINATE
- };
- //使用DIO0来作为WAKE_LED,输出模式,默认低电平,推挽,中等推力
- //使用DIO1作为按键中断引脚,内接上拉
- void GPIO_Int(PIN_Handle eventHandle, PIN_Id id)
- {
- if(id == IO3_5)//判断中断是哪个引脚引起的
- {
- TTCDriverIOSetOutputVaule(&systemClockPinHandle,IO3_6,~TTCDriverIOGetOutputValue(IO3_6));//翻转IO
- }
- }
- void ledInit(Event_Handle eventHandle)
- {
- sysClockEventHandle = eventHandle;
- TTCDriverIOOpen(&systemClockPinHandle,
- &systemClockPinState,
- (const PIN_Config *)GPIO);//初始化IO组
- TTCDriverIORegisterIntCallBack(&systemClockPinHandle,GPIO_Int);//注册中断回调
- TTCDriverIOSetConfig(&systemClockPinHandle,PIN_BM_IRQ,IO3_5|PIN_IRQ_NEGEDGE);//下降沿触发
- #ifdef POWER_SAVING//如果开启了节能模式,需要按照下面设置中断唤醒
- TTCDriverIOSetConfig(&systemClockPinHandle,PINCC26XX_BM_WAKEUP,IO3_5|PINCC26XX_WAKEUP_NEGEDGE);//下降沿触发
- #endif
- Util_constructClock(&sysClock,
- systemClockCB,
- 0,
- 1000,
- true,
- SYSTEM_CLOCK_EVENT);
- }//1000ms的定时,systemClockCB为SYSTEMCLOCK定时器中断的回调函数
- void systemClockCB(UArg arg)
- {
- if(arg & SYSTEM_CLOCK_EVENT)//1000ms唤醒
- {
- Event_post(sysClockEventHandle, UTIL_QUEUE_EVENT_ID);//触发队列任务
- }
- }
- void ledFlash()
- {
- //TTCDriverIOSetOutputVaule(&systemClockPinHandle,IO3_6,~TTCDriverIOGetOutputValue(IO3_6));//这个打开的话就是2s闪一次,同时会响应按键的翻转LED
- }
复制代码
LED.H
- #ifndef Led
- #define Led
- #include
- void ledInit(Event_Handle eventHandle);
- void systemClockCB(UArg arg);
- void ledFlash();
- #endif
复制代码
将这两个文件加入工程,之后在TTCBlePeripheral.c中的TTCBlePeripheralTaskInit()的末尾添加LedInit(),并且在TTCBlePeripheralTaskFxn()添加ledFlash(),如下图:
|