一、引言
在上一篇文章中,曾經聊過為啥要研究keil RTE,因外想用用keil內置的RTX作業系統,在研究keil RTE中,沒有找到對應串口的例程,更奇怪的是,選擇USART庫的時候依賴庫竟然有DMA,記得正點原子的STM32串口例程里面沒有用到DMA,感謝社會,有萬能的度娘,由HAL庫找到CubeMX,下載,安裝,
二、STM32CubeMX 創建串口專案
(1)選擇和我手頭板子一致的芯片STM32F407ZG ,雙擊進入下一步
(2)connectivity部分USART1, MODE選中Asynchronous,Configuration使能全域中斷,其他選擇默認設定


(3)System Core部分需要設定較多
(3.1)sys保持默認數值

(3.2)RCC 部分HSE 選擇外部晶振

(3.3)NVIC的NVIC ,選擇中斷群組2bit,串口為2,3,systick為3,3;代碼生成只選擇systick和usart1


(4)clock設定部分,
讓系統主頻為168M,外設時鐘變成最大,沒有警告(劃線為需要修改的部分,主頻要和你的硬體一致),

(5)Project manage部分,
根據你的編譯器選擇和其他一些設定,完成后點左上角GENERATE CODE


三、代碼分析和簡單輸出
(1)改錯?
打開代碼發現中斷分組不對,改正(不能完全靠代碼生成工具):

改正,保持和設定一致,
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
對HAL_InitTick函式,改正如下:
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 3U);
(2)簡單串口輸出(阻塞發送和接收)
在while(1)部分添加下屬代碼:
while (1)
{
/* USER CODE END WHILE */
HAL_Delay(5000);
HAL_UART_Transmit(&huart1,"hello\r\n",sizeof("hello\r\n"),100);//阻塞發送
/* USER CODE BEGIN 3 */
}
系統輸出如下:

從上面可以看出,該函式可以正常輸出ASCII為0的字符,
該函式為阻塞發送函式,其中100為100ms,類似的阻塞接收并回傳的函式如下:
if(HAL_UART_Receive(&huart1,buff,10,1000)==HAL_OK) //阻塞接收,10為接收的字符數量
HAL_UART_Transmit(&huart1,buff,10,100);
其中buff為接識訓沖區,可定義如下:

(3)無阻塞發送和接收,
無阻塞發送函式(中斷發送)比較簡單,直接呼叫下屬函式即可:
HAL_UART_Transmit_IT(huart,Txbuff,sizeof(Txbuff));
對于無阻塞接收(中斷接收)比較麻煩,
首先需要重新實作接識訓呼函式HAL_UART_RxCpltCallback,簡單的示例如下:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance ==USART1)
{
flag=HAL_UART_Receive_IT(&huart1,Rxbuff,sizeof(Rxbuff));
}
}
flag為標志位,可通過此標志位判斷系統是否完成接收,需要注意的是,此函式內部不能放阻塞發送函式,否則會造成系統卡死,
(4)對比整點原子的例程
回想正點原子的串口例程,好像是中斷接收,阻塞發送,但在CubeMx當中并沒有看到這部分代碼,研究起見,在串口中斷處理函式中加入一個全域遍歷,每進入1次加1,資料接收成功后輸出此全域變數數值,并對接收字串輸出回顯(輸出均為非中斷形式),結果如下:

從上面可以看出,i的數值大的離譜,即發送,接收等幾乎所有的串口事件都會觸發串口中斷,
資本家果然心懷不良,想讓我換更快更貴的芯片,要不把CubeMX卸了???
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272559.html
標籤:其他
上一篇:ROS機器人小車底盤DIY有何難?不枉做一個程式猿,軀殼碼上有功能
下一篇:EC11旋轉編碼器驅動程式
