低功耗 模式 下 使用 串口 ,  因为 PM2 或者 PM3 状态下  32M晶振 是不工作 的,根据手册得知没有32M晶振, 串口是不能工作的,但是可以使用 外部中断,因此,我把  串口的接收引脚设置为外部中断,这样 来唤醒BLE。

这样就牵扯到 串口 和 外设中断  的 来回切换  ,具体操作方法如下:

协议栈版本: ble_sdk_1.4.2.2   simpleBLEPeripheral

1、   工程 配置 如下

INT_HEAP_LEN=3072

HALNODEBUG

OSAL_CBTIMER_NUM_TASKS=1

HAL_AES_DMA=TRUE

HAL_DMA=TRUE

POWER_SAVING

xPLUS_BROADCASTER

HAL_LCD=FALSE

HAL_LED=TRUE

HAL_KEY=FALSE

HAL_UART=TRUE

2、  在npi.h代码 中 做 如下修改

#if !defined( NPI_UART_FC )

#define NPI_UART_FC        FALSE//所长,2017年8月31日09:38:28,关闭流控

#endif // !NPI_UART_FC

3、  在_hal_uart_dma.c 文件 中 修改 DMA_PM 为0

#if !defined( DMA_PM )

#if defined POWER_SAVING

#define DMA_PM                     0

#else

#define DMA_PM                     0

#endif // POWER_SAVING

#endif // !DMA_PM

4、  ble休眠进入之前,使用串口的RX引脚外部中断来唤醒ble,配置如下:

  (我 放在 SimpleBLEPeripheral_Init 函数中,串口初始化函数后面)

void initRxExterInterrupt(void)

{

P0SEL &= ~(0x08);      //P0.3 TX 设置为通用I/O口

P0DIR &= ~(0x08);      //P0.3 TX 设置为输入

P0SEL &= ~(0x04);      //P0.2 设置为通用I/O口

P0DIR &= ~(0x04);      //P0.2 设置为输入

P0IFG &= ~(0x04);      //P0.2 设置为输入

PICTL |=  0;           //P0端口下降沿触发

P0IEN |=  (0x04);       //P0.2 RX 中断使能

IEN1  |=  0x20;        //端口P0中断使能

EA = 1;                //开总中断

U0CSR  &= ~0x40;     //关闭 串口 接收使能

}

5、  在外部中断服务函数中,要 关闭RX 引脚的外部中断,函数如下:

void initRxUart(void)

{

IEN1  &= ~0x20;     //端口P0中断关闭

P0SEL |= (0x08);      //P0.3 TX 设置为外设串口TX功能

P0DIR |= (0x08);      //P0.3 TX 设置为输出

}

6、  外部 中断服务函数如下

#pragma vector = P0INT_VECTOR

__interrupt void P0_ISR(void)

{

HAL_ENTER_ISR();

if(0x04 & P0IFG) //判断 是否是 P0.2 RX 引脚 中断

{

initRxUart();

//唤醒后 执行 定时任务 ,可以 这个任务中 使用 函数关闭 低功耗

osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, 5 );

CLEAR_SLEEP_MODE();//退出 休眠 ,进入工作状态

HAL_BOARD_INIT();//切换到外部32M 晶振 并且 等待稳定

}

P0IFG = 0; //清中断标志

P0IF = 0; //清中断标志,IRCON[5],P0口中断

HAL_EXIT_ISR();

}

7、  在 第六步 启动 的 定时任务中,static void performPeriodicTask( void )中

使用 下面 两句代码  重新初始化串口,和关闭低功耗

NPI_InitTransport(NpiSerialCallback);     //重新初始化串口

osal_pwrmgr_device( PWRMGR_ALWAYS_ON ); // 不在进入低功耗

printf(“Wakeup OK.\r\n”);

8、  重新进入低功耗 的 方法 :

// makes sure LEDs are OFF

HalLedSet( (HAL_LED_1 | HAL_LED_2), HAL_LED_MODE_OFF );

HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT );

HCI_EXT_HaltDuringRfCmd( HCI_EXT_HALT_DURING_RF_ENABLE );

//关闭 定时事件,降低功耗

osal_stop_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT );

initRxExterInterrupt(); //重新 初始化 rx 为 外部中断

osal_pwrmgr_device( PWRMGR_BATTERY );//打开 OSAL 进入低功耗的开关

9、经过 测试 唤醒 过程需要  40mS 的时间。

  

2017年8月31日11:11:26,所长,记录

CC2540 低功耗串口, POWER_SAVING 模式 下 串口 0 的使用的更多相关文章

  1. Linux下串口编程入门

    简介: Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍. 串口简介  串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用 ...

  2. 【Debug】串口发送数据时部分字节被拉长,出现帧错误,原因MCU进入低功耗模式导致串口时钟停了!

    串口发送数据时部分字节被拉长,出现帧错误,原因MCU进入低功耗模式导致串口时钟停了!

  3. Cypress EZ-USB FX3 DMA模式下的串口通讯

    由于公司设备升级后出了问题,需要对USB驱动进行修改,原本使用的是寄存器模式进行UART传输,但是由于FX3寄存器模式会出现长时间延时等待的问题,不得不对其传输模式进行修改.虽然赛普拉斯的EZ-USB ...

  4. Linux下串口编制【转】

    串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调 ...

  5. Linux下串口编程【转】

    本文转载自:http://blog.csdn.net/w282529350/article/details/7378388 /************声明:本人只是见到这篇文章对我帮助很大才转载的,但 ...

  6. linux下串口通信与管理

    linux下的串口与windows有一些区别,下面将介绍一下linux下串口通信管理 查看是否支持USB串口: #lsmod | grep usbserial 如果没有信息:sudo apt-get ...

  7. Linux下串口編程遇到的接收数据错误及原因(0x0d,0x11接收错误)

    摘要:Linux下串口编程遇到的接收数据错误及原因 来源:https://dotblogs.com.tw/k/2012/07/24/73572 近日在调试串口的时候发现,另一设备向我ARM板的串口发送 ...

  8. Linux下串口配置初步探寻

    一.在struct termios结构体中,对串口进行基本配置(如波特率设置,校验位和停止位设置 等). (一): struct termios   //串口的设置主要是设置struct termio ...

  9. Windows下串口编程

     造冰箱的大熊猫@cnblogs 2019/1/27 将Windows下串口编程相关信息进行下简单小结,以备后用. 1.打开串口 打开串口使用CreateFile()函数.以打开COM6为例: HAN ...

随机推荐

  1. 拆系数FFT(任意模数FFT)

    拆系数FFT 对于任意模数 \(mod\) 设\(m=\sqrt {mod}\) 把多项式\(A(x)\)和\(B(x)\)的系数都拆成\(a\times m+b\)的形式,时\(a, b\)都小于\ ...

  2. C++学习笔记(8)----C++类的大小

    C++类的大小 (i) 如下代码: #include<iostream> using namespace std; class CBase { }; class CDerive :publ ...

  3. MySQL数据库(9)----使用连接实现多表检索

    有许多演示如何使用MySQL所支持的连接操作的示例,都用到了下列两个表 t1 和 t2: mysql> SELECT * FROM t1; +----+------+ | i1 | c1 | + ...

  4. RocketMQ读书笔记6——可靠性优先的使用场景

    [顺序消息] 顺序消费是指消息的产生顺序和消费顺序相同. 比如订单的生成.付款.发货,这三个消息必须按顺序处理才可以. [顺序消息的分类] 全局顺序消息和部分顺序消息. 上面订单的例子,其实是部分顺序 ...

  5. Linked List Cycle 判断一个链表是否存在回路(循环)

    Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...

  6. 在Oracle/SQL Service中通过Function返回Table

    本函数用途:返回一个Table 在Oracle中实现,范例: --在Types中: create or replace type objTable as object ( s_usercode var ...

  7. kernel update

    CentOS/RHEL更新包:https://rhn.redhat.com/errata/RHSA-2017-1382.html yum makecache --更新源 yum update sudo ...

  8. Azure 订阅和服务限制、配额和约束

    最后更新时间:2016年10月24日 概述 本文档指定一些最常见的 Azure 限制.请注意,本文档目前未涵盖所有 Azure 服务.一段时间后,将展开并更新这些限制以包含多个平台. NOTE: 如果 ...

  9. MySQL 8.0复制性能的提升(翻译)

    What’s New With MySQL Replication in MySQL 8.0 MySQL复制从问世到现在已经经历了多个年头,它的稳定性和可靠性也在稳步的提高.这是一个不停进化的过程,由 ...

  10. 让图片左右缓慢移动的MoveView

    让图片左右缓慢移动的MoveView 效果: 源码: MoveView.h 与 MoveView.m // // MoveView.h // AnimationView // // Created b ...