绑定建立起来之后什么时候就启动串口传输了呢?
从osal_start_system这个函数开始->>Hal_ProcessPoll()
里面有如下的编译判断语句
#if (defined HAL_UART) && (HAL_UART == TRUE)
HalUARTPoll();
由于本实验是串口传输实验判断条件成立
HalUARTPoll();
然后-》HalUARTPollDMA()
这个函数的最后有这样一句话:
if (evt && (dmaCfg.uartCB != NULL))
{
dmaCfg.uartCB(HAL_UART_DMA-1, evt);
}
进一步分析:
static uartDMACfg_t dmaCfg;
typedef struct {
uint16 rxBuf[HAL_UART_DMA_RX_MAX];
#if HAL_UART_DMA_RX_MAX < 256 uint8 rxHead;
uint8 rxTail; #else uint16 rxHead;
uint16 rxTail;
#endif
uint8 rxTick;
uint8 rxShdw;
uint8 txBuf[2][HAL_UART_DMA_TX_MAX];
#if HAL_UART_DMA_TX_MAX < 256 uint8 txIdx[2];
#else uint16 txIdx[2];
#endif
volatile uint8 txSel;
uint8 txMT;
uint8 txTick; // 1-character time in 32kHz ticks according to baud rate, // to be used in calculating time lapse since DMA ISR // to allow delay margin before start firing DMA, so that // DMA does not overwrite UART DBUF of previous packet volatile uint8 txShdw; // Sleep Timer LSB shadow.
volatile uint8 txShdwValid; // TX shadow value is valid
uint8 txDMAPending; // UART TX DMA is pending
halUARTCBack_t uartCB;
} uartDMACfg_t;
那halUARTCBack_t又是什么呢?
typedef void (*halUARTCBack_t) (uint8 port, uint8 event);
他是个指针函数,也就是说dmaCfg.uartCB是个halUARTCBack_t的回调函数,那他又是在哪儿赋值的呢?
既然是回调函数,那么在要用的时候才会被赋值,我们回到void SerialApp_Init( uint8 task_id )这个函数分析,发现如下两句话:
uartConfig.callBackFunc = SerialApp_CallBack;
HalUARTOpen (SERIAL_APP_PORT, &uartConfig);
先分析第一句:halUARTCfg_t uartConfig;
typedef struct
{
bool configured;
uint8 baudRate;
bool flowControl;
uint16 flowControlThreshold;
uint8 idleTimeout;
halUARTBufControl_t rx;
halUARTBufControl_t tx;
bool intEnable;
uint32 rxChRvdTime;
halUARTCBack_t callBackFunc;
}halUARTCfg_t;
也就是说uartConfig.callBackFunc也是typedef void (*halUARTCBack_t) (uint8 port, uint8 event);类型的函数指针。
并且SerialApp_CallBack赋值给他uartConfig.callBackFunc,那我们会想到uartConfig.callBackFunc应该会继续把值赋值给dmaCfg.uartCB的
继续分析:
进入HalUARTOpen(uint8 port, halUARTCfg_t *config)--》》HalUARTOpenDMA(config)
发现第一句话:static void HalUARTOpenDMA(halUARTCfg_t *config)
{
dmaCfg.uartCB = config->callBackFunc;
// Only supporting subset of baudrate for code size - other is possible.
这下该清楚了吧,也就是说dmaCfg.uartCB最终调用的是这个函数:
static void SerialApp_CallBack(uint8 port, uint8 event)
{
(void)port;
if ((event & (HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT)) &&
#if SERIAL_APP_LOOPBACK (SerialApp_TxLen < SERIAL_APP_TX_MAX))
#else !SerialApp_TxLen)
#endif
{
SerialApp_Send();
}
}
然后就进入了SerialApp_Send(); 这个函数,首先读DMA,若有数据时进行发送,否则 设置事件
osal_set_event(SerialApp_TaskID, SERIALAPP_SEND_EVT);
继续查询。。。