STM32 HALライブラリCubeMXチュートリアル(VI)DMAデータ転送

STM32 HALライブラリCubeMXチュートリアル(VI)DMAデータ転送


チュートリアル・ディレクトリのSTM32 HALライブラリCubeMXシリーズ

DMAについて

ダイレクト・メモリ・アクセス(DMA)は、周辺機器とメモリ間、またはメモリとメモリとの間の高速データ転送を提供するために使用されます。CPUの介入がなければ、データは他の操作を行うためにCPUリソースを節約する、すぐにDMAによって移動することができます。

STM32は、2つのDMAコントローラ、12チャネルの合計(DMA1 7つのチャンネル、DMA2 5チャンネル)を有し、各チャネルは、1つまたは複数の周辺メモリアクセスからの要求を管理するために使用されます。それぞれのDMA要求を調整するために、優先アービタもあります。

:DMAのブロック図で
ここに画像を挿入説明
:各チャンネルのDMA1画像要求
ここに画像を挿入説明
:各画像チャネルDMA2要求
ここに画像を挿入説明
DMA転送データの方向メモリからメモリへ、メモリから周辺に、周辺装置からメモリへ:3つ。

周辺データは、ADC、SPI、I2Cデータレジスタおよび他の周辺装置などの周辺機器を登録するために一般的に指します。一般的には、フラッシュチップのようなメモリチップSRAM、外部メモリを指します。データを要約すると、送信されたCPU占有することなく、DMA転送を使用して他の事に対処するのに十分な時間を持つように、CPUの解放、CPUを。

私たちは、指定されたメモリUSARTレジスタにデータを転送するDMA転送を使用して、PC側、シリアルデバッグアシスタントディスプレイに送信することができます。

CubeMX設定

  1. そして、同じクロックの設定前へ
  2. 1シリアル多重PB6、PB7、非同期モード、割り込みイネーブル
    PA9は、LEDに接続され、出力モード
    ここに画像を挿入説明
    ここに画像を挿入説明
  3. DMAの設定
    ここに画像を挿入説明

DMAの初期化

初期DMA_ InitTypeDef構造:
ここに画像を挿入説明

  1. 方向:送信の方向は、メモリへの選択周辺機器を選択し、メモリの周辺とメモリへのメモリ
    デバイス。[1:0]ビットDMA_SxCRレジスタDIRの値を設定します。
  2. PeripheralInc:如果配置为 DMA_PINC_ENABLE,使能外设地址自动递增功能,
    它设定 DMA_CCR 寄存器的 PINC 位的值;一般外设都是只有一个数据寄存器,
    所以一般不会使能该位。
  3. MemoryInc:如果配置为 DMA_MINC_ENABLE,使能存储器地址自动递增功能,
    它设定 DMA_CCR 寄存器的 MINC 位的值;我们自定义的存储区一般都是存放多
    个数据的,所以要使能存储器地址自动递增功能。
  4. PeriphDataAlignment:外设数据宽度,可选字节(8 位)、半字(16 位)和字(32 位),
    它设定 DMA_SxCR 寄存器的 PSIZE[1:0]位的值。 ADC 数据寄存器只有低 16 位数
    据有效,使用半字数据宽度。
  5. Mode: DMA 传输模式选择,可选一次传输或者循环传输,它设定 DMA_SxCR 寄
    存器的 CIRC 位的值。我们希望 ADC 采集是持续循环进行的,所以使用循环传输
    模式。
  6. 软件设置数据流的优先级,有 4 个可选优先级分别为非常高、高、中和低,它设
    定 DMA_SxCR 寄存器的 PL[1:0]位的值。 DMA 优先级只有在多个 DMA 数据流同
    时使用时才有意义,这里我们设置为高优先级就可以了。
    hdma_usart1_tx.Instance = DMA1_Channel4; //DAMAͨµÀ
    hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; //´«Êä·½Ïò
    hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE; //
    hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart1_tx.Init.Mode = DMA_CIRCULAR;
    hdma_usart1_tx.Init.Priority = DMA_PRIORITY_HIGH;

DMA-UART数据收发

我们使用DMA将数据从内部flash转移到 USART 寄存器内,并发送至 PC 端, 由串口调试助手显示。
主函数编写:

  1. 定義のデータ・バッファを送受信します
/* USER CODE BEGIN 0 */
uint8_t aRxBuffer;                      
uint8_t aTxBuffer[SENDBUFF_SIZE];       
/* USER CODE END 0 */
  1. バッファに送信するデータを定義するために、我々通常定義された定数は、マイクロコントローラの内部メモリに記憶されている
    シリアルポート割り込み受信しながら、DMA転送開始を
/* USER CODE BEGIN 2 */
 for(uint16_t i=0;i<SENDBUFF_SIZE;i++)
  aTxBuffer[i]='h';
 HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);
 HAL_UART_Transmit_DMA(&huart1,aTxBuffer,SENDBUFF_SIZE);
  /* USER CODE END 2 */
  1. 割り込みコールバック関数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  HAL_UART_Transmit(&huart1,&aRxBuffer,1,0);
  HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);
}
  1. LEDで私たちが点滅している間、DMA転送を確認するには、コントローラのCPUを取るにしないために
while (1)
{
  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_9);
  HAL_Delay(500);
}
  1. シリアルアシスタントは「h」を示し続けると、LEDの点滅
    ここに画像を挿入説明
    をクリックすることを忘れないで、すぐにDMA転送速度ので、受け取るためにクリアをシリアルアシスタントが立ち往生防ぐために、画面クリアを!

参考資料

  1. ハードロックYS-F1Pro開発ボード開発マニュアル(HALライブラリアップデートバージョン20170104).PDF
  2. STM32F10xxxリファレンスマニュアルの.pdf
  3. [山火事は] "STM32 + HAL +ライブラリの開発者の実用的なガイドライン - F103-MINIに基づく" .PDF
公開された14元の記事 ウォン称賛18 ビュー7668

おすすめ

転載: blog.csdn.net/weixin_43116606/article/details/104233238