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,所长,记录

时间: 2024-11-11 18:11:55

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

ISAPI和CGI限制中没有ASP.NET v4.0 ; vS2013检测到在集成的托管管道模式下不适用的 ASP.NET 设置。

统确实自带了ASP.NET v4.0,但是ISAPI中没有这个选项,导致服务器开不起来 解决方法如下: 1.确保安装IIS时确实安装了ASP.NET,如果没有的话,勾上重新装一下,一般出现404.2时这么干 2.如果你是先装了IIS然后才装了.NET,那就需要把.NET再注册一下,一般出现404.17时这么干 命令是:C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i 重启IIS就可以看到了       S2013

tomcat-5.0.28在https模式下无法下载文件问题解决

PS: 此web.xml中的security-constraint写法: 在tomcat-5.0.28中以http形式访问其web应用时[无法]自动跳转https 在tomcat-5.5.20中以http形式访问其web应用时[可以自动跳转到https] 环境 tomcat-5.0.28(配置https),jdk1.6 web应用web.xml安全相关配置: <security-constraint> <web-resource-collection> <web-resour

微软URLRewriter.dll的url重写在目标框架.Net Framework2.0、4.0和应用程序池经典模式、集成模式下的配置

大家参考几篇园子里面的这篇文章: 文章1:微软URLRewriter.dll的url重写的简单使用 (讲解了使用UrlReWriter.dll的下载.web.config如何在目标框架2.0应用程序池经典模式下配置使用该dll.还有一个web的例子.缺少处理程序映射的设置例子) 文章2:使用web.config中的httpHandlers (讲解了URLRewriter.dll是如何从原理上来处理URL重写地址来转发给真实的服务器地址上的) 文章3:检测到在集成的托管管道模式下不适用的ASP.N

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

由于公司设备升级后出了问题,需要对USB驱动进行修改,原本使用的是寄存器模式进行UART传输,但是由于FX3寄存器模式会出现长时间延时等待的问题,不得不对其传输模式进行修改.虽然赛普拉斯的EZ-USB FX3系列芯片功能强大,成本适中,但共享资源太少,API参考手册里面的干货不多,直接导致开发困难,出现问题只能去官方社区寻找答案.新模式的开发也不是一帆风顺,找来找去,只有在固件库中找到了UartLpDmaMode这个例程还比较相似.于是便在其基础上进行修改. 在UartLpDmaMode例程中,

Linux下串口编制【转】

串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准.串口通讯指的是计算机依次以位(bit)为单位来传送数据,串行通讯使用的范围很广,在嵌入式系统开发过程中串口通讯也经常用到通讯方式之一. Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口

linux下串口通信与管理

linux下的串口与windows有一些区别,下面将介绍一下linux下串口通信管理 查看是否支持USB串口: #lsmod | grep usbserial 如果没有信息:sudo apt-get install setserial 插上USB转串口,在终端输入命令 #dmesg | grep ttyUSB0 如果出现连接成功信息,则说明系统已经识别该设备 一.找到自己的串口设备 查找自己的开发板与电脑的连接的COM口方法 Windows:设备管理器 linux: (1)dmesg #查看带有

linux 下串口编程VTIME和VMIN的设置

VTIME定义要求等待的时间量(取值不能大于cc_t). VMIN定义了要求等待的最小字节数. options.c_cc[VTIME] = X; //设置从获取到1个字节后开始计时的超时时间 options.c_cc[VMIN] = Y;   //设置要求等待的最小字节数 在原始模式下对read()函数的影响: 1.X=0,Y!=0.函数read()只有在读取了Y个字节的数据或者收到一个信号的时候才返回: 2.X!=0,Y=0.即使没有数据可以读取,read()函数等待X时间量后返回: 3.X!

电脑在IDE模式下能正常启动,改成AHCI后蓝屏——解决方法

本人安装的是32位的WIN7操作系统,SATA串口在IDE模式下能正常运行,,但是在BIOS 中把IDE模式改为AHCI模式时,发现启动不了电脑,出现蓝屏,显示SOPT:0X0000007B....  后来在网上查了一下解决方案. 网上有各种解决方案,下面列出几种我觉得比较可行的吧: 方法一: 1.先把BIOS的高级SATA选项的AHCI模式设为IDE,并设U盘启动, 2.重启电脑进入PE系统,这里在PE系统中可查到硬盘,点击:自动安装系统到C盘,开始复制文件,当复制结束时,提示几秒电脑重新启动

SEGGER RTT STOP/SLEEP 模式下使用

1.问题详述, M3/M4内核在sleep 或者 STOP模式 下,内核是不工作的,因此需要 以下 几步操作 第一步: 开启 低功耗模式下,debug 的连接 DBGMCU_Config(DBGMCU_SLEEP, ENABLE); DBGMCU_Config(DBGMCU_STOP, ENABLE); 第二步: 判断 RTT 缓冲区有多少字节,然后进行 MCU 空转,空转时间 给JLINK 进行读取 数据,就可以正常打印了 extern unsigned _GetAvailWriteSpace