:
最近搞开发遇到个问题:当我的POWER_SAVING宏定义开启时,如果程序中出现P04变为高电平,即出现复位现象。
我解决问题的过程是这样的是如下这样的:
我用CC2541控制所有的IO口,配置的关键情况如下:
我查到了不相干的解答,网上有说出现下面的问题的:
编译时出现警告“Warning[w52]: More than one definition for the byte at address 0x6b in common segment INTVEC. It is defined in module "hal_uart" as well as in module "hal_key"”?
答:原因是IAR中包含了POWER_SAVING的宏之后,串口唤醒就需要用到IO中断,而协议栈中串口唤醒的默认IO口是P04脚。因此在_hal_uart_dma.c中包含了的P0中断服务函数就与Hal_key.c中包含的P0中断服务函数相冲突。
详情代码如下:
1)当IAR中包含了POWER_SAVING的宏之后,会定义一个DMA_PM的宏(_hal_uart_dma.c中)
#if !defined( DMA_PM )
#if defined POWER_SAVING
#define DMA_PM 1
#else
#define DMA_PM 0
#endif // POWER_SAVING
#endif // !DMA_PM
2)一旦有了DMA_PM这个宏,_hal_uart_dma.c中就会包含P0的中断服务函数
#if DMA_PM
#if (HAL_UART_DMA == 1)
HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR)
#else
HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR)
#endif
{
HAL_ENTER_ISR();
PxIFG = 0;
PxIF = 0; dmaRdyIsr = 1;
CLEAR_SLEEP_MODE();
HAL_EXIT_ISR();
}
3)IAR设置中包含HAL_KEY=TRUE时,Hal_key.c中就会包含P0的中断服务函数
HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )
{
HAL_ENTER_ISR();
#if defined ( CC2540_MINIDK )
if ((HAL_KEY_SW_1_PXIFG & HAL_KEY_SW_1_BIT) || (HAL_KEY_SW_2_PXIFG & HAL_KEY_SW_2_BIT))
#else
if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)
#endif
{
halProcessKeyInterrupt();
}
各位,问一个问题:就是板子主控芯片是CC2541F256,程序用的OSAL操作系统,与手机通过Simple GATT Profile进行连接传输数据;我的程序中需要用P04口作为普通IO,程序中没有调用串口相关程序,当我用手机端发送数据控制IO变化时,其他的都可以正常翻转IO,P04口上电默认是低电平,一旦让P04口由低电平变为高电平时,手机便会与板子断开连接(所谓单片机死机)。重新启动,仍然可以继续连接到手机。
有一个现象,当我参照上图中,把POWER_SAVING变成xPOWER_SAVING时,问题得到解决,所谓手机能够正常连接板子,让P04引脚正常翻转IO,而不出现死机。想知道其中到底发生了什么,这与POWER_SAVING有什么关系吗?