Ham*_*Fet 5 fifo stm32 dma uart stm32f4discovery
我正在尝试让 UART 传输在 stm32f405 上通过 DMA 工作。我的应用程序的这一部分旨在作为命令行界面发送文本字符串。我让 UART 的 RX 部分与 DMA 配合良好(使用 1 字节循环 DMA 来处理传入的任何内容),但 TX 端被证明有点棘手。
我可以使用以下方式发送数据字符串:HAL_UART_Transmit_DMA(&handle, pData[], strlen(pData))前提是函数的连续调用之间存在延迟。一旦我的程序决定依次发送两个字符串,新的数据指针就会被忽略。
通过使用,while(HAL_UART_Transmit_DMA(...) != HAL_OK){}我可以让程序等待所需的时间并发送连续的字符串。
这可以工作一段时间(几十次传输),然后由于 HAL_NOT_OK 而卡住。
作为参考,我的 DMA 设置是:DMA2 stream 7, channel 4, mem to periph, periph inc disabled, mem inc enabled, mem and periph align byte, normal mode (not circular), low priority, fifo disabled。
UART 设置为9600 baud, 8 bit word, 1 stop bit, no parity, no hw control, 16 oversampling。
我试图弄清楚使用 FIFO 是否能帮助我解决这个问题,尽管我还不完全确定我是否理解它。如果我想发送一个字节的数据,我可以用 FIFO 来完成吗?这里有 1 个字的最少限制吗?
我已经设置了一个tx complete callback我目前没有使用的。我确实想知道在此中断期间是否需要清除任何标志,但不确定。
任何帮助表示赞赏!
HammerFet,我相信您将需要使用循环模式(例如DMA_Mode_Circular)。尝试一下。
另外,请查看STM32F4 应用笔记中非常简短的第 1.1.8 节,其中说明了以下内容:
正常模式:一旦 DMA_SxNDTR 寄存器达到零,流将被禁用(DMA_SxCR 寄存器中的 EN 位等于 0)。
DMA 配置设置示例如下:
volatile char Buffer[] = "first uart test with stm32f4\r\n";
void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Stream2);
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; // Receive
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Buffer;
DMA_InitStructure.DMA_BufferSize = (uint16_t)sizeof(Buffer);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&UART4->DR;
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_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA1_Stream2, &DMA_InitStructure);
/* Enable the USART Rx DMA request */
USART_DMACmd(UART4, USART_DMAReq_Rx, ENABLE);
/* Enable DMA Stream Half Transfer and Transfer Complete interrupt */
DMA_ITConfig(DMA1_Stream2, DMA_IT_TC | DMA_IT_HT , ENABLE);
/* Enable the DMA RX Stream */
DMA_Cmd(DMA1_Stream2, ENABLE);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29411 次 |
| 最近记录: |