stm32的rxne和idle中断_HAL库的STM32F767的DMA通过IDLE中断接收数据但不能访问

在STM32F767中使用HAL库配置DMA通过IDLE中断接收数据时,遇到一个问题:一旦访问接收到的数据数组,下次启用DMA接收就会失效。即使在仿真模式下,不访问数据可以正常接收,但访问后就无法继续接收。中断函数和DMA配置已详细列出。
摘要由CSDN通过智能技术生成

仿真能看到接收缓冲区数组中的数据,但不能访问,如果不访问,再开启DMA接收能正常接收,并且在仿真状态下也能查看。只要访问一次这个数组,下一次开启DMA接收后就不能接收数据了。

原代码如下:

if(rx_end == 1){

rx_end = 0;

HAL_UART_DMAStop(&UART1_Handler);

LCD_ShowString(300, 400, 200, 16, 16, "success!");

LCD_ShowString(230, 400, 200, 16, 16, aRxBuffer);            //这条不能执行,执行就不能再接收数据

//屏蔽掉这条在仿真状态下能观察aRxBuffer接收正常

HAL_UART_Receive_DMA(&UART1_Handler, aRxBuffer, RXBUFFERSIZE);

}

配置原代码如下:

{

__HAL_RCC_DMA2_CLK_ENABLE();                        //DMA2ʱÖÓʹÄÜ

__HAL_RCC_GPIOA_CLK_ENABLE();                        //ʹÄÜGPIOAʱÖÓ

__HAL_RCC_USART1_CLK_ENABLE();                        //ʹÄÜUSART1ʱÖÓ

GPIO_Initure.Pin=GPIO_PIN_9;                        //PA9

GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //¸´ÓÃÍÆÍìÊä³ö

GPIO_Initure.Pull=GPIO_PULLUP;                        //ÉÏÀ­

GPIO_Initure.Speed=GPIO_SPEED_FAST;                //¸ßËÙ

GPIO_Initure.Alternate=GPIO_AF7_USART1;        //¸´ÓÃΪUSART1

HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //³õʼ»¯PA9

GPIO_Initure.Pin=GPIO_PIN_10;                        //PA10

HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //³õʼ»¯PA10

UART1_Handler.Instance=USART1;                                            //USART1

UART1_Handler.Init.BaudRate=9600;                                    //²¨ÌØÂÊ

UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //×Ö³¤Îª8λÊý¾Ý¸ñʽ

UART1_Handler.Init.StopBits=UART_STOPBITS_1;            //Ò»¸öֹͣλ

UART1_Handler.Init.Parity=UART_PARITY_NONE;                    //ÎÞÆæżУÑéλ

UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //ÎÞÓ²¼þÁ÷¿Ø

UART1_Handler.Init.Mode=UART_MODE_TX_RX;                    //ÊÕ·¢Ä£Ê½

HAL_UART_Init(&UART1_Handler);                                            //HAL_UART_Init()»áʹÄÜUART1

//Tx DMAÅäÖÃ

UART1TxDMA_Handler.Instance = DMA2_Stream7;                           //Êý¾ÝÁ÷Ñ¡Ôñ

UART1TxDMA_Handler.Init.Channel = DMA_CHANNEL_4;                      //ͨµÀÑ¡Ôñ

UART1TxDMA_Handler.Init.Direction = DMA_MEMORY_TO_PERIPH;             //´æ´¢Æ÷µ½ÍâÉè

UART1TxDMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE;                 //ÍâÉè·ÇÔöÁ¿Ä£Ê½

UART1TxDMA_Handler.Init.MemInc = DMA_MINC_ENABLE;                     //´æ´¢Æ÷ÔöÁ¿Ä£Ê½

UART1TxDMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;    //ÍâÉèÊý¾Ý³¤¶È:8λ

UART1TxDMA_Handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;       //´æ´¢Æ÷Êý¾Ý³¤¶È:8λ

UART1TxDMA_Handler.Init.Mode = DMA_NORMAL;                            //ÍâÉèÁ÷¿Øģʽ

UART1TxDMA_Handler.Init.Priority = DMA_PRIORITY_MEDIUM;               //ÖеÈÓÅÏȼ¶

UART1TxDMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE;

UART1TxDMA_Handler.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;

UART1TxDMA_Handler.Init.Memburst = DMA_MBURST_SINGLE;                 //´æ´¢Æ÷Í»·¢µ¥´Î´«Êä

UART1TxDMA_Handler.Init.PeriphBurst = DMA_PBURST_SINGLE;              //ÍâÉèÍ»·¢µ¥´Î´«Êä

//    HAL_DMA_DeInit(&UART1TxDMA_Handler);

HAL_DMA_Init(&UART1TxDMA_Handler);

__HAL_LINKDMA(&UART1_Handler, hdmatx, UART1TxDMA_Handler);

//Rx DMAÅäÖÃ

UART1RxDMA_Handler.Instance = DMA2_Stream2;                           //Êý¾ÝÁ÷Ñ¡Ôñ

UART1RxDMA_Handler.Init.Channel = DMA_CHANNEL_4;                      //ͨµÀÑ¡Ôñ

UART1RxDMA_Handler.Init.Direction = DMA_PERIPH_TO_MEMORY;             //´æ´¢Æ÷µ½ÍâÉè

UART1RxDMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE;                 //ÍâÉè·ÇÔöÁ¿Ä£Ê½

UART1RxDMA_Handler.Init.MemInc = DMA_MINC_ENABLE;                     //´æ´¢Æ÷ÔöÁ¿Ä£Ê½

UART1RxDMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;    //ÍâÉèÊý¾Ý³¤¶È:8λ

UART1RxDMA_Handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;       //´æ´¢Æ÷Êý¾Ý³¤¶È:8λ

UART1RxDMA_Handler.Init.Mode = DMA_NORMAL;                            //ÍâÉèÁ÷¿Øģʽ

UART1RxDMA_Handler.Init.Priority = DMA_PRIORITY_MEDIUM;               //ÖеÈÓÅÏȼ¶

UART1RxDMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE;

UART1RxDMA_Handler.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;

UART1RxDMA_Handler.Init.MemBurst = DMA_MBURST_SINGLE;                 //´æ´¢Æ÷Í»·¢µ¥´Î´«Êä

UART1RxDMA_Handler.Init.PeriphBurst = DMA_PBURST_SINGLE;              //ÍâÉèÍ»·¢µ¥´Î´«Êä

HAL_DMA_Init(&UART1RxDMA_Handler);

__HAL_LINKDMA(&UART1_Handler, hdmarx, UART1RxDMA_Handler);

__HAL_UART_CLEAR_IDLEFLAG(&UART1_Handler);

__HAL_UART_ENABLE_IT(&UART1_Handler, UART_IT_RXNE);                //¿ªÆô½ÓÊÕÖжÏ

HAL_NVIC_EnableIRQ(USART1_IRQn);                                                        //ʹÄÜUSART1ÖжÏͨµÀ

HAL_NVIC_SetPriority(USART1_IRQn, 3, 3);                                        //ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3

HAL_UART_Receive_DMA(&UART1_Handler, aRxBuffer, RXBUFFERSIZE);              //开启了一次

}

接收中断函数

void USART1_IRQHandler(void)

{

unsigned short y;

if((__HAL_UART_GET_FLAG(&UART1_Handler, UART_IT_RXNE) != RESET))

{

y = 400;

LCD_ShowString(30, y, 200, 16, 16, "UART_IT_RXNE");

LCD_ShowNum(180, y, RX_ADDR, 3, 16);

rx_end = 1;

if(RX_ADDR < 900){

RX_ADDR++;

}

else{

RX_ADDR = 0;

}

}

HAL_UART_IRQHandler(&UART1_Handler);

}

699ba7046c51816a17b33a7caa85f179.png

0

97b4b3417991aabde46fdac613e34292.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值