仿真能看到接收缓冲区数组中的数据,但不能访问,如果不访问,再开启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);

}

0

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

  1. 1、HAL库UART 中断|DMA 自动回显接收数据

    1.实现代码: stm32f4xx_hal_conf.h文件开启UART宏定义 #define HAL_UART_MODULE_ENABLED 添加stm32f4xx_hal_uart.c和stm32 ...

  2. 使用STM32Cube MX为STM32 CAN总线快速配置上手教程_HAL库_CAN协议_STM32_附波特率计算工具

    使用STM32Cube MX为STM32 CAN总线快速上手教程_HAL库_CAN协议_STM32 前言 博主也是刚接触CAN协议的新手,如有不对的地方欢迎交流 本文旨在使用STM32Cube MX快 ...

  3. stm32的rxne和idle中断_STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA

    历程详解 详解包括: 中断原理讲解 例程流程详解 库函数分析详解 对应寄存器介绍 对应函数介绍 对应注释详解 本篇文章提供两种方法: 一种是 :IDLE 接收空闲中断+DMA 一种是: IDLE 接收 ...

  4. 【STM32标准库】【基础知识】外部中断

    文章目录 外部中断 什么是外部中断 外部中断的触发 上升沿触发 下降沿触发 上升下降沿触发 外部中断初始化 初始化思路 1.初始化GPIO 2. 打开时钟 3.GPIO和外部中断的连接 4.外部中断初 ...

  5. STM32从零到一,从标准库移植到HAL库,UART串口1以DMA模式收发不定长数据代码详解+常见问题 一文解析

    前言 本文的参考资料 感谢提供标准库版本的CSDN同学:这两篇文章至少是我看过的最详细的标准库配置DMA版本.而且代码实测稳定能用. STM32 | DMA配置和使用如此简单(超详细)_...| .. ...

  6. 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  7. stm32F051 HAL库+DMA+串口空闲中断

    STM32CubeMX 配置实现参考这里. 1. 串口空闲中断 1.1 UART_DMA方式接收数据 STM32串口使用DMA方式接收数据可以减小CPU的开销. 对于接收定长数据,可以将DMA接收缓冲 ...

  8. 【STM32-I2C学习总结】STM32:硬件-IIC详解 , 固件库编程 , 手把手教你实现IIC

    STM32:硬件-IIC详解 , 固件库编程 , 手把手教你实现IIC 一 .I2C物理层 二.协议层 1.I2C基本读写过程 (1)主机写数据到从机 (2)主机由从机中读数据 (3)I2C 通讯复合 ...

  9. 【STM32】CubeMX+HAL库之 硬件IIC+DMA控制OLED(兼容SSD1306SH1106驱动)

    [STM32]CubeMX+HAL库之 硬件IIC+DMA控制1.3寸OLED 前言 目前网上大多数驱动OLED屏都采用软件IIC,因为HAL库的升级使得硬件IIC的稳定性得到了保障,所以想采用硬件I ...

最新文章

  1. python创建excel图表_python使用VBA(8):Excel创建图表(简单)
  2. 简练软考知识点整理-项目合同的类型
  3. @echo off是什么意思_为什么执行自己的程序要在前面加./
  4. ARM开发板上iconv调用失败的解决方法
  5. 手机充电器5V=1A和5V=2A的区别是什么?能通用吗?
  6. 你的旧船票能否搭上这艘巨轮?——解读近5年大数据产业发展规划
  7. Vue3 组合式Api之customRef实现防抖功能
  8. Interesting Finds: 2008.01.25
  9. Rstudio 1.2 新功能介绍
  10. SpringMVC学习(六)处理乱码问题
  11. 递归算法经典实例python-递归案例python
  12. Mac 安装和配置 Maven
  13. 三星note9刷Android9,【极光ROM】-【三星NOTE9 N960X-9810】-【V21.0 Android-Q-THB】
  14. 斐讯 http文件服务器,斐讯刷机教程(硬件版本A5)
  15. 第十二周 项目一--图基本算法库
  16. 激光清洗铝合金氧化层的优势
  17. Microsoft Word2010 中设置和取消英文首字母大写
  18. Windows 端口代理配置(Netsh)
  19. 解决无法从公司 Maven 私服下载依赖的问题
  20. NX安装cuda和cudnn

热门文章

  1. 【java】快速复制数组方法arraycopy的使用
  2. Window对象中setInterval()和setTimeout()的区别
  3. CSS之定位(元素的层级z-index)
  4. “抽象类”的定义及其与“普通类”的区别
  5. mysql 按日期删除数据库_DAY11 - MySQL入门(数据库的增、删、改、查 基本操作)...
  6. 商品秒杀,防并发解决思路
  7. ubuntu 下mysql导入出.sql文件
  8. 普华永道重磅报告:决定未来的八大核心科技
  9. 硬铺路、软筑墙:三星移动在中国的新路径
  10. shell编程基础(2)---与||