❶ 關於HAL庫中用DMA方式使用串口的問題,串口中斷用開嗎
小明是一個搬運工,負責將貨物從一個地方搬到另一個地方。有一天老闆交給他任務內,讓他從輪船容港口將十個箱子的貨物搬運到倉庫里固定的位置,然後老闆就去處理別的事情了。小明來到港口找到箱子存放的位置然後開始搬運。小明力氣有限因此每次只能搬運一個箱子到倉庫里。小明不斷的搬運貨物直到10個箱子全部運到倉庫里,然後小明報告了老闆已經完成任務。老闆暫停了手頭的工作來到倉庫,取走了箱子里的東西。
通常情況下,DMA會檢測UART的接收緩沖區,當數據到來時會自動將數據讀取出來,存放到到指定的地址(小明不斷的從港口搬運數據到倉庫)當接收到一定數量的數據後會發出一個信號用於通知CPU,表明數據接收完畢(小明搬完10個箱子後報告老闆),這個信號可以是一個狀態位或者一個中斷標志位,這樣CPU知道數據接收完畢後進行下一步處理(老闆來到倉庫取走箱子里的東西)。
❷ 有用過HAL庫的串口中斷接收的朋友嗎
從PC發來的字元串是連續發送嗎?是的話,你的接收程序有問題的,中斷的時間回那麼短,9600的波特率接答收一個字元的時間時1ms左右,而你程序里竟然有一個10ms的延時,想想會丟失多少個數據,中斷函數裡面一般都不要延時的,除非對程序結構流程非常了解。
❸ STM32HAL輪詢模式串口接收函數超時等待問題
是的,HAL裡面這個HAL_UART_Receive()函數已經明明白白地寫了,它是阻塞式查詢工作方式,只內要標志不置位或者容超時不結束,就乾等到天荒地老。
如果你不需要阻塞式查詢工作方式,就應當選用中斷工作方式,改用 HAL_UART_Receive_IT()函數並配置對應的NVIC模塊、調用對應的中斷服務函數並且鉤上對應的回調。
❹ 求助,HAL庫函數 串口中斷接收,急急急,加入懸賞
HAL_UART_Receive_IT 不要放在HAL_UART_TxCpltCallback 里,
放在主函數里,在初始化的時候調用,
總之要在HAL_UART_Transmit_IT之前。
❺ CC2530的雙串口在協議棧中怎麼配置
一個口使用DMA方式,另一個口使用ISR方式,配置好初始化,修改hal_board_cfg.h內關於DMA和ISR的相關設置,修改代碼如下
#if HAL_UART
// Always prefer to use DMA over ISR.
#if HAL_DMA
#ifndef HAL_UART_DMA
#if (defined ZAPP_P1) || (defined ZTOOL_P1)
#define HAL_UART_DMA 1
#elif (defined ZAPP_P2) || (defined ZTOOL_P2)
#define HAL_UART_DMA 2
#else
#define HAL_UART_DMA 1
#endif
#endif
#define HAL_UART_ISR 2
#else
#ifndef HAL_UART_ISR
#if (defined ZAPP_P1) || (defined ZTOOL_P1)
#define HAL_UART_ISR 1
#elif (defined ZAPP_P2) || (defined ZTOOL_P2)
#define HAL_UART_ISR 2
#else
#define HAL_UART_ISR 1
#endif
#endif
#define HAL_UART_DMA 0
#endif
這樣就選擇了port0 採用DMA方式,port1採用ISR方式。
接下來是在應用文件中初始化兩個串口。
//==========================================================================
// 串口0初始化函數
//==========================================================================
static void FS_Uart_Init(void)
{
halUARTCfg_t uartConfig;
uartConfig.configured = TRUE; // 2x30 don't care - see uart driver.
uartConfig.baudRate = HAL_UART_BR_115200;
uartConfig.flowControl = FALSE;
uartConfig.flowControlThreshold = 256; // 2x30 don't care - see uart driver.
uartConfig.rx.maxBufSize = 70; // 2x30 don't care - see uart driver.
uartConfig.tx.maxBufSize = 256; // 2x30 don't care - see uart driver.
uartConfig.idleTimeout = 6; // 2x30 don't care - see uart driver.
uartConfig.intEnable = TRUE; // 2x30 don't care - see uart driver.
uartConfig.callBackFunc = FS_Uart_CallBack;
HalUARTOpen (HAL_UART_PORT_0, &uartConfig);
}
//==========================================================================
// 串口1初始化函數
//==========================================================================
static void FS_Uart1_Init(void)
{
halUARTCfg_t uartConfig;
uartConfig.configured = TRUE; // 2x30 don't care - see uart driver.
uartConfig.baudRate = HAL_UART_BR_115200;
uartConfig.flowControl = FALSE;
uartConfig.flowControlThreshold = 32; // 2x30 don't care - see uart driver.
uartConfig.rx.maxBufSize = 32; // 2x30 don't care - see uart driver.
uartConfig.tx.maxBufSize = 32; // 2x30 don't care - see uart driver.
uartConfig.idleTimeout = 6; // 2x30 don't care - see uart driver.
uartConfig.intEnable = TRUE; // 2x30 don't care - see uart driver.
uartConfig.callBackFunc = FS_Uart_CallBack; 指定串口回調函數
HalUARTOpen (HAL_UART_PORT_1, &uartConfig);
}
串口函數的讀出
從以上初始化代碼中很明顯的看到,兩個port口採用了兩個初始化函數但去採用了同一個回調函數,實際上也只能採用這一個回調函數
串口的讀出:
//====================================================================
// @brief 串口回調函數
//====================================================================
static void FS_Uart_CallBack(uint8 port,uint8 event)
{
int i ;
//(port == HAL_UART_PORT_0 )&&
if(( event & ( HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT ) ) )
{
if(port == HAL_UART_PORT_0)
{
HalUARTRead(HAL_UART_PORT_0, &i8_uart_buf[count], len); //讀取串口數據到buf指向的內存
//此處添加數據解析函數
}
else//port == HAL_UART_PORT_1
{
i8_uart1_len = Hal_UART_RxBufLen(HAL_UART_PORT_1); //取出本次接收到的字元長度
HalUARTRead(HAL_UART_PORT_1, i8_uart1_buf, i8_uart1_len);
osal_set_event( GenericApp_TaskID, GENERICAPP_FS_UART1_CALLBACK );
}
}
}
❻ 有用過HAL庫的串口中斷接收的朋友嗎
UART1_Init((u32)19200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);//19200,8位,校驗 UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);//啟接收版斷權 UART1_ITConfig(UART1_IT_TXE, DISABLE); UART1_ClearFlag(UART1_FLAG_RXNE); UART1_Cmd(ENABLE);
❼ 有基於HAL庫的USB虛擬串口+U盤的復合設備代碼嗎
U盤在出來現問題前是因為前自期的操作導致的,有可能是數據丟失了,不能正常使用,只要物理沒有被損壞,桌面右下角還能看到USB設備符號,找不到盤符等問題。我倒有一個法可以解決。就是給U盤重新設置驅動,(注意:這樣的操作只能使U盤能夠正常使用,之前所放的文件數據是無法找回的)可以嘗試用磁碟驅動做為U盤驅動,這樣就能正常看到U盤盤符,但是還是不夠使用的,現在的U盤顯示應該容量為0,不能儲存和使用,然後找一個和主控型號一樣的量產工具進行再次量產,量產成功就OK,一切正常能使用,量產失敗,那就再找量產工具吧,和主控型號差不遠的量產工具也是可以的,只要能量產成功就可以了。因為之前我有個U盤也是被我非法操作把U盤數據丟失了,拿給專業的維修點進行維修連他們都說沒有其他法維修,我就自己嘗試著修復「不能維修的U盤」結果為了修復這個U盤,電腦系統被重裝過好多次,因為給U盤設置驅動需要一個一個的試,導致了電腦藍屏,死機等問題。試過之後只有磁碟驅動符合U盤做驅動,我狂汗~!然後我就按照以上的方法把我的哪個U盤修復了,用到現在一點問題都沒有,這是我自己親身體驗過來的實際操作現在拿來和大家分享,希望對大家有幫助。
❽ 使用stm32cubemx的hal庫來建立串口收發,發生了詭異的數據傳輸錯誤
那那就重新啟動機器一次,也有可能是越獄吧,你的你的電腦需要越獄才能保證數據傳輸不錯誤,用上越獄軟體,我給忘了有可能是手機中病毒了,需要越獄越獄刪除一些病毒文件,然後就會好了。就
❾ 關於hal庫串口中斷接收哪些路子
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)函數的來功能是設置源接收中斷的參數,以及使能接收中斷。查看一下它的代碼就明白了。
函數的第一個參數是串口實例句柄,第二個參數是用於存儲接收數據的指針,第三個則是接收多少個數據之後調用接收完成回調函數HAL_UART_RxCpltCallbac
❿ hal庫 msp前綴是什麼意思
MCU Specific Package 單片機的具體方案
MSP是指和MCU相關的初始化,舉個例子回就可以答理解:
比如串口的初始化
1、我們要初始化和MCU無關的東西:例如串口協議,其中包括波特率,奇偶校驗,停止位等等,這些設置和使用什麼樣的MCU沒有任何關系,可以使用F1的MCU,也可以是F2...F4,甚至是PC上的串口。所以就把串口抽像成為一個「串口」。
2、有了抽像的串口,這個「串口」就要在MCU上進行承載,用STM32進行承載,PA9做為發送,PA10做為接收.MSP就是要初始化PA9,PA10。配置這兩個引解
所以HAL驅動方式的初始化流程就是:HAL_USART_Init() ------>HAL_USART_MSP_Init() 先初始化協議,再初始化MCU的引角。在STM32的HAL驅動中MSP_Init()是做為回調,包含在PPP_Init()中的。