STM32 HAL 라이브러리 CubeMX 튜토리얼 (VI)를 DMA 데이터 전송

STM32 HAL 라이브러리 CubeMX 튜토리얼 (VI)를 DMA 데이터 전송


튜토리얼 디렉토리의 STM32 HAL 라이브러리 CubeMX 시리즈

DMA 소개

직접 메모리 액세스 (DMA)는 주변 장치와 메모리 사이 또는 메모리와 메모리 사이에 고속 데이터 전송을 제공하기 위해 사용된다. CPU의 개입없이 , 데이터는 다른 작업을 수행하는 CPU 자원을 절약 할 수 신속하게 DMA에 의해 이동 될 수 있습니다.

STM32 각 채널이 하나 이상의 주변 메모리 액세스의 요청을 관리하기 위해 사용되는 두 개의 DMA 컨트롤러 채널 (12) (DMA1 일곱 개 채널 DMA2 5 개 개의 채널의 합계)를 갖는다. 각각의 DMA 요청을 조정하는 우선 순위 중재도 있습니다.

: DMA의 블록도
그림 삽입 설명 여기
각 채널 DMA1 화상을 요청
그림 삽입 설명 여기
각 이미지 채널 DMA2 요청 :
그림 삽입 설명 여기
DMA 전송 데이터의 방향으로 세 말초로부터 메모리로, 메모리로부터 외주로, 메모리로부터 메모리.

주변 데이터는 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가에서 우리가 깜박이는 동안 컨트롤러의 CPU를 취할 수없는 주문은 DMA 전송을 확인합니다
while (1)
{
  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_9);
  HAL_Delay(500);
}
  1. 시리얼 Assistant는 '시간'을 보여 계속하고, 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