ll库dma串口发送例程
时间: 2023-09-10 16:05:37 浏览: 266
下面是一个使用LL库实现DMA串口发送的例程,可供参考:
```c
#include "stm32f4xx_ll_bus.h"
#include "stm32f4xx_ll_dma.h"
#include "stm32f4xx_ll_gpio.h"
#include "stm32f4xx_ll_usart.h"
#define USART_TX_PORT GPIOA
#define USART_TX_PIN LL_GPIO_PIN_9
#define USART_TX_AF LL_GPIO_AF_7
#define BUFFER_SIZE 64
// 定义DMA传输完成标志
volatile uint8_t dma_tx_complete = 0;
uint8_t tx_buffer[BUFFER_SIZE] = "Hello, World!\r\n";
void USART_DMA_Init(void)
{
// 使能USART1、DMA2、GPIOA时钟
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA2);
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
// 配置USART1引脚
LL_GPIO_SetPinMode(USART_TX_PORT, USART_TX_PIN, LL_GPIO_MODE_ALTERNATE);
LL_GPIO_SetAFPin_8_15(USART_TX_PORT, USART_TX_PIN, USART_TX_AF);
LL_GPIO_SetPinSpeed(USART_TX_PORT, USART_TX_PIN, LL_GPIO_SPEED_FREQ_VERY_HIGH);
LL_GPIO_SetPinOutputType(USART_TX_PORT, USART_TX_PIN, LL_GPIO_OUTPUT_PUSHPULL);
// 配置USART1
LL_USART_InitTypeDef usart_init_struct;
LL_USART_StructInit(&usart_init_struct);
usart_init_struct.BaudRate = 115200;
LL_USART_Init(USART1, &usart_init_struct);
// 配置USART1 DMA发送模式
LL_USART_EnableDMAReq_TX(USART1);
LL_DMA_SetChannelSelection(DMA2, LL_DMA_STREAM_7, LL_DMA_CHANNEL_4);
LL_DMA_ConfigTransfer(DMA2, LL_DMA_STREAM_7, LL_DMA_DIRECTION_MEMORY_TO_PERIPH |
LL_DMA_MODE_NORMAL | LL_DMA_PERIPH_NOINCREMENT |
LL_DMA_MEMORY_INCREMENT | LL_DMA_PDATAALIGN_BYTE |
LL_DMA_MDATAALIGN_BYTE | LL_DMA_PRIORITY_MEDIUM |
LL_DMA_MEMORY_SINGLE);
LL_DMA_ConfigAddresses(DMA2, LL_DMA_STREAM_7, (uint32_t)tx_buffer,
(uint32_t)&USART1->DR, LL_DMA_GetDataTransferDirection(DMA2, LL_DMA_STREAM_7));
LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_7, BUFFER_SIZE);
// 使能DMA传输完成中断
LL_DMA_EnableIT_TC(DMA2, LL_DMA_STREAM_7);
// 使能USART1 DMA发送和USART1
LL_USART_EnableDMAReq_TX(USART1);
LL_USART_Enable(USART1);
}
int main(void)
{
USART_DMA_Init();
// 开始DMA传输
LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_7);
while (!dma_tx_complete);
return 0;
}
/**
* @brief DMA2 Stream7传输完成中断处理函数
*/
void DMA2_Stream7_IRQHandler(void)
{
if (LL_DMA_IsActiveFlag_TC7(DMA2)) {
LL_DMA_ClearFlag_TC7(DMA2);
dma_tx_complete = 1;
}
}
```
在这个例程中,我们使用了USART1和DMA2的通道4和流7来实现串口发送。首先,我们对USART1进行了初始化,并将其设置为使用DMA发送模式。然后,我们配置了DMA2的通道4和流7,以实现从内存中的缓冲区发送数据到USART1的数据寄存器中。最后,我们启用了DMA传输完成中断,并在主循环中等待DMA传输完成标志的设置。
需要注意的是,这个例程中使用了LL库(即Low Level库),而不是HAL库。LL库是一个更底层的库,可以提供更好的性能和更小的代码尺寸,但也需要更多的手动配置。如果你对LL库不熟悉,建议先学习一下HAL库。
阅读全文