https://www.cnblogs.com/Mysterious/p/4804188.html
STM32L0 HALライブラリUARTシリアルの読み書き機能
シリアル伝送機能:
; uint8_t [10] = "01234abcde" Tx-データ HAL_UART_Transmit(&huart2、Tx-データ、10,0xffff); // Tx-データを介してコンテンツを送信するには長さ10をUART2、タイムアウトが最大時間0xFFFFであります
シリアル受信機能1:
値= uint8_t「F.」; HAL_UART_Receive(&huart2、(uint8_t *)&値、1,1000); //ステートメント1000ミリ秒に滞在したデータのバイトを受け取るために待って、データが値に格納
シリアル受信機能2:
HAL_UART_Receive_IT(&huart2は、(uint8_t *)&値、1); //プログラムは、この声明の中で滞在しないだろう、直接続く受信データが値に格納されて中断しますが、この文は、シリアルポートの割り込み後に有効にすることができます。だから、サービスを中断したり、コールバック関数を再度有効に機能するために
シリアル受信機能3:
もし(HAL_UART_Receive_IT(&huart2、( uint8_t *)&値は、1)!= HAL_OKは){// これはしばらく主な機能(1)上の書き込みです。割り込みプログラムが受信を開始するために開始される HAL_UART_Transmit(&huart2、(uint8_t *)& "エラーの\ R&LT \ N-"、7,10)を、 (1)一方; }
HAL_UART_RxCpltCallback(UART_HandleTypeDef * UartHandle)無効 { HAL_UART_Transmit(&huart2、(uint8_t *)とを"\ R&LT \ ninto HAL_UART_RxCpltCallback \ R&LT \ N-"、32,0xffff); //検証は、機能入力 HAL_UART_Transmit(&huart2、(uint8_t * )&値、1,0xffff); //データが出てシリアルを介して受信した送信 HAL_UART_Receive_IT(&huart2、(uint8_t * )&値、1); //は、 シリアル割込みを再開します }
シリアルDMA転送
そうなるように設定TXのDMA
Tx-データuint8_t [] = { "HelloWorldの\ R&LT \ N-"}; HAL_UART_Transmit_DMA(&huart2、Tx-データ、はsizeof(Tx-データ)); //データをDMAによって送信することができます
DMA受信
IF(!HAL_UART_Receive_DMA(&huart2、 (uint8_t *)RXDATA、はsizeof(RXDATA)-1)= HAL_OK)//メイン関数DMA受信開始前(1)、一方 { ばerror_handlerを(); }
シリアルコールバック関数:
HAL_UART_RxCpltCallbackボイド(* UART_HandleTypeDef UartHandle){ uint8_t TEMPは、[] = { "\のR&LT \ニンコールバック\ R&LT \ N-"}; HAL_UART_Transmit_DMA(&huart2、TEMP、はsizeof(TEMP)-1); //データがDMAによって送信することができます HAL_UART_Receive_DMA(&huart2、(uint8_t * )RXDATA、はsizeof(RXDATA)-1); // 再使用可能な受信器 }
(1)連続して出力値RXDATAながら主な機能
HAL_UART_Transmit_DMA(&huart2、RXDATA、はsizeof(RXDATA)-1); //データをDMAによって送信することができます
https://www.cnblogs.com/UnfriendlyARM/p/10321838.html
ベースのHALライブラリ - STM32シリアルポートの割り込みを受け取ります
EDITORIAL
1.UART関連するヘッダファイル参照エラー
私は直接MDK開発していますので、CubeMXを使用するので、いくつかの初期化は手動で必要としませんでした。UART関連するヘッダファイルを参照する場合、以下に示すように、マクロの定義に関連する「stm32l4xx_hal_conf.h」ドキュメントは、コメントアウト覚えています:2.文字列を受信する方法(複数のエントリは、割り込み)
文字列の受信主に二つの方法がありますが、一方が他方を変換するコールバック関数を受信して、割り込み機能を変換することです。これらの2つの方法に対処する前に、我々は"HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef * huart、機能を導入する必要が uint8_t * pDataを、uint16_tサイズ)"。アクション機能は、ユーザ定義のバッファ(すなわち、パラメータpDataを)は、(パラメータサイズによって決定される)文字の特定の数を受け入れるバッファに格納されます。それと同時に、また、つまり、各受信サイズの文字がコールバック関数を入力するには、コールバック関数を入力する周波数パラメータのサイズを決定します。サイズだけでコールバック関数の周波数を入力することを決定し、受信割り込み頻度に影響を与えることができない、いくらサイズ、完全な文字を受け、それぞれが受信割り込みを入力しないだろう、注意すべきです。
方法1:コールバック関数の変換
メインループに入ることHAL_UART_Receive_IT一度関数を呼び出す前に、第1の位置①、getBufferバッファとしてメイン関数に文字配列[]を定義し、サイズパラメータ10が設定されています。つまり、各コールバック関数を入力するには、10個の文字を受け、あります。②登録割り込み機能
ボイドUSART1_IRQHandler 1(ボイド) 2 { 3 HAL_UART_IRQHandler(&UartHandle); //この関数は、割り込みフラグをクリアするには、キャンセル、および間接的にコールバック関数を呼び出すインタラプトイネーブル 4}
③ファイル「stm32l4xx_hal_uart.h」で、私たちは、シリアルの定義はコールバック関数を受け取る見ることができます。そして一般的には同じ一般的な機能:「_weak」次のような特徴を持っているキーワード定義関数を使用します。同じ名前のが、__weakない関数が定義されているがあった場合でも、この機能に対するすべての呼び出しは(その__weakなし)、後者を指しています。つまり、コールバック関数のSTの関係者は私たち自身を書き換える必要があります。
1 / ** 受信転送完了コールバック@brief 2 *。 3 * @paramのhuartのUARTハンドル。 4 * @retvalなし 5 * / 6 __weak空隙HAL_UART_RxCpltCallback(UART_HandleTypeDef * huart) 7 { 8 / *未使用の引数を防止(S)コンパイル警告* / 9未使用(huart)。 10 11 / *注:コールバックが必要な場合、この機能は、変更するべきではありません HAL_UART_RxCpltCallbackは、ユーザーのファイルに実装することができます12。 13 * / 14}
私たちは、主な機能にあるファイルにコールバック関数を書き換えます:
1 myBufferは[] = "私はuint8_tあなたのメッセージを得ている:"; // ユーザーのメッセージ 2 = []入力uint8_tを"\ rは\ n"は; // キャリッジリターン改行 getBuffer uint8_t 3は、[100]; //ユーザー定義しますバッファ 4 HAL_UART_RxCpltCallbackボイド(* UART_HandleTypeDef UartHandle) 5 { 6つつ。(HAL_UART_Transmit(UartHandle、(uint8_t *)myBuffer、COUNTOF(myBuffer)、5000)= HAL_OK!); //文字列を送信し、ユーザがプロンプト (7しばらく!HAL_UART_Transmit(UartHandle、(uint8_t * )getBuffer、10、5000)= HAL_OK); // バッファにユーザー定義のデータを送信する 8中(HAL_UART_Transmit(UartHandle、( uint8_t *)、入力しCOUNTOF(入力)、5000) != HAL_OK); //キャリッジリターンライン送っ 9}
アクションコードは、上記マイクロコントローラにユーザデータを送信することであり、次いで、ユーザに返します。図の業績は次のとおりです。
私たちは、シリアルアシスタントにマイクロコントローラ10に戻り、ユーザは、マイクロコントローラに10個の文字を送信することを、このデータを見ることができます。しかし、我々は再びマイクロコントローラにデータを送信する際のプログラムのみ、時間をかけて達成することができ、マイクロコントローラは、データを返すなくなりました。これは、我々は、割り込み関数内でキャンセルしたため、割り込みが閉じられている割り込みを入力した後で、その結果、割り込みイネーブル、現象が再び中断入力することはできませんです。複数のデータのリターンを達成するために、我々は、割り込みハンドラ内のコードの行を追加します:
1空隙USART1_IRQHandler(ボイド) 2 { 3 HAL_UART_IRQHandler(&UartHandle); //この関数は割り込み可能と間接的コールバック関数を呼び出しキャンセル、割り込みフラグをクリアする 4 HAL_UART_Receive_IT(&UartHandle、(uint8_t *)&値を、1); // 追加コードの行 5}
これは、以下に示すように、複数のデータは、新しい実行結果を返却できます:
目に見えるだけでなく、割り込み機能は、エネルギーの役割をHAL_UART_Receive_IT。私たちは、この機能はHAL_UART_Receive_IT機能で見つけることができます達成します。
方法2:割り込みハンドラの変換
呼が主機能HAL_UART_Receive_ITにおける主な機能の前のループに入る場合、文字値はバッファとして定義されている①まず、サイズパラメータが1に設定されています。つまり、各コールバック関数を入力し、文字を受け、あります。コールバック関数で割り込みハンドラの周波数と同じ周波数に入るようにします。このように、我々は直接受信データを処理するための機能を中断することができます。②登録割り込み機能
1 uint8_t myBuffer [] = "私はあなたのメッセージを得ているしました:"; ; getBuffer [10] uint8_t 2 。入力して[] = "\ R&LT \ N-" uint8_t 3; 4ボイドUSARTx_IRQHandler(空隙) 5 { 6 HAL_UART_IRQHandler(&UartHandle); / /この機能を有効にし、間接的にコールバック関数で割り込みをキャンセル、割り込みフラグをクリアします 7。 8 getBuffer [countOfGetBuffer ++] =値;。 。9 IF(countOfGetBufferの== 10) 10 { 11ながら(HAL_UART_Transmit(&UartHandle、(uint8_t *)myBuffer、 !COUNTOF(myBuffer)、5000)= HAL_OK); !12はしばらく(HAL_UART_Transmit(&UartHandle、(uint8_t *)getBuffer、countOfGetBuffer、5000)= HAL_OK)であり、 13はしばらくの間です(HAL_UART_Transmit(&UartHandle、(uint8_t *)を入力し、COUNTOFは(入力します!)、5000)= HAL_OK); 14 countOfGetBuffer = 0; 15} 16 HAL_UART_Receive_IT(&UartHandle、(uint8_t *)&値、1); //は、 受信割り込み文字を受信することになっているが、あなたがこのコード行を追加する必要があり、または文字のみを受け取ることができますので、すべての時間を入力しますが、文字列全体受けることができない } 17
10次を調製するために再び空にしながら、各文字上記アクション・コードがユーザから受信され、バッファに格納されたユーザ定義の順番は、数10に達し、バッファ内のすべてのデータは、ユーザに返されます文字を受けます。図の業績は次のとおりです。
最後に書かれました
この記事を読んだ後、あなたはコールバック関数の間の関係についての質問を持っており、割り込みハンドラがあります。これは、それぞれの文字を受信完了するために、MCUである事実、それは割り込みハンドラを入力して、割り込みハンドラなり、私たちは「無効HAL_UART_IRQHandler(UART_HandleTypeDef * huart)」関数を呼び出し、関数は、間接的にコールバック関数を呼び出しますそのコールバック関数は間接的に呼び出さ割り込みハンドラによって呼び出されます。サイズ10あれば、サイズが1である場合、関数は「HAL_UART_Receive_IT(UART_HandleTypeDef * huart、uint8_t * pDataを、uint16_tサイズ)」は、割り込みハンドラの周波数を決定するコールバック関数を呼び出す、各割り込みハンドラを入力し、コールバック関数を呼び出し、その後、割り込みハンドラへの10回に1回はコールバック関数を呼び出します。方法2は、標準ライブラリの割り込み思考プロセスデータを使用しています。
シリアル伝送機能:
; uint8_t [10] = "01234abcde" Tx-データ HAL_UART_Transmit(&huart2、Tx-データ、10,0xffff); // Tx-データを介してコンテンツを送信するには長さ10をUART2、タイムアウトが最大時間0xFFFFであります
シリアル受信機能1:
値= uint8_t「F.」; HAL_UART_Receive(&huart2、(uint8_t *)&値、1,1000); //ステートメント1000ミリ秒に滞在したデータのバイトを受け取るために待って、データが値に格納
シリアル受信機能2:
HAL_UART_Receive_IT(&huart2は、(uint8_t *)&値、1); //プログラムは、この声明の中で滞在しないだろう、直接続く受信データが値に格納されて中断しますが、この文は、シリアルポートの割り込み後に有効にすることができます。だから、サービスを中断したり、コールバック関数を再度有効に機能するために
シリアル受信機能3:
もし(HAL_UART_Receive_IT(&huart2、( uint8_t *)&値は、1)!= HAL_OKは){// これはしばらく主な機能(1)上の書き込みです。割り込みプログラムが受信を開始するために開始される HAL_UART_Transmit(&huart2、(uint8_t *)& "エラーの\ R&LT \ N-"、7,10)を、 (1)一方; }
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) { HAL_UART_Transmit(&huart2, (uint8_t *)&"\r\ninto HAL_UART_RxCpltCallback\r\n",32,0xffff); //验证进入这个函数了 HAL_UART_Transmit(&huart2,(uint8_t *)&value,1,0xffff); //把接收到的数据通过串口发送出去 HAL_UART_Receive_IT(&huart2,(uint8_t *)&value,1); //重新打开串口中断 }
串口DMA发送
DMA的TX要这样设置
uint8_t txData[] = {"HelloWorld\r\n"}; HAL_UART_Transmit_DMA(&huart2,txData,sizeof(txData));//可以通过DMA把数据发出去
DMA接收
if(HAL_UART_Receive_DMA(&huart2, (uint8_t *)rxData, sizeof(rxData)-1) != HAL_OK)//main函数while(1)前,启动一次DMA接收 { Error_Handler(); }
串口回调函数:
HAL_UART_RxCpltCallbackボイド(* UART_HandleTypeDef UartHandle){ uint8_t TEMPは、[] = { "\のR&LT \ニンコールバック\ R&LT \ N-"}; HAL_UART_Transmit_DMA(&huart2、TEMP、はsizeof(TEMP)-1); //データがDMAによって送信することができます HAL_UART_Receive_DMA(&huart2、(uint8_t * )RXDATA、はsizeof(RXDATA)-1); // 再使用可能な受信器 }
(1)連続して出力値RXDATAながら主な機能
HAL_UART_Transmit_DMA(&huart2、RXDATA、はsizeof(RXDATA)-1); //データをDMAによって送信することができます