CC2540 keyfob 串口与DMA问题
各位大神:
我使用SimpleBLEPeripheral程序想要验证下蓝牙4.0 BLE协议栈中的串口(使用DMA)应用,做了个实验,但是有问题,怎么发数据也发不出来,下面是我的代码:
在SimpleBLEPeripheral.c中添加:
unsigned char uartbuf[152];
static void rxCB(uint8 port, uint8 event)
{
HalUARTRead(0, uartbuf,19);
HalUARTWrite(0, uartbuf,19);
osal_memset( uartbuf,0,19);
}
在SimpleBLEPeripheral_Init()函数中添加:
halUARTCfg_t uartConfig;
uartConfig.baudRate = HAL_UART_BR_115200;
uartConfig.configured = TRUE;
uartConfig.flowControl = FALSE;
uartConfig.callBackFunc = rxCB;
HalUARTOpen(0, &uartConfig);
并且 我在keyfob上自己飞了串口线(使用串口0)。
但是怎么调都调不出来,我要是在options中加上HAL_UART = TURE就会提示warnning,说什么重复定义了(hal_uart和hal_key重复定义,并且在这个时候调试按右键,也无法广播,dongle无法搜索到),我要是不加这个宏,就在HalDriverInit()中发现有下面一段
/* UART */
#if (defined HAL_UART) && (HAL_UART == TRUE)
HalUARTInit();
#endif
也就是说不加入宏haluart就没有被初始化,同样运行也无法收到信息。大家有什么看法和建议给提下下~~
程序会报警告是因为:
定义了POWER_SAVING这个宏 ,定义了这个宏之后 , 就会把P0中断重新写一遍 ,然后就会报错
#if !defined( DMA_PM )
#if defined POWER_SAVING
#define DMA_PM 1
#else
#define DMA_PM 0
另外:
#if DMA_PM
/**************************************************************************************************
* @fn PortX Interrupt Handler
*
* @brief This function is the PortX interrupt service routine.
*
* @param None.
*
* @return None.
*************************************************************************************************/
#if (HAL_UART_DMA == 1)
HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR)
#else
HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR)
#endif
之前HAL_KEY就用到P0中断P0INT_VECTOR了
HAL_UART_DMA这个是1的 然后就悲剧的重定义了
但是将程序改了之后,使用HalUARTWrite()函数还是不可以~~~~~~~~~~~~
宏定义部分设置,
HAL_UART_DMA == 1
HAL_UART = TURE
DMA_PM==0,DMA_PM是关于串口低功耗,硬件流控制两个线部分的代码,如果用不着就设置为0.
或者
HAL_UART_DMA == 2
HAL_UART = TURE,这样避开了中断重定义。如果还不行,接着找原因。
P0SEL
P1SEL
P2SEL
P0DIR
P1DIR
P2DIR
P0
P1
P2
也很可能是这几个寄存器的原因,并没有将uart设置为外设IO口,你看看寄存器的值和手册中的是否一致。
恩~ 谢谢 ROSS
我之前又调了一下,我也是觉得是寄存器或者是宏的原因,使程序跳过了一些重要的配置
继续调中。。。。。。