天天看點

STM32_HAL庫學習(1)

1、如何在使用STM32CubeMX修改配置時不修改自己的檔案?

首先使用keil或其他編輯工具打開工程,在使用CubeMX修改配置以後,生成Code時不要再打開工程,在剛開始打開的那個工程中會選擇是否導入修改後的檔案,對源檔案和頭檔案都選擇是,但工程檔案選擇否。OK

2、使用JLink或STLink下載下傳的配置可能問題?

CubeMX預設配置過工程檔案中有關下載下傳的參數,在下載下傳不成功時,要考慮是否是Debug内參數設定不對應,或者是CubeMX預設設定了下載下傳接口軟體配置。比如說,在使用CubeMX修改工程時,每次修改工程檔案都會還原成預設下載下傳工具,需要重複修改,是以不修改工程檔案則不會出現這個現象。預設有時JLink使用5線制SW,就需要在CubeMX中修改為需要的接口類型。OK

3、延時函數?

想要使用systick做延時,在HAL庫中可以直接調用__weak void HAL_Delay(__IO uint32_t Delay)。該函數基準為1ms,為弱函數,也可以使用者重新編寫。但滿足基本需要。OK

4、使用DMA發送序列槽資料,如何判斷資料是否發送完成?

快速發送資料時,前一串資料太長,還未發送完成,又将資料放到發送緩沖區,會導緻資料過快覆寫。使用判忙,則可以判斷是否發送完成。在字元串方式時,使用string.h庫檔案,字元串最後使用\0結尾是個不錯的嘗試。但使用memcpy更利于HEX處理。OK

 while(HAL_UART_STATE_BUSY_TX == (HAL_UART_GetState(&huart1) & HAL_UART_STATE_BUSY_TX));//發送前判忙

 memcpy(UART1_Txbuff, "12345\r\n", 7);

HAL_UART_Transmit_DMA(&huart1, (uint8_t *)UART1_Txbuff, 7);

5、DMA接收資料,IDLE和DMA需要自己在配置?

在CubeMX中似乎沒有找到如何直接配置這兩個選項。在程式中要在自定義代碼範圍内寫以下語句:

    __HAL_UART_CLEAR_IDLEFLAG(&huart1);                             //清除中斷标志

    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);          //使能IDLE中斷

    HAL_UART_Receive_DMA(&huart1, UART1_Rxbuff, UART1_RX_MAX);

在序列槽初始化時添加,如果沒有第一句,啟動接收DMA後會接入一次中斷。在接收中斷中回調以下函數。

void UART_IDLE_Callback(UART_HandleTypeDef *huart)

{

  uint16_t tmp1;

    if(__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET)

  {

        __HAL_UART_CLEAR_IDLEFLAG(huart);//清除标志位

        HAL_UART_DMAStop(huart); //

        if(huart->Instance == USART1)

    {

            tmp1 = UART1_RX_MAX - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 擷取DMA中傳輸的資料個數

            if(tmp1 != 0)

            {

                while(HAL_UART_STATE_BUSY_TX == (HAL_UART_GetState(&huart1) & HAL_UART_STATE_BUSY_TX));

                memcpy(UART1_Txbuff, UART1_Rxbuff, tmp1);

                HAL_UART_Transmit_DMA(&huart1, (uint8_t *)UART1_Txbuff, tmp1);

            }

            HAL_UART_Receive_DMA(&huart1, UART1_Rxbuff, UART1_RX_MAX);//打開DMA接收,資料存入rx_buffer數組中。    

    }

  }

}

OK