CC2540 低功耗串口, POWER_SAVING 模式 下 串口 0 的使用

摘要:
串行端口用于低功耗模式,因为32M晶体振荡器在PM2或PM3状态下不工作。根据手册,没有32M晶体振荡器,串行端口无法工作,但可以使用外部中断。因此,我将串行端口的接收引脚设置为外部中断以唤醒BLE。已定义#defineNPI_UART_FCFALSE//主管,2017年8月31日09:38:28,关闭流控制#endif//!NPI_ UART_ FC3.In_ hal_ UART_ dma。C修改文件_ PM中的DMA为0#,如果!11: 2017年8月31日11:26,记录总监

低功耗 模式 下 使用 串口 ,  因为 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. ”);

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 的时间。

  CC2540 低功耗串口, POWER_SAVING 模式 下 串口 0 的使用第1张

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

免责声明:文章转载自《CC2540 低功耗串口, POWER_SAVING 模式 下 串口 0 的使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VMware虚拟机下WIN7无法联网的解决方式微信接口文档sdk下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MobaXterm的一些介绍(Top 5 SSH Clients for Windows (Alternatives of PuTTY))

Top 5 SSH Clients for Windows (Alternatives of PuTTY) http://tecadmin.net/top-5-ssh-clients-for-windows-alternatives-of-putty/ MobaXterm又名MobaXVT,是一款增强型终端、X服务器和Unix命令集(GNU/ Cygwin...

485串口的串口服务器介绍特点说明

       rs485串口服务器是一款工业级串口服务器设备,拥有高规格的电气保护,ISO9001国际质量认证,采用协议栈技术,不宕机、不死机、数据不丢失,整机2年质保,技术支持终身服务,在-40℃—85℃环境下可运行,进口芯片,独立CPU。RS485串口转以太网,6-30V宽电压供电,软件+硬件+CPU三级看门狗稳定不宕机。        rs485串口...

在ubuntu下利用minicom实现串口通信

    windos有串口调试助手,linux下也有这样的工具——minicom。不过,minicom和linux下的许多工具都一样,也是命令行模式,没有图形化界面供我们享受。作为一款串口调试工具,虽然难看但总比没有的好。     为什么linux下的工具都这么的简朴,没什么华丽的界面,好像回到了解放前。一种可能的原因是linux这种非商业性质的软件,都是...

Centos设置串口波特率

1、stty查看串口参数 stty -F /dev/ttyS0 -a查看串口1(/dev/ttyS0)当前的参数,包括波特率、数据位等。 2、stty设置串口参数 stty -F /dev/ttyS0 ispeed 115200 ospeed 115200 cs8 该命令将串口1(/dev/ttyS0)设置成115200波特率,8位数据模式。一般情况下设置...

STM32CubeMx——串口使用DMA收发数据

用到的是DMA发送数据,DMA接收,在中断回调里发送出去。 一.代码生成 1.按以前的方法设置好时钟和调试方式,这里就不多说了。 2.设置串口1。 3.在DMASetting里点击Add添加USART1_TX,Mode有两种模式,一种是普通模式,使用一次发送语句就发一次,另一种是循环模式,使用一次发送会一直发送。这里发送我选择普通模式,接收选择循环模式...

透传模块是什么 为何透传

  顾名思义,透传模块就是透明传输模块。透明传输是指在传输过程中,对外界的透明,也就是说,你看不到它是一个传输网络。无论传输业务如何,我只负责将需要传输的业务传输到目的节点,相当于一条数据线或串行线,同时保证传输质量,而不处理传输业务。   为何透传?   透传通常用于读取远程串口数据。在物联网时代,为了实现智能设备的数据传输,需要依靠无线传输模块的力量...