在RT-Thread中使用stm32的hal庫驅動串口UART

前言

之前一直在Linux下面嘗試進行部署了RT-Thread的stm32的開發(fā),這種方式確實是可行的,但是也會帶來種種不便之處。使用VSCode + Scons + openocd 進行編輯、編譯鏈接、燒錄確實是可以進行開發(fā),但是若要進行調試則沒有這種環(huán)境的解決方案,只得在eclipse中進行調試。而將RT-Thread改成eclipse的方案雖然可行,但是這樣還不如直接在windows下面采用keil 5 來進行開發(fā)。

由于stm32f103板載flash過小,棧也十分的小,于是換成stm32f411。板子來自于微雪科技的XNUCLEO,和STM官方NUCLEO板子是兼容的。

安裝Keil 5.23

由于我首先安裝了Keil 5.11,然后附帶的破解器破解了,之后卸載再安裝了Keil 5.23,直接顯示已經破解成功。破解器仍然是多年前就流行的注冊碼生成器。之所以使用Keil 5.23版本,是因為RT-Thread工程只能使用這個版本進行打開。

使用pack installer安裝庫

只有安裝了Keil::STM32F4xx_DFP才能打開RT-Thread的bps分支下的nucleo工程。

安裝STM32CubeMX

通過STM32CubeMX,我們可以方便的通過鼠標點擊生成初始化代碼。但是調用函數還是得我們自己寫,不如NPX的PE方便。

安裝ST-Link驅動

微雪科技售賣100塊錢的板子還附帶了ST-Link調試器,那我們就是用ST-Link來進行調試吧。

下載nucleo工程

打開rt-thread-master\bsp\stm32f411-nucleo下的Keil 5工程,嘗試編譯,通過后,簡單設置工程的debug,使用ST-Link來進行調試,然后將程序下載到板子里面。雖然程序下進去了,但是沒有任何效果,因為主函數是空的。

我們在main函數中加入如下代碼:

int main(void)
{
  /* user app entry */
    MX_GPIO_Init();
    while(1){
        rt_thread_delay(5);
        HAL_GPIO_WritePin (GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
        rt_thread_delay(5);
        HAL_GPIO_WritePin (GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
    }
}

并加上LED的初始化函數

static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC5 */
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

這樣我們就可以看到板載的LED4燈亮起來了,并且在閃爍。

這些初始化代碼是從哪來的呢?主函數中的代碼,是從網上找的,很簡單的操作GPIO的函數,而MX_GPIO_Init這段代碼,則來自于STM32CubeMX自動生成的代碼。下面會講如何通過STM32CubeMX生成初始化UART代碼。

使用STM32CubeMX生成UART初始化代碼

  • 首先我們建立一個工程,并設置好芯片型號,下面是演示
2017-04-06_16-41-06.gif
  • 然后設置串口引腳。
    由于RT-Thread已經初始化了串口1,我以我們不能使用這個。我們可以使用UART6。
2017-04-06_16-57-29.gif
  • 打開工程,將代碼偷走,藍色部分就是我們要拿走的代碼
2017-04-06_17-01-11.gif
  • 移植代碼
    在void HAL_UART_MspInit(UART_HandleTypeDef *huart)中,添加USART6的代碼:
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    GPIO_InitTypeDef  GPIO_InitStruct;
    if (huart->Instance == USART2)
    {
        /*##-1- Enable peripherals and GPIO Clocks #################################*/
        /* Enable GPIO TX/RX clock */
        USARTx_TX_GPIO_CLK_ENABLE();
        USARTx_RX_GPIO_CLK_ENABLE();

        /* Enable USARTx clock */
        USARTx_CLK_ENABLE(); 

        /*##-2- Configure peripheral GPIO ##########################################*/  
        /* UART TX GPIO pin configuration  */
        GPIO_InitStruct.Pin       = USARTx_TX_PIN;
        GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull      = GPIO_PULLUP;
        GPIO_InitStruct.Speed     = GPIO_SPEED_FAST;
        GPIO_InitStruct.Alternate = USARTx_TX_AF;

        HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);
        
        /* UART RX GPIO pin configuration  */
        GPIO_InitStruct.Pin = USARTx_RX_PIN;
        GPIO_InitStruct.Alternate = USARTx_RX_AF;
        
        HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);
        
        HAL_NVIC_SetPriority(USART2_IRQn, 0, 1);
        HAL_NVIC_EnableIRQ(USART2_IRQn);
    }
        if (huart->Instance == USART6)
        {
        /* USER CODE BEGIN USART6_MspInit 0 */

        /* USER CODE END USART6_MspInit 0 */
            /* Peripheral clock enable */
            __HAL_RCC_USART6_CLK_ENABLE();
        
            /**USART6 GPIO Configuration    
            PC6     ------> USART6_TX
            PC7     ------> USART6_RX 
            */
            GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
            GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
            GPIO_InitStruct.Pull = GPIO_PULLUP;
            GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
            GPIO_InitStruct.Alternate = GPIO_AF8_USART6;
            HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

            /* Peripheral interrupt init */
            HAL_NVIC_SetPriority(USART6_IRQn, 0, 0);
            HAL_NVIC_EnableIRQ(USART6_IRQn);
        /* USER CODE BEGIN USART6_MspInit 1 */

        /* USER CODE END USART6_MspInit 1 */
        }
}

在main.c文件中,添加MX_USART6_UART_Init();函數內容,并在主函數中,調用MX_USART6_UART_Init();進行初始化。

之后,在main()函數中進行測試:

        uint8_t TxData[10]= "01234abcde";
        HAL_UART_Transmit(&huart6,TxData,10,0xf);

我們將微雪的板子上的JP4跳帽接在右側,這樣,USB TO UART就能使用PC6、PC7作為串口接口了。然后,接上USB接口到PC機,我們可以在XSHELL之類的串口終端查看PC接受到的字符串。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內容