在STM32F103C8T6T6单片机上,利用串口空闲中断和DMA功能实现Modbus通信时数据检测功能。不再需要利用定时器中断去判断一帧数据是否接收完成。
2020-12-04 09:08:44 5.62MB STM32 串口 通信 DMA
1
spi主机程序 STM32CubeMx生成 Hal库 DMA发送接收 int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_USART1_UART_Init(); MX_SPI5_Init(); /* USER CODE BEGIN 2 */ // HAL_UART_Receive_DMA(&huart1,rxBuffer,BUFFER_SIZE); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET); spi_tx[0] =6; spi_tx[1] = 7; spi_tx[2] = 8; spi_tx[3] = 9; memset(spi_rx,0,BUFFER_SIZE); HAL_SPI_TransmitReceive_DMA(&hspi5,spi_tx,spi_rx,BUFFER_SIZE); HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_SET); HAL_Delay(1000); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
2020-11-11 15:29:53 33.37MB spi DMA 主机 STM32CubeMX
1
在使用串口时,使用dma接收会提高程序的运行效率,所以我写一个串口dma接收程序,使用hal的cubemx配置,实现功能
2020-10-28 17:49:04 6.97MB HAL USART DMA
1
测试时可用的,里面也有一些测试读写的时间,读1K大概需要200us读4K能进1ms以内速度算还行吧,开了DMA,有需要的可以看看,挺多地方可以继续优化,同时可以简单修改,其他W25Qxx系列的芯片也是可用的.
2020-04-23 14:30:58 3.74MB STM3 W25Q256 SPI DMA
1
STM32F103ZET6,ADC1采集,通过定时器3触发中断,在中断程序里J将采集数据进行快速傅里叶变换,得到频率,幅值,实部,虚部并将处理的数据传送到串口进行打印
2020-04-11 03:10:29 4.54MB DMA STM32F103 FFT TIM3
1
STM32F103驱动SSD1353OLED程序,使用硬件SPI+DMA,帧率50Hz左右
2020-04-10 11:34:47 664KB SSD1353 OLED驱动 硬件SPI DMA
1
工程是基于STM32F207的ADC_DMA的整体程序 #define ADC1_DR_Address ((u32)0x4001204C) //ADC1数据寄存器地址=ADC1基准地址(0x40012000)+数据寄存器偏移地址(0x4c) GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; DMA_InitTypeDef DMA_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);// 使能 GPIO 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);// 开启ADC时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); // 开启DMA时钟 DMA_DeInit(DMA2_Stream0); DMA_InitStructure.DMA_Channel=DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;// 外设基址为:ADC 数据寄存器地址 DMA_InitStructure.DMA_Memory0BaseAddr = (u32)&ad;_start;// 存储器地址,实际上就是一个内部SRAM的变量 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;// 数据传输方向为外设到存储器 DMA_InitStructure.DMA_BufferSize = 1;// 缓冲区大小为,指一次传输的数据量 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设寄存器只有一个,地址不用递增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;// 存储器地址 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;// 外设数据大小为半字,即两个字节 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 存储器数据大小也为半字,跟外设数据大小相同 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循环传输模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High;// DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; // 禁止DMA FIFO ,使用直连模式 DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
2020-03-05 03:09:35 7.37MB STM32F207 ADC DMA
1
在STM32F103单片机上实现,串口2通过DMA接收数据数据,并将接收的数据通过串口1发送出去。
2020-03-04 03:08:29 569KB STM32 103 串口 DMA
1
stm32的DMA可以进行数据的传输,而不用内存的参与。stm32通过DMA向串口发送和就收数据,数据丢失少。
2020-03-04 03:08:15 529KB stm32 DMA USATR
1
网上使用HAL串口时很多都没有实现不定长数据的接收,要么是限定数据长度,要么是加“0x0a 0x0d”来控制接收完成,找了很久都没有真正找到一个能用的,在很多通信中不可能是定义的,或是加上“0x0a 0x0d”来实现的,由于项目需要,自己阅读STM32 HAL的文档,写出了一个Demo程序,可以实现回显功能(就是通过给STM32发送不定长的数据,可以实现一模一样接收发送的数据),在STM32F429IGT6上验证过,跑了一天没有出现丢失数据的问题,使用DMA发送与接收方式,可以释放CPU部分运算资源,程序中的UART_RX_BUF_SIZE定义为128,就是一次最大接收为128,我在项目中通过改为2048也可以通过一次接收2k的数据,代码量很少,才200多行,很容易看懂,可以移植到不同系列的STM32上,希望这程序能帮助到曾经跟我一样到处找资源解决HAL库与标准库串口使用上不同而痛苦的朋友们
2020-02-22 03:16:36 1.37MB stm32
1