This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

    我之前又调了一下,我也是觉得是寄存器或者是宏的原因,使程序跳过了一些重要的配置

    继续调中。。。。。。