问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-22 08:34

我来回答

1个回答

热心网友 时间:2022-06-18 17:51

串口数据是由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);
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何通过官网查询车次信息? 华为c8812屏幕上一直出现一个黑框,求大家帮帮忙,看看怎么解决 华为8812手机屏幕出现这种情况,屏幕上有英文,乱七八糟,怎么办,怎么也... 华为C8812点击屏幕的时候屏幕为什么会有红框?求解答 我的手机型号是华为c8812,才用了几天,感觉屏幕好像下陷了点点,点上去... 华为c8812e屏手写时出现十字坐标右侧有许多英文字母时不时跳岀来这是... 华为c8812e屏幕上方出现一行数据而且触摸时有条纹状出现是怎么回事? 为什么在excel表格输入函数时不计算结果? 表格单元格为什么求不出总和? 健身教练行业比较有用的证书是哪个? 如何解决奇偶校验的异步串口通信问题 3dmax的删除快捷键是什么 关于stm32通信中断设置:HAL_NVIC_SetPendingIRQ报错 关于HAL库中用DMA方式使用串口的问题,串口中断用开吗 zstack中怎样通过串口接收数据 zigbee里面的一个函数HAL_UART_ASSERT( expr )是什... 关于HAL库串口中断接收哪些路子 第二弹 没有DMA的单片机怎么解决串口占用时间问题 STM32接受激光雷达怎么配置 关于hal库串口中断接收哪些路子 求助,HAL库函数 串口中断接收,急急急,加入悬赏 stm32 uart停止释放 使用stm32cubemx的hal库来建立串口收发,发生了诡... STM32HAL轮询模式串口接收函数超时等待问题? 汽车故障指示灯图标有哪些 汽车报警灯,这是什么故障 车辆各种故障灯解读 色彩知识的常识有那些? 印刷书籍用什么纸好 色彩的名称有那些?是七彩吗? hal库 msp前缀是什么意思 如何建立cc2430串口与上位机通信的任务 zigbee串口通信函数 CC2530串口设置2400波特率乱码的问题 从串口接收一个字符程序中UART3_RX_BUFFER_MASK是... void HalUARTIsrDMA这个函数在什么情况下执行 骨灰盒什么木的好 一网红广场上光脚爬行直播,“网红”行为是否应该规范? i59400f和i57700和i57500哪个更强 i57700原装散热怎么拆 商场回应路人经过时头发竖起来,你会选择去体验吗? i5 7500和i7 7700CPU和b250主板都不支持win7 64位... 实木骨灰盒选什么材料好?有什么优点 天津水上公园网红广场舞几点到几点呢? 华擎ab350m-hdv可以用i5 7700kcpu吗 网红商场如何前期宣传 长期炒股的人,财务自由概率有多大? 网红商场歌林公园的环境怎么样? i58400和i77700处理器哪个性能更好,为啥?价格差多少 在概率中自由度是什么意思啊