求教,关于HalUARTPollDMA函数的几个问题

求教,关于HalUARTPollDMA函数的几个问题,第1张

串口数据是由HAL层来负责的,扰山让我们从主循环 (osal_start_system) 的Hal_ProcessPoll函数找下去 ,Hal_ProcessPoll ==>HalUARTPoll ==>HalUARTPollDMA。在这个 HalUARTPollDMA 函数里最后有这样一句话:dmaCfg.uartCB(HAL_UART_DMA-1, evt)对dmaCfg.uartCB 这个函数进行了调用,dmaCfg结构体类型如下:

typedef struct

{

uint16 rxBuf[HAL_UART_DMA_RX_MAX]

rxIdx_t rxHead

rxIdx_t rxTail

uint8 rxTick

uint8 rxShdw

uint8 txBuf[2][HAL_UART_DMA_TX_MAX]

txIdx_t txIdx[2]

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

由上可知,uartCB是一个类型为裤圆halUARTCBack_t的函数指针(回调函数),那这个函数指针在那里赋值的呢?请看下面这条线路。void SerialApp_Init( uint8 task_id )里面有如下语句halUARTCfg_t uartConfig在接下来的给uartConfig这个结构体变量赋值的语句中有如下语句:uartConfig.callBackFunc = SerialApp_CallBack即将uartConfig里的串口回调函数设置为SerialApp_CallBack,然后再通过HalUARTOpen (SERIAL_APP_PORT, uartConfig)这个函数的调用(不再深入进去,有兴趣的同学可以进一步跟进)将uartConfig这个结构体变量的值转化为uartConfig这个结构体变量的值,注意两个结构体变量所属的类型不同,不能直接赋值,需要转化。

这样就保证了,缓纯中SerialApp_CallBack函数每次循环中被调用一次,SerialApp_CallBack( ) ==>SerialApp_Send( ),在SerialApp_Send()函数里会调用HalUARTRead()函数,将 DMA 数据读至数据 buffer 并通过 AF_DataRequest ()函数发送出去,注意:发送出去的信息的 CLUSTERID(信息簇ID)号为 SERIALAPP_CLUSTERID1。

static void SerialApp_Send(void)

{

#if SERIAL_APP_LOOPBACK // 本条件编译为FALSE

if (SerialApp_TxLen <SERIAL_APP_TX_MAX)

{

SerialApp_TxLen += HalUARTRead(SERIAL_APP_PORT, SerialApp_TxBuf+SerialApp_TxLen+1,

SERIAL_APP_TX_MAX-SerialApp_TxLen)

}

if (SerialApp_TxLen)

{

(void)SerialApp_TxAddr

if (HalUARTWrite(SERIAL_APP_PORT, SerialApp_TxBuf+1, SerialApp_TxLen))

{

SerialApp_TxLen = 0

}

else

{

osal_set_event(SerialApp_TaskID, SERIALAPP_SEND_EVT)

}

}

找到问题了 void USART3_IRQHandler(void)

{

HAL_UART_IRQHandler(&huart3)

}

如果在cube中设置了nvic的话这个函好裂答数会在-it.c里面自动写好

如果cube中友慧没有设置nvic的话 这个源饥函数要自己写 才能开启中断


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12509392.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存