新手上路
- 积分
- 46
- 金钱
- 46
- 注册时间
- 2019-5-5
- 在线时间
- 9 小时
|
1金钱
程序比较简单,是通过串口接受数据,然后存入SD卡中,目前SD程序都写完了,卡在串口DMA接受这一步骤上.
程序非常简单
(1) 设定了 两个缓冲区, 两个接受长度区域, 两个接受区满标志位
#define UASRT_RX_BUFF_SIZE 128
uint8_t UASRT_RX_BUFF[2][UASRT_RX_BUFF_SIZE];
uint8_t UASRT_RX_BUFF_Value[2] = { 0, 0 };
uint8_t UASRT_RX_BUFF_FULL = 0x00;
(2) 使用CUBEIDE生成的串口, 没有开启串口中断, 只开启了DMA接受, 非循环模式, 数据类型为8位.
(3) 初始化程序如下图所示:
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_SPI1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart1, UASRT_RX_BUFF[0], UASRT_RX_BUFF_SIZE);
/* USER CODE END 2 */
while (1);
(4) 在DMA中断中程序如下图所示:
void DMA1_Channel5_IRQHandler(void)
{
HAL_DMA_IRQHandler(&hdma_usart1_rx);
if (__HAL_DMA_GET_FLAG(&hdma_usart1_rx,DMA_FLAG_TC5) == DMA_FLAG_TC5)
{
HAL_UART_Receive_DMA(&huart1, UASRT_RX_BUFF[0], UASRT_RX_BUFF_SIZE);
}
}
(5) 通过XCOM串口助手发送长度长于128字节的文件,第一次能够成功进入DMA中断, 重新初始化DMA接受后,第二次就没办法进入DMA中断了.请大家帮忙看看是出了什么问题.
5.1 目前已经排除通道错误的可能性, 如果通道错误,第一次也不会正常接受.
5.2
|
最佳答案
查看完整内容[请看2#楼]
问题已经解决, 在串口DMA接受时,如果没有开启循环接受(No cycle)需要注意数据缓冲区大小, 如果数据超过缓冲区大小, 串口溢出中断标志会置位. 若串口溢出中断标志位没有被清除,则无法开启下一次DMA传输. 在出现溢出中断标志位的情况下,没有清除DR(F1)或RDR(F4 L4 H7)寄存器的内容, DR寄存器的内容就会被传输到DMA指定的区域,并且CNDTR(NDTR) 寄存器的值会比写入值少1, 因为进行了一次DMA传输, 正确的写法应该如下所示:
void USART1 ...
|