GD32f103DMA 发送使能后,不成功
时间: 2024-03-28 15:37:11 浏览: 81
出现DMA发送不成功的情况可能有多种原因,以下是一些可能的解决方法:
1. 确认DMA配置正确:检查DMA的源地址、目的地址、传输数据量等配置是否正确。
2. 确认DMA传输中断使能:启用DMA传输完成中断和DMA错误中断,以便及时发现传输中出现的问题。
3. 确认外设配置正确:检查外设是否正确配置为DMA模式,如USART的DMA发送模式是否开启。
4. 确认时钟配置正确:DMA需要一定的时钟支持,检查时钟配置是否正确。
5. 确认内存对齐:DMA传输时要求内存地址对齐,检查内存地址是否对齐。
希望这些方法能够帮助你解决问题,如果还有其他问题,请及时告诉我。
相关问题
GD32f103 串口DMA模式例子
以下是一个使用GD32f103芯片的串口DMA模式例子,可以帮助你快速开始使用此功能:
```c
#include "gd32f10x.h"
#define USART0_DR_ADDRESS ((uint32_t)0x40013804)
#define USART1_DR_ADDRESS ((uint32_t)0x40004404)
#define BUFFER_SIZE 256
uint8_t TxBuffer[BUFFER_SIZE];
uint8_t RxBuffer[BUFFER_SIZE];
void RCC_Configuration(void)
{
/* 使能USART0和DMA1的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART0, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
}
void GPIO_Configuration(void)
{
/* 使能USART0的GPIO时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* 配置USART0的TX引脚为复用推挽输出 */
GPIO_InitPara GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_9;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 配置USART0的RX引脚为浮空输入 */
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_10;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void USART_Configuration(void)
{
/* 配置USART0 */
USART_InitPara USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WORDLENGTH_8B;
USART_InitStructure.USART_StopBits = USART_STOPBITS_1;
USART_InitStructure.USART_Parity = USART_PARITY_NO;
USART_InitStructure.USART_HardwareFlowControl = USART_HARDWAREFLOWCONTROL_NONE;
USART_InitStructure.USART_Mode = USART_MODE_TX_RX;
USART_Init(USART0, &USART_InitStructure);
/* 使能USART0的DMA发送和DMA接收 */
USART_DMACmd(USART0, USART_DMAReq_Tx | USART_DMAReq_Rx, ENABLE);
}
void DMA_Configuration(void)
{
/* 配置DMA1通道4为USART0的TX通道 */
DMA_InitPara DMA_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr = USART0_DR_ADDRESS;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)TxBuffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PERIPHERALDST;
DMA_InitStructure.DMA_BufferSize = BUFFER_SIZE;
DMA_InitStructure.DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE;
DMA_InitStructure.DMA_MemoryInc = DMA_MEMORYINC_ENABLE;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PERIPHERALDATASIZE_BYTE;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MEMORYDATASIZE_BYTE;
DMA_InitStructure.DMA_Mode = DMA_MODE_NORMAL;
DMA_InitStructure.DMA_Priority = DMA_PRIORITY_HIGH;
DMA_InitStructure.DMA_M2M = DMA_M2M_DISABLE;
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
/* 配置DMA1通道5为USART0的RX通道 */
DMA_InitStructure.DMA_PeripheralBaseAddr = USART0_DR_ADDRESS;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RxBuffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PERIPHERALSRC;
DMA_InitStructure.DMA_BufferSize = BUFFER_SIZE;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
/* 使能DMA1通道4和DMA1通道5 */
DMA_Cmd(DMA1_Channel4, ENABLE);
DMA_Cmd(DMA1_Channel5, ENABLE);
}
int main(void)
{
/* 系统时钟配置 */
SystemInit();
/* RCC配置 */
RCC_Configuration();
/* GPIO配置 */
GPIO_Configuration();
/* USART配置 */
USART_Configuration();
/* DMA配置 */
DMA_Configuration();
while (1)
{
/* 发送数据 */
for (uint16_t i = 0; i < BUFFER_SIZE; i++)
{
TxBuffer[i] = i;
}
while (DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET);
/* 接收数据 */
while (DMA_GetFlagStatus(DMA1_FLAG_TC5) == RESET);
/* 处理接收到的数据 */
for (uint16_t i = 0; i < BUFFER_SIZE; i++)
{
if (RxBuffer[i] != i)
{
/* 处理接收到的数据出错 */
}
}
}
}
```
这个例子使用USART0的DMA模式进行数据的发送和接收,并且使用了DMA1通道4和DMA1通道5。在主循环中,它会先发送一个有序的数据包,然后等待DMA发送完成,再接收一个数据包,并验证接收到的数据是否正确。
gd32 f103串口接收dma
您好,关于 GD32F103 的串口接收 DMA,可以参考以下步骤:
1. 首先,需要配置串口和 DMA 的相关寄存器,例如串口的波特率、数据位数、停止位数、校验位等,以及 DMA 的通道、数据传输方向、传输数据类型等。
2. 然后,开启串口和 DMA 的时钟,并使能 DMA 的中断和传输完成中断。
3. 在串口接收中断中,将接收到的数据存入缓冲区中,并设置 DMA 的传输数据长度和缓冲区地址,启动 DMA 传输。同时需要注意,每次接收到数据后都要判断是否达到了缓冲区的最大长度,避免数据溢出。
4. 在 DMA 传输完成中断中,将接收到的数据进行处理,例如解析数据、更新状态等。
下面是一个简单的示例代码,供参考:
```c
#include "gd32f10x.h"
#define BUFFER_SIZE 256
uint8_t buffer[BUFFER_SIZE];
uint16_t buffer_index = 0;
void usart_config(void)
{
/* Enable USART clock */
rcu_periph_clock_enable(RCU_USART0);
/* USART0 configuration */
usart_deinit(USART0);
usart_baudrate_set(USART0, 115200U);
usart_word_length_set(USART0, USART_WL_8BIT);
usart_stop_bit_set(USART0, USART_STB_1BIT);
usart_parity_config(USART0, USART_PM_NONE);
usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
usart_receive_config(USART0, USART_RECEIVE_ENABLE);
usart_dma_receive_config(USART0, USART_DENR_ENABLE);
/* Enable USART DMA requests */
usart_dma_request_enable(USART0, USART_DENR);
/* Enable USART */
usart_enable(USART0);
}
void dma_config(void)
{
/* Enable DMA clock */
rcu_periph_clock_enable(RCU_DMA0);
/* DMA0 channel4 configuration */
dma_deinit(DMA0, DMA_CH4);
dma_periph_address_config(DMA0, DMA_CH4, (uint32_t)&USART_DATA(USART0));
dma_memory_address_config(DMA0, DMA_CH4, (uint32_t)buffer);
dma_transfer_direction_config(DMA0, DMA_CH4, DMA_PERIPHERAL_TO_MEMORY);
dma_transfer_size_config(DMA0, DMA_CH4, DMA_MEMORY_WIDTH_8BIT, DMA_PERIPHERAL_WIDTH_8BIT);
dma_memory_increment_enable(DMA0, DMA_CH4);
dma_circulation_enable(DMA0, DMA_CH4);
dma_interrupt_enable(DMA0, DMA_CH4, DMA_INT_FTF);
dma_channel_enable(DMA0, DMA_CH4);
}
void nvic_config(void)
{
/* Enable DMA0 channel4 interrupt */
nvic_irq_enable(DMA0_Channel4_IRQn, 0, 0);
}
void DMA0_Channel4_IRQHandler(void)
{
if(dma_interrupt_flag_get(DMA0, DMA_CH4, DMA_INT_FTF))
{
dma_interrupt_flag_clear(DMA0, DMA_CH4, DMA_INT_FTF);
/* Process received data */
buffer_index = (BUFFER_SIZE - dma_transfer_number_get(DMA0, DMA_CH4)) % BUFFER_SIZE;
// ...
/* Restart DMA transmission */
dma_transfer_number_config(DMA0, DMA_CH4, BUFFER_SIZE);
dma_channel_enable(DMA0, DMA_CH4);
}
}
int main(void)
{
/* Configure USART */
usart_config();
/* Configure DMA */
dma_config();
/* Configure NVIC */
nvic_config();
while(1);
}
```
阅读全文