[STM8] STM32CubeMX USART串口DMA,IDLE 空闲中断接收不定长接收详解

[复制链接]
925|11
 楼主| piteqiu 发表于 2020-6-27 18:54 | 显示全部楼层 |阅读模式
1.打开软件如下图;
2066080-20200614220448078-1978871484.jpg

 楼主| piteqiu 发表于 2020-6-27 18:54 | 显示全部楼层
2.选择单片机,如下图;
2066080-20200614220742456-910055119.jpg

 楼主| piteqiu 发表于 2020-6-27 18:55 | 显示全部楼层
3.配置最大时钟,如下图
2066080-20200615194855737-28522535.jpg

 楼主| piteqiu 发表于 2020-6-27 18:55 | 显示全部楼层
4.选择usart1,配置异步通讯,并在DMA settings下添加USART1_RX和USART1_TX,DMA模式选择NORMAL就行,如下图;
2066080-20200614220958004-1126109774.jpg
2066080-20200614222916762-1763370615.jpg

 楼主| piteqiu 发表于 2020-6-27 18:56 | 显示全部楼层
5.添加usart1中断,如下图;
2066080-20200614221241844-1130416916.jpg

 楼主| piteqiu 发表于 2020-6-27 18:57 | 显示全部楼层
6.配置路径,.c.h 后再点击GENERATE CODE
2066080-20200614222652075-1583981504.jpg

 楼主| piteqiu 发表于 2020-6-27 18:57 | 显示全部楼层
7.生成工程代码后,while上面初始化;
  1. if (HAL_UART_Receive_DMA(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
  2. {
  3. /* Transfer error in reception process */
  4. Error_Handler();
  5. }
  6. __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);

  7. //添加      #define RXBUFFERSIZE 50

  8. //添加      uint8_t aRxBuffer[RXBUFFERSIZE];

  9. /***************************下面添加printf第一段***************/

  10. #ifdef __GNUC__
  11. /* With GCC, small printf (option LD Linker->Libraries->Small printf
  12. set to 'Yes') calls __io_putchar() */
  13. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  14. #else
  15. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  16. #endif /* __GNUC__ */

  17. /***************************下面添加printf第二段***************/

  18. PUTCHAR_PROTOTYPE
  19. {
  20. /* Place your implementation of fputc here */
  21. /* e.g. write a character to the USART1 and Loop until the end of transmission */
  22. HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

  23. return ch;
  24. }


 楼主| piteqiu 发表于 2020-6-27 18:58 | 显示全部楼层
8.编写,声明,定义,调用 void HAL_UART_IdleCallback(UART_HandleTypeDef*huart);
  1. /***************************下面main.h内添加函数声明***************/

  2. void HAL_UART_IdleCallback(UART_HandleTypeDef*huart);

  3. /***************************下面main.c内添加库函数***************/

  4. #include "string.h"
  5. #include "stdio.h"

  6. /***************************下面main.c内添加编写的回调函数***************/

  7. void HAL_UART_IdleCallback(UART_HandleTypeDef*huart)
  8. {
  9. //清除标志位
  10. __HAL_UART_CLEAR_IDLEFLAG(huart);
  11. //停止DMA接收
  12. HAL_UART_DMAStop(huart);
  13. //返回发送回的数据
  14. printf("%s",aRxBuffer);
  15. printf("Helloorld!\n");
  16. //清除缓存区
  17. memset(aRxBuffer,0x00,50);
  18. //开始DMA接收
  19. if(HAL_UART_Receive_DMA(huart,(uint8_t*)aRxBuffer,RXBUFFERSIZE)!=HAL_OK)
  20. {
  21. Error_Handler();
  22. }

  23. }

  24. /***********下面stm32f4xx_it.c内void USART1_IRQHandler(void)中添加编写的回调函数***************/

  25. if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)
  26. {

  27. //        HAL_UART_IdleCallback(&huart1);
  28. HAL_UART_IdleCallback(&huart1); // HAL_IdleCallback(UART_HandleTypeDef*huart);       
  29. }


wangjiahao88 发表于 2020-6-28 09:48 | 显示全部楼层
请问一下 这个空闲时间 可以设定吗?

还是默认的?
goodluck09876 发表于 2020-6-28 09:48 | 显示全部楼层
感觉空闲+DMA 才是很好的!

担心空闲时间 不能自由设置 就麻烦了。。。
Diyer2015 发表于 2020-6-28 09:55 | 显示全部楼层
超时IDLE,DMA+环形FIFO。总是最好的
杨寅辉 发表于 2020-6-28 11:56 | 显示全部楼层
支持下,谢谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

292

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部