CC2540 低功耗串口, POWER_SAVING 模式 下 串口 0 的使用
低功耗 模式 下 使用 串口 , 因为 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 的使用的更多相关文章
- Linux下串口编程入门
简介: Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍. 串口简介 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用 ...
- 【Debug】串口发送数据时部分字节被拉长,出现帧错误,原因MCU进入低功耗模式导致串口时钟停了!
串口发送数据时部分字节被拉长,出现帧错误,原因MCU进入低功耗模式导致串口时钟停了!
- Cypress EZ-USB FX3 DMA模式下的串口通讯
由于公司设备升级后出了问题,需要对USB驱动进行修改,原本使用的是寄存器模式进行UART传输,但是由于FX3寄存器模式会出现长时间延时等待的问题,不得不对其传输模式进行修改.虽然赛普拉斯的EZ-USB ...
- Linux下串口编制【转】
串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调 ...
- Linux下串口编程【转】
本文转载自:http://blog.csdn.net/w282529350/article/details/7378388 /************声明:本人只是见到这篇文章对我帮助很大才转载的,但 ...
- linux下串口通信与管理
linux下的串口与windows有一些区别,下面将介绍一下linux下串口通信管理 查看是否支持USB串口: #lsmod | grep usbserial 如果没有信息:sudo apt-get ...
- Linux下串口編程遇到的接收数据错误及原因(0x0d,0x11接收错误)
摘要:Linux下串口编程遇到的接收数据错误及原因 来源:https://dotblogs.com.tw/k/2012/07/24/73572 近日在调试串口的时候发现,另一设备向我ARM板的串口发送 ...
- Linux下串口配置初步探寻
一.在struct termios结构体中,对串口进行基本配置(如波特率设置,校验位和停止位设置 等). (一): struct termios //串口的设置主要是设置struct termio ...
- Windows下串口编程
造冰箱的大熊猫@cnblogs 2019/1/27 将Windows下串口编程相关信息进行下简单小结,以备后用. 1.打开串口 打开串口使用CreateFile()函数.以打开COM6为例: HAN ...
随机推荐
- Node.js如何找npm模板
首先需要去官网下载npm文件 https://www.npmjs.com/ 下载完成,使用CD查看是否安装完成 然后就是贴代码看npm模板的功能 var _ = require('underscore ...
- Bzoj2395: [Balkan 2011]Timeismoney(最小乘积生成树)
问题描述 每条边两个权值 \(x,y\),求一棵 \((\sum x) \times (\sum y)\) 最小的生成树 Sol 把每一棵生成树的权值 \(\sum x\) 和 \(\sum y\) ...
- QT开发(一)Vs2013集成 QT5.3.1
原文:http://www.cnblogs.com/aoldman/p/3860837.html 很久不写随笔了,真是越来越懒.最近公司要做一款产品,想使用QT不用WPF lol,让苦逼的.net的我 ...
- android studio新建项目时出现Error:Execution failed for task ':app:preDebugAndroidTestBuild'.
android studio更新后创建新项目时出现以下错误 可以用Build->Rebuild Project解决,但这个方法只是临时的,重新打开项目还是会报错 所以用另一种方法: 在app下的 ...
- Android获取蓝牙地址
最近做一个项目,发现Android6.0以上的版本获取的蓝牙地址始终为02:00:00:00, Google一下发现Android早就封掉了相关接口,于是想到反射的方式去获取Mac地址,在此记录一下 ...
- c# 设计模式 之:抽象工厂
1.作用:抽象工厂的目的就是生产[产品族],之前讲的“工厂模式”的每一个factory只造一种产品,抽象工厂让一个factory造多个产品. uml类图: 代码实现: 抽象工厂代码: namespac ...
- libcrypto.so.10内容丢失导致sshd无法运行
今天启动虚拟机,ssh服务起不来,提示如下: Starting sshd: /usr/sbin/sshd: error while loading shared libraries: libcrypt ...
- ActiveMQ5.8.0安装及启动
一.下载 官网地址:http://activemq.apache.org/download.html Windows版本:apache-activemq-5.8.0-bin.zip Linux版本:a ...
- SQLServer数据库执行较大的脚本
当我们需要在SQLServer数据库里面执行一个比较大的文件(比如2GB)时,会发现数据库根本无法打开该脚本文件,原因是因为查询分析器只能执行100M以内的文件,所以脚本过大就会造成内存溢出.下面是具 ...
- 打通版微社区(1):PHP环境部署 for DZX3.2
写在前面:本文参考了http://blog.sina.com.cn/s/blog_513be2630101linz.html非常感谢博主此文对我此次操作帮助很大.PHP的windows部署方案主要分为 ...