【STM32+HAL】DMA应用

一、串口DMA收发

1、串口初始化

2、定义全局变量
#define RXBUFFERSIZE  256

uint8_t rx_buffer[RXBUFFERSIZE];//接收数组
volatile uint8_t rx_len = 0; //接收到的数据长度
volatile uint8_t recv_end_flag = 0; //接收结束标志位

3、开启IDLE中断以及串口DMA接收
  /* USER CODE BEGIN 2 */
	
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);    
	HAL_UART_Receive_DMA(&huart1,rx_buffer,RXBUFFERSIZE);	

  /* USER CODE END 2 */

4、stm32f4xx_it.c中补全回调函数
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
	uint8_t tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位
	if((tmp_flag != RESET))//通过标志位判断接收是否结束
	{ 
		recv_end_flag = 1; //置1表明接收结束
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
		HAL_UART_DMAStop(&huart1); 
		uint8_t temp=__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);                 
		rx_len =RXBUFFERSIZE-temp; //计算出数据长度
		HAL_UART_Transmit_DMA(&huart1, rx_buffer,rx_len);//将受到的数据发送出去
		HAL_UART_Receive_DMA(&huart1,rx_buffer,RXBUFFERSIZE);//开启DMA接收,方便下一次接收数据
	}

  /* USER CODE END USART1_IRQn 1 */
}

5、串口DMA发送
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_UART_Transmit_DMA(&huart1,(uint8_t *)"Hello\r\n",sizeof("Hello\r\n"));
	  HAL_Delay(1);//等待发送完毕
	  HAL_UART_Transmit_DMA(&huart1,(uint8_t *)"World\r\n",sizeof("World\r\n"));
	  HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

6、main.c调用
#include "stdio.h"

int cx = 0,cy = 0;
sscanf((const char *)rx_buffer, "%d %d", &cx, &cy);
printf("%d,%d\r\n",cx,cy);

对应openmv数据发送代码:

def send_data(x,y):
    global uart;
    uart.write(str(x))
    uart.write(bytearray([0x20]))
    uart.write(str(y))
    uart.write(bytearray([0x20]))

原理参见:

串口DMA知识梳理以及在Stm32的应用(HAL库)

STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA

源码提供:

STM32串口接收DMA HAL

二、OLED的显示(DMA)

详见【STM32+HAL】地表最强高刷OLED显示配置【I2C】

三、AS5600编码器读取(DMA)

详见【STM32+HAL】I2C+DMA读取AS5600编码器

四、DAC+DMA输出波形

详见【STM32+HAL】DAC+DMA输出波形实现

五、ADC+DMA读取模拟量

详见【STM32+HAL】ADC+DMA采集(单通道+多通道)

 详见【STM32+HAL】三重ADC采集波形实现

详见【STM32+HAL】读取电池电量

六、SDIO+DMA模式读写SD卡

详见【STM32+HAL】SDIO+DMA模式读写SD卡

七、SPI+DMA显示0.96’ / 1.3‘ OLED

详见【STM32+HAL】七针OLED(SSD1306)配置(SPI版)

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32 IIC HAL DMA是指在STM32系列的微控制器中使用I2C总线进行通信时,借助HAL库和DMA功能进行高效数据传输的方法。 STM32是意法半导体公司推出的一系列32位ARM Cortex-M微控制器,具有高性能和低功耗等特点。其中,IIC(Inter-Integrated Circuit)总线是一种用于芯片间通信的串行通信协议,常用于连接各种外围设备。 HAL(Hardware Abstraction Layer)库是STM32提供的一种软件抽象层,为开发者提供了一套封装好的高级API,方便开发者直接调用硬件功能,简化了底层驱动的开发过程。 DMA(Direct Memory Access)是一种直接内存访问技术,可以在不经过CPU的介入下,实现外设和内存之间的直接数据传输,提高了数据传输的效率,减轻了CPU的负担。 在使用STM32的IIC总线进行通信时,可以通过HAL库和DMA功能结合使用,实现高效的数据传输。通过HAL库提供的API函数,可以方便地对IIC总线和GPIO进行配置和控制。而DMA功能则可以利用直接内存访问的方式,将数据直接从外设(如传感器、显示屏等)传输到内存,或从内存传输到外设,减少了CPU的干预,提高了数据传输的速度和效率。 总之,STM32 IIC HAL DMA是一种利用STM32微控制器的HAL库和DMA功能,实现高效I2C总线数据传输的方法。它可以简化开发过程,减少CPU负担,提高数据传输效率,广泛应用于各种需要使用IIC总线进行通信的应用场景中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值