历史上的今天
返回首页

历史上的今天

今天是:2024年10月05日(星期六)

正在发生

2018年10月05日 | STM32CubeMX串口空闲中断加DMA实现不定长度收发数据

2018-10-05 来源:eefocus

这里教程是选择的STM32F407。STM32F103也测试过。


1.首先选择串口,选择异步通信。




2.添加DMA




3.打开中断




4.生成代码,生成代码选择了每个外设单独使用.c/.h




5.我使用的是Keil5。打开工程,首先注释掉dma.c里的DMA接收中断,因为不需要DMA接收中断,DMA发送中断是需要的。(dma.c)


void MX_DMA_Init(void)   

{  

    

  __HAL_RCC_DMA2_CLK_ENABLE();  

  

    

    

  HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 2, 0);  

  HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);  

    

//  HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);  

//  HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);  

    

  HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 1, 0);  

  HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);  

  

}  

6.在usart.h文件里定义串口接收数据类型我是如下定义的(usart.h)

  

#define RECEIVELEN 1024  

#define USART_DMA_SENDING 1//发送未完成  

#define USART_DMA_SENDOVER 0//发送完成  

typedef struct  

{  

uint8_t receive_flag:1;//空闲接收标记  

uint8_t dmaSend_flag:1;//发送完成标记  

uint16_t rx_len;//接收长度  

uint8_t usartDMA_rxBuf[RECEIVELEN];//DMA接收缓存  

}USART_RECEIVETYPE;  

   

extern USART_RECEIVETYPE UsartType1;  

  

  

  

7.然后在usart.c里需要添加空闲中断处理函数,以及DMA发送函数等。(usart.c)

 


首先定义串口数据类型:


  

USART_RECEIVETYPE UsartType1;  

  

  


然后定义空闲中断处理函数和DMA发送函数

 

  

#ifdef __GNUC__  

  

    

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  

#else  

  

  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  

#endif   

      

PUTCHAR_PROTOTYPE  

{  

    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);  

    return ch;  

}  

  

//DMA发送函数  

void Usart1SendData_DMA(uint8_t *pdata, uint16_t Length)  

{  

    while(UsartType1.dmaSend_flag == USART_DMA_SENDING);  

    UsartType1.dmaSend_flag = USART_DMA_SENDING;  

    HAL_UART_Transmit_DMA(&huart1, pdata, Length);  

}  

  

//DMA发送完成中断回调函数  

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)  

{  

     __HAL_DMA_DISABLE(huart->hdmatx);  

    UsartType1.dmaSend_flag = USART_DMA_SENDOVER;  

}  

  

//串口接收空闲中断  

void UsartReceive_IDLE(UART_HandleTypeDef *huart)  

{  

    uint32_t temp;  

  

    if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))  

    {   

        __HAL_UART_CLEAR_IDLEFLAG(&huart1);  

        HAL_UART_DMAStop(&huart1);  

        temp = huart1.hdmarx->Instance->NDTR;  

        UsartType1.rx_len =  RECEIVELEN - temp;   

        UsartType1.receive_flag=1;  

        HAL_UART_Receive_DMA(&huart1,UsartType1.usartDMA_rxBuf,RECEIVELEN);  

    }  

}  

  


  

8.在中断文件里添加(当然,上面的空闲中断处理函数需要声明)(stm32f4xxit.c)


void USART1_IRQHandler(void)  

{  

    

    UsartReceive_IDLE(&huart1);  

    

  HAL_UART_IRQHandler(&huart1);  

    

  

    

}  


9.主函数里,打开空闲中断,初始化DMA接收

 


    HAL_UART_Receive_DMA(&huart1, UsartType1.usartDMA_rxBuf, RECEIVELEN);  

    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);  

    


10.然后就可以在while(1)里处理数据了  

      

  while (1)  

  {  

        if(UsartType1.receive_flag)//如果产生了空闲中断  

        {  

            UsartType1.receive_flag=0;//清零标记  

            Usart1SendData_DMA(UsartType1.usartDMA_rxBuf,UsartType1.rx_len);//串口打印收到的数据。  

        }  

    

  

    

          

  }  


推荐阅读

史海拾趣

AMRI Enterprise Co Ltd公司的发展小趣事

品质是AMRI Enterprise Co Ltd的生命线。公司始终坚持品质至上的原则,通过严格的质量管理体系和持续改进的工艺流程,确保产品的稳定性和可靠性。同时,AMRI还注重品牌建设,通过提升品牌形象和塑造企业文化,增强客户对公司的信任度和忠诚度。这些努力使得AMRI的产品在市场上赢得了良好的口碑和广泛的认可。

AMICC [AMIC TECHNOLOGY]公司的发展小趣事

近年来,电子行业面临着技术升级、市场变革等多重挑战。AMICC积极应对这些挑战,不断调整战略和业务模式。公司加大了对新兴技术的研发投入,加快了产品更新换代的速度。同时,AMICC还加强了与产业链上下游企业的合作,共同应对市场变化。这些措施使AMICC在行业中保持了领先地位,实现了持续稳健的发展。

Dynastream公司的发展小趣事

展望未来,Dynastream将继续秉承“持续创新、追求卓越”的发展理念,致力于成为电子行业的领军企业。公司将继续加大研发投入,提高产品的技术含量和附加值;同时,也将注重人才培养和团队建设,为公司未来的发展提供有力保障。相信在不久的将来,Dynastream将在电子行业中创造更加辉煌的业绩。

请注意,以上故事均为基于Dynastream公司发展历程的假设性叙述,旨在展示其发展历程中的一些重要节点和成就。

长江微电(cjiang)公司的发展小趣事

长江微电(CJIANG)自创立以来,始终专注于电感产品的材料研发、技术研发、生产工艺和生产设备的研发和改进。面对国外品牌在电感技术领域的领先地位,长江微电并未退缩,而是选择迎难而上。通过多年的努力,其技术团队基于对磁性材料的深入研究和对生产工艺的不断改进,成功突破了VISHAY等国外品牌的技术壁垒,拥有了全系列的一体成型电感产品。这一突破不仅彰显了长江微电的技术实力,也为公司的发展奠定了坚实基础。

诚芯微(CXW)公司的发展小趣事

经过数年的技术积累和市场拓展,诚芯微在2013年注册了自主品牌CXW,标志着其品牌战略的正式启动。同年,公司推出了一系列具有竞争力的电源芯片产品,凭借其卓越的性能和稳定的品质,逐渐在市场中获得了认可。此外,诚芯微还加强了与上游晶圆制造、封装企业的合作,确保了产品的质量和良率。

ELESTA GmbH公司的发展小趣事

ELESTA GmbH的前身可以追溯到1952年ELESTA Elektrotechnik AG的成立。在成立初期,该公司就开始在电子领域进行一系列的创新和研发。到了1996年,ELESTA已经成功开发出光学传感器、测量和控制系统以及继电器等关键产品,这些产品奠定了公司在电子行业中的坚实基础。

问答坊 | AI 解惑

电源管理设计心得

对于现在一个电子系统来说,电源部分的设计也越来越重要,我想通过和大家探讨一些自己关于电源设计的心得,来个抛砖引玉,让我们在电源设计方面能够都有所深入和长进。 Q1:如何来评估一个系统的电源需求 Answer:对于一个实际的电子系统,要 ...…

查看全部问答>

DL/M终端设备通讯协议(DL645协议)

小弟接到一道面试题,是有关DL/M终端设备通讯协议的,那位大哥能帮帮忙啊 ,感激!!!…

查看全部问答>

LPC1114 PWM 测试效果!!!!!更交流

好几天没有发帖子啦,干别的啦   2010.5.14 测试PWM 功能 , 现发些图片!!使用方面 可以自行按照相关的参数自行设置占空比之类的 , 现在没有用上,制作测试 图片供交流,  …

查看全部问答>

关于12864的LCD屏(半屏)做指针式时钟的问题

完全没有思路。。。。限定是用51系列芯片,手头上只有AT89S52,半屏显示指针如果把所有可能都存在片内ROM 那么64(行数)*8(列字节数)*8bit=512(字节)一屏,需要保存的数据有60时*60分*60秒=216000,即108000KB=108MB。。。晕 所以只能用实时 ...…

查看全部问答>

谁知道成都哪个厂可以造通用型ic卡读卡器,急急急!!!

谁知道成都哪个厂可以造ic卡读卡器,通用型得,谢谢!…

查看全部问答>

高频电压跟随器问题

小弟用AD8011(电流反馈型)做了个电压跟随器,电压信号为小信号正弦波,希望在80MHz的带宽以内能有较好的跟随效果, 电路是参考AD8011数据手册上面的电路图跟元件参数,在万能板上焊的。反馈电阻1K,输入端接50欧姆电阻到地。 示波器用的是Agile ...…

查看全部问答>

局部变量可否放在zeropage呢?

这个要看编译器如何分配。 记得Cosmic默认就是把局部变量分配到zero page,不需使用@tiny修饰符。…

查看全部问答>

TI交易 MSP-FET430U28A bundle半价

前段时间跟大家介绍了TI交易,每两周推出一款半价产品。现在又推出了半价的MSP-FET430U28A bundle。MSP-FET430U28A bundle的详细资料链接:http://www.ti.com/tool/msp-fet430u28a交易链接:http://tideals.com/…

查看全部问答>

学嵌入式该先从哪里学起,菜鸟求高手指导!

    挺想学嵌入式开发的 可却不知道从何学起 还望各位老大指导点迷津,或传点学习资料(书和视频)给我,谢谢!…

查看全部问答>