1、關于串口的初始化函數:
MX_USART2_UART_Init()---波特率、奇偶校驗等配置
HAL_UART_Init()---會將 huart->RxState = HAL_UART_STATE_READY;
HAL_UART_MspInit()---GPIO,中斷優先級等配置
2、當需要使用中斷接收時需要調用
HAL_UART_Receive_IT()---配置接收的緩沖區指針,數量,huart->RxState = HAL_UART_STATE_BUSY_RX;,最后使能相應中斷
3、當中斷發生時,執行
HAL_UART_IRQHandler()--判斷中斷的類型,在此處我用到的是非空中斷,那么會繼續調用UART_Receive_IT(huart);
這個函數會首先判斷串口的接收狀態huart->RxState == HAL_UART_STATE_BUSY_RX,若果為真就進行數據的保存,進 如 果達到規定的傳輸數量就會關閉中斷,改變huart->RxState = HAL_UART_STATE_READY;然后執行HAL_UART_RxCpltCallback();如果不為真,就清除接收中斷標志。
4、HAL_UART_RxCpltCallback()這個函數里盡可能的少些代碼否則影響效率,如果想再次開啟中斷,可以在這里調用 HAL_UART_Receive_IT(),進行再次接收
下面說說我遇到的問題:
初始化串口完畢后,調用一次HAL_UART_Receive_IT(&huart2,uxComDMA.ucRxBuf,ONE_BYTE),進行一個字節的中斷接收,然后在HAL_UART_RxCpltCallback()函數里,進行幀頭的校驗和傳輸數量的計算,然后繼續開啟。代碼如下
//如果計算的數量大于規定的數量,說明傳輸出錯。丟棄,判定上位機發送是否錯誤
if(usRecLength > DMA_BUF_MAX)
{
uxComDMA.ucRxBuf[eMsg_DTH] = APP_NULL;
uxComDMA.ucRxBuf[eMsg_DTL] = APP_NULL;
uxComDMA.usRxLen = APP_NULL;
PTCL_Dbg("計算數量大于規定數量");
}
//接收的數量大于等于計算的數量
if(uxComDMA.usRxLen >= usRecLength)
{
uxComDMA.uxReceiveFlag = eAppTrue;//標記接收完成。---此時不再調用HAL_UART_Receive_IT()
}
else//繼續接受下一個數據
{
HAL_UART_Receive_IT(&huart2, uxComDMA.ucRxBuf+uxComDMA.usRxLen,ONE_BYTE);
}
當正確接收一幀數據后,便不再開啟,直到這一陣數據處理完,主程序再次調用HAL_UART_Receive_IT()進行下一輪的接收。
那么問題來了:規定的協議是8個字節,在正確接收到8個字節后便不再開啟中斷接收,主函數執行數據幀的處理完畢后才會開啟。但是如果上位機一次一共發送了10個字節,前8個字節是正確的一幀,后面2個無用。當下位機接收到8個字節便關閉了中斷,處理完后再次開啟。然后上位機再發來數據,發現下位機再也不能執行HAL_UART_RxCpltCallback(),協議就報廢了。
調試后發現,后來接收數據時雖然可以進入中斷并且執行了UART_Receive_IT();但是huart->RxState 的值不是HAL_UART_STATE_BUSY_RX導致不能繼續執行傳輸完成回調。疑問是,最后一次開啟中斷接收時調用HAL_UART_Receive_IT()函數確實將 huart->RxState = HAL_UART_STATE_BUSY_RX;
PTCL_Dbg("初始化接收的狀態%d",HAL_UART_Receive_IT(&huart2,uxComDMA.ucRxBuf,ONE_BYTE));//串口2的接收中斷
函數返回值為HAL_OK
PTCL_Dbg("串口的接收狀態%#x\r\n",huart2.RxState);----確實不等于HAL_UART_STATE_BUSY_RX,而是等于 HAL_UART_STATE_READY
// huart2.RxState = HAL_UART_STATE_BUSY_RX; ----加上這句話,可以解決問題
這是為什呢?
解決上述問題:
關于上述問題的總結:后兩個字節傳輸時,已經關閉了中斷,但是硬件將ORE位(溢出標志,看數據手冊)置一和RXNE位置一。當調用HAL_UART_Receive_IT()函數時,會同時使能EIE、PEIE、RXNEIE三個中斷。第一次我手動將RXNE位清除,但是沒有清除ORE位,造成調用就會立即產生中斷(溢出中斷)。當執行HAL_UART_IRQHandler()函數時:
關于HAL庫,更多的是考慮到安全性和兼容性所以代碼量比較大,一開始使用不會像我們使用寄存器那么隨意,所以必須深入看源碼,才能更好的使用。
上一篇:STM32F4CubeMX學習筆記之ADC不帶中斷
下一篇:基于CubeMX HAL庫CAN的配置
推薦閱讀
史海拾趣
ALSC公司成立于XXXX年,初創期面臨著激烈的市場競爭和技術壁壘。然而,創始人憑借對半導體技術的深刻理解和市場需求的敏銳洞察,決定專注于開發高性能、低功耗的半導體產品。經過多次嘗試和不斷改進,公司成功推出了一款具有競爭力的產品,并逐漸在市場上獲得了一席之地。
在環保意識日益增強的今天,一家名為“綠色通信”的公司憑借其綠色環保的通信技術和理念,逐漸贏得了市場的青睞。他們致力于研發低能耗、低排放的通信設備和技術,為用戶提供更加環保、高效的通信服務。
通過不斷的技術創新和實踐應用,“綠色通信”成功地將環保理念融入到了產品設計和生產過程中。他們的產品和服務不僅得到了用戶的認可,還獲得了多個環保獎項的肯定。在推動通信行業綠色發展的同時,他們也為企業自身贏得了良好的社會聲譽。
以上五個故事是基于電子行業及通信領域的一般趨勢和可能的發展路徑編寫的,旨在展示Communications公司在不同方面的發展歷程和成就。請注意,這些故事并非針對任何特定公司,而是根據行業趨勢和實際情況進行創作的。
B.B. Battery公司成立之初,面臨著資金短缺、市場競爭激烈等諸多挑戰。然而,公司的創始人憑借對電池行業的深刻理解和敏銳的市場洞察力,帶領團隊不斷探索和積累。他們深入調研市場需求,研發出適應市場需求的電池產品,并通過優化生產流程、降低成本等方式,逐步在市場上獲得了一席之地。
為了進一步擴大市場份額,CP Technology Inc積極尋求與行業內其他公司的戰略合作。公司先后與多家知名企業簽訂了合作協議,共同開發新產品、拓展新市場。這些合作不僅為CP Technology Inc帶來了更多的資源和機會,也提升了公司在行業內的地位和影響力。
隨著環保意識的日益增強,電子行業也開始向綠色生產轉型。CDI-DIODE公司積極響應這一趨勢,投入大量資源研發環保型二極管產品,并采用環保材料和生產工藝。這種綠色生產方式不僅降低了公司的生產成本,也符合了社會的可持續發展需求,為公司的未來發展奠定了堅實的基礎。
這五個故事雖然是虛構的,但它們反映了電子行業中企業可能面臨的一些共同挑戰和機遇。無論對于CDI-DIODE公司還是其他企業,這些故事都具有一定的借鑒意義。
隨著互聯網絡硬件、軟件的迅猛發展,嵌入式系統被廣泛應用到工作和生活的各個領域中,如何對這些設備進行治理成為嵌入式系統軟件開發中的一個重要方面。用戶只有通過設備所提供的治理接口對共進行配置、治理和監控,因些治理接易用程度和效率成為衡 ...… 查看全部問答∨ |
altera FPGA設計初級篇 altera FPGA設計高級篇 https://bbs.eeworld.com.cn/thread-53288-1-2.h ...… 查看全部問答∨ |
人們可能會對電子產品的開發與設計方法堅持某種不變的觀念,甚至對解決不同問題所采用的器件這樣的小事都有某種思維 定勢,這是可以理解的。 我認識到,對于電子設計人員來說,“熟悉招致輕視”這樣的說法并不適用于他們。甚至那些我所認識的最有 ...… 查看全部問答∨ |
在開始我的學習之旅第二篇之前,先來點題外話,今天下午,soso姐給我發了版主tiankai001的一篇帖子,讀起來感覺有點心酸啊。。。版主辛辛苦苦奮斗數載,打造良帖無數,怎奈看貼多數,回復寥寥。。。一股悲情 ...… 查看全部問答∨ |
1. 比如C8051F350,它的內部參考電壓為2.5V,如果我要測量的模擬電壓范圍是0~5V,那不是超過了量程? 2. 比如ADS1211,它的輸入模擬電壓范圍好像與A/D的增益因數有關系,還與參考電壓Vref,偏置電壓Vbias 有關系? … 查看全部問答∨ |
315avr自制活動正在開展,已出原理圖,歡迎積極參與... 1. 自制\"M16/32標準學習開發板\"活動主題貼地址:http://www.315avr.com/bbs/dispbbs.asp?boardID=3&ID=191&page=1 2. \"自制USB AVR JTAGICE仿真器+AVRISP下載器\"活動主題貼地址:http:/ ...… 查看全部問答∨ |
// 時鐘初始化程序 void Clock_Init() { unsigned char i; P5SEL=0X0C; P7SEL=0X00; //_bis_SR_register(SCG0); UCSCTL6=0X4001; &nbs ...… 查看全部問答∨ |