OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6139|回复: 2

求助,STM32F4串口2使用DMA时遇到的问题

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-7-5
在线时间
5 小时
发表于 2021-7-5 11:13:41 | 显示全部楼层 |阅读模式
1金钱
STM32F446想在串口2上开启DMA,跟串口1配置的类似,DMA映射也确认过,但是就是跑不起来,想请教下各位是哪里有问题,贴出代码如下,串口1的配置已经注释,感谢

  1. #include "usart.h"

  2. #include "string.h"
  3. #include <stdarg.h>
  4. //////////////////////////////////////////////////////////////////////////////////          
  5. //如果使用os,则包括下面的头文件即可.
  6. #if SYSTEM_SUPPORT_OS
  7. #include "includes.h"                                        //os 使用          
  8. #endif
  9. //////////////////////////////////////////////////////////////////////////////////         
  10. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  11. //ALIENTEK STM32F7开发板
  12. //串口1初始化                  
  13. //正点原子@ALIENTEK
  14. //技术论坛:www.openedv.com
  15. //修改日期:2015/6/23
  16. //版本:V1.5
  17. //版权所有,盗版必究。
  18. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  19. //All rights reserved
  20. //********************************************************************************
  21. //V1.0修改说明
  22. //////////////////////////////////////////////////////////////////////////////////           

  23. //通过外部拨动按键开关选择工作模式
  24. //高电平:WiFi模式
  25. //低电平:USB模式

  26. u8 Work_Mode;

  27. void Working_Mode_Init(void)
  28. {
  29.     GPIO_InitTypeDef GPIO_Initure;
  30.     __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟

  31.     GPIO_Initure.Pin=GPIO_PIN_3;            //PB3
  32.     GPIO_Initure.Mode=GPIO_MODE_INPUT;      //输入
  33.     GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
  34.     GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
  35.        
  36.     HAL_GPIO_Init(GPIOB,&GPIO_Initure);
  37. }


  38. //加入以下代码,支持printf函数,而不需要选择use MicroLIB          
  39. //#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)       
  40. #if 1
  41. #pragma import(__use_no_semihosting)            
  42. //标准库需要的支持函数                 
  43. struct __FILE
  44. {
  45.         int handle;
  46. };

  47. FILE __stdout;      
  48. //定义_sys_exit()以避免使用半主机模式   
  49. void _sys_exit(int x)
  50. {
  51.         x = x;
  52. }
  53. //重定义fputc函数
  54. int fputc(int ch, FILE *f)
  55. {        
  56.         Work_Mode=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3);
  57.         if(Work_Mode==0)
  58.         {
  59.                 while((USART1->SR&0X40)==0);//串口1循环发送,直到发送完毕   
  60.                 USART1->DR = (u8) ch;   
  61.         }
  62.         if(Work_Mode==1)
  63.         {
  64.                 while((USART2->SR&0X40)==0);//串口2循环发送,直到发送完毕   
  65.                 USART2->DR = (u8) ch;   
  66.         }
  67.         return ch;
  68. }
  69. #endif

  70. /*****************************************************************************/

  71. /*
  72. UART_HandleTypeDef UART1_Handler; //UART1句柄
  73. DMA_HandleTypeDef  DMA_UART1_RX; //UART1接收的DMA句柄
  74. DMA_HandleTypeDef  DMA_UART1_TX; //UART1发送的DMA句柄

  75. u8 command[USART_DMA_RX_BUFFER_MAXIMUM];

  76. uint8_t usart1_rx_buffer[USART_DMA_RX_BUFFER_MAXIMUM]; //串口1的DMA接收缓冲区
  77. uint8_t usart1_tx_buffer[USART_DMA_TX_BUFFER_MAXIMUM]; //串口1的DMA发送缓冲区
  78. uint8_t usart1_rx_flag = 0; //DMA接收成功标志 0,未接收到/1,,接收到等待处理
  79. uint16_t usart1_rx_len = 0; //DMA一次空闲中断接收到的数据长度

  80. //初始化IO 串口1
  81. //bound:波特率
  82. void uart1_init(u32 bound)
  83. {       
  84.         //UART 初始化设置
  85.         UART1_Handler.Instance                        =        USART1;                                        //USART1
  86.         UART1_Handler.Init.BaudRate                =        bound;                                    //波特率
  87.         UART1_Handler.Init.WordLength        =        UART_WORDLENGTH_8B;           //字长为8位数据格式
  88.         UART1_Handler.Init.StopBits                =        UART_STOPBITS_1;            //一个停止位
  89.         UART1_Handler.Init.Parity                =        UART_PARITY_NONE;                //无奇偶校验位
  90.         UART1_Handler.Init.HwFlowCtl        =        UART_HWCONTROL_NONE;           //无硬件流控
  91.         UART1_Handler.Init.Mode                        =        UART_MODE_TX_RX;                //收发模式
  92.         HAL_UART_Init(&UART1_Handler); //初始化使能UART1
  93.        
  94.         //开启空闲接收中断
  95.         __HAL_UART_ENABLE_IT(&UART1_Handler, UART_IT_IDLE);
  96.         //打开DMA接收,指定接收缓存区和接收大小
  97.         HAL_UART_Receive_DMA(&UART1_Handler, (uint8_t *)&usart1_rx_buffer, USART_DMA_RX_BUFFER_MAXIMUM);
  98. }

  99. */

  100. UART_HandleTypeDef UART2_Handler; //UART2句柄
  101. DMA_HandleTypeDef  DMA_UART2_RX; //UART2接收的DMA句柄
  102. DMA_HandleTypeDef  DMA_UART2_TX; //UART2发送的DMA句柄

  103. u8 connect_num=0;
  104. u8 start_num=0;
  105. u8 command[USART_DMA_RX_BUFFER_MAXIMUM];

  106. uint8_t usart2_rx_buffer[USART_DMA_RX_BUFFER_MAXIMUM]; //串口2的DMA接收缓冲区
  107. uint8_t usart2_tx_buffer[USART_DMA_TX_BUFFER_MAXIMUM]; //串口2的DMA发送缓冲区
  108. uint8_t usart2_rx_flag = 0; //DMA接收成功标志 0,未接收到/1,,接收到等待处理
  109. uint16_t usart2_rx_len = 0; //DMA一次空闲中断接收到的数据长度

  110. //初始化IO 串口2
  111. //bound:波特率
  112. void uart2_init(u32 bound)
  113. {       
  114.         //UART 初始化设置
  115.         UART2_Handler.Instance                        =        USART2;                                        //USART2
  116.         UART2_Handler.Init.BaudRate                =        bound;                                    //波特率
  117.         UART2_Handler.Init.WordLength        =        UART_WORDLENGTH_8B;           //字长为8位数据格式
  118.         UART2_Handler.Init.StopBits                =        UART_STOPBITS_1;            //一个停止位
  119.         UART2_Handler.Init.Parity                =        UART_PARITY_NONE;                //无奇偶校验位
  120.         UART2_Handler.Init.HwFlowCtl        =        UART_HWCONTROL_NONE;           //无硬件流控
  121.         UART2_Handler.Init.Mode                        =        UART_MODE_TX_RX;                //收发模式
  122.         HAL_UART_Init(&UART2_Handler); //初始化使能UART2
  123.        
  124.         //开启空闲接收中断
  125.         __HAL_UART_ENABLE_IT(&UART2_Handler, UART_IT_IDLE);
  126.         //打开DMA接收,指定接收缓存区和接收大小
  127.         HAL_UART_Receive_DMA(&UART2_Handler, (uint8_t *)&usart2_rx_buffer, USART_DMA_RX_BUFFER_MAXIMUM);
  128. }


  129. //UART底层初始化,时钟使能,引脚配置,中断配置
  130. //此函数会被HAL_UART_Init()调用
  131. //huart:串口句柄
  132. void HAL_UART_MspInit(UART_HandleTypeDef *huart) //在这里重写HAL_UART_MspInit函数
  133. {
  134.     //GPIO端口设置
  135.         GPIO_InitTypeDef GPIO_Initure;
  136.         /*
  137.         if(huart->Instance==USART1)//如果是串口1,进行串口1 MSP初始化
  138.         {
  139.                 //时钟使能
  140.                 __HAL_RCC_GPIOA_CLK_ENABLE();                        //使能GPIOA时钟
  141.                 __HAL_RCC_USART1_CLK_ENABLE();                        //使能USART1时钟
  142.                 __HAL_RCC_DMA2_CLK_ENABLE();                        //使能DMA2时钟
  143.                
  144.                 //端口初始化
  145.                 GPIO_Initure.Pin                =        GPIO_PIN_9;                        //PA9
  146.                 GPIO_Initure.Mode                =        GPIO_MODE_AF_PP;        //复用推挽输出
  147.                 GPIO_Initure.Pull                =        GPIO_PULLUP;                //上拉
  148.                 GPIO_Initure.Speed                =        GPIO_SPEED_FAST;        //高速
  149.                 GPIO_Initure.Alternate        =        GPIO_AF7_USART1;        //复用为USART1
  150.                 HAL_GPIO_Init(GPIOA, &GPIO_Initure);                         //初始化PA9

  151.                 GPIO_Initure.Pin                =         GPIO_PIN_10;                 //PA10
  152.                 HAL_GPIO_Init(GPIOA, &GPIO_Initure);                         //初始化PA10
  153.                
  154.                 //USART1_RX DMA初始化
  155.                 DMA_UART1_RX.Instance                                         = DMA2_Stream5;
  156.                 DMA_UART1_RX.Init.Channel                                = DMA_CHANNEL_4;        //通道选择
  157.                 DMA_UART1_RX.Init.Direction                         = DMA_PERIPH_TO_MEMORY; //从外设到内存
  158.                 DMA_UART1_RX.Init.PeriphInc                         = DMA_PINC_DISABLE;         //外设地址寄存器不变
  159.                 DMA_UART1_RX.Init.MemInc                                 = DMA_MINC_ENABLE;                 //内存地址寄存器递增
  160.                 DMA_UART1_RX.Init.PeriphDataAlignment         = DMA_PDATAALIGN_BYTE;        //外设地址宽度8位
  161.                 DMA_UART1_RX.Init.MemDataAlignment                 = DMA_MDATAALIGN_BYTE;        //内存地址宽度8位
  162.                 DMA_UART1_RX.Init.Mode                                         = DMA_NORMAL;                         //正常模式 (即一次传输完成后,需重新状态该通道)
  163.                 DMA_UART1_RX.Init.Priority                                 = DMA_PRIORITY_LOW;                //通道优先级低
  164.                 DMA_UART1_RX.Init.FIFOMode                                = DMA_FIFOMODE_DISABLE;              
  165.                 DMA_UART1_RX.Init.FIFOThreshold                        = DMA_FIFO_THRESHOLD_FULL;      
  166.                 DMA_UART1_RX.Init.MemBurst                                = DMA_MBURST_SINGLE; //存储器突发单次传输
  167.                 DMA_UART1_RX.Init.PeriphBurst                        = DMA_PBURST_SINGLE; //外设突发单次传输
  168.                 HAL_DMA_Init(&DMA_UART1_RX);
  169.                 __HAL_LINKDMA(huart, hdmarx, DMA_UART1_RX);
  170.                
  171.                 //USART1_TX DMA初始化
  172.                 DMA_UART1_TX.Instance                                         = DMA2_Stream7;
  173.                 DMA_UART1_TX.Init.Channel                                = DMA_CHANNEL_4;        //通道选择
  174.                 DMA_UART1_TX.Init.Direction                         = DMA_MEMORY_TO_PERIPH; //从内存到外设
  175.                 DMA_UART1_TX.Init.PeriphInc                         = DMA_PINC_DISABLE;                //外设地址寄存器不变
  176.                 DMA_UART1_TX.Init.MemInc                                 = DMA_MINC_ENABLE;                //内存地址寄存器递增
  177.                 DMA_UART1_TX.Init.PeriphDataAlignment         = DMA_PDATAALIGN_BYTE;        //外设地址宽度8位
  178.                 DMA_UART1_TX.Init.MemDataAlignment                 = DMA_MDATAALIGN_BYTE;        //内存地址宽度8位
  179.                 DMA_UART1_TX.Init.Mode                                         = DMA_NORMAL;                        //正常模式
  180.                 DMA_UART1_TX.Init.Priority                                 = DMA_PRIORITY_LOW;                //通道优先级低
  181.                 DMA_UART1_TX.Init.FIFOMode                                = DMA_FIFOMODE_DISABLE;              
  182.                 DMA_UART1_TX.Init.FIFOThreshold                        = DMA_FIFO_THRESHOLD_FULL;      
  183.                 DMA_UART1_TX.Init.MemBurst                                = DMA_MBURST_SINGLE; //存储器突发单次传输
  184.                 DMA_UART1_TX.Init.PeriphBurst                        = DMA_PBURST_SINGLE; //外设突发单次传输
  185.                 HAL_DMA_Init(&DMA_UART1_TX);
  186.                 __HAL_LINKDMA(huart, hdmatx, DMA_UART1_TX);
  187.                
  188.                 //关闭USART2中断
  189.                 HAL_NVIC_DisableIRQ(USART2_IRQn);
  190.                
  191.                 //USART1中断和优先级配置
  192.                 HAL_NVIC_EnableIRQ(USART1_IRQn); //使能USART1中断通道
  193.                 HAL_NVIC_SetPriority(USART1_IRQn, 3, 3); //抢占优先级3,子优先级3
  194.                
  195.                 //USART1的DMA中断和优先级配置
  196.                 HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 5, 0);
  197.                 HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);
  198.                 HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 5, 0);
  199.                 HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn);
  200.         }
  201.         */
  202.         if(huart->Instance==USART2)//如果是串口2,进行串口2 MSP初始化
  203.         {
  204.                 //时钟使能
  205.                 __HAL_RCC_GPIOA_CLK_ENABLE();                        //使能GPIOA时钟
  206.                 __HAL_RCC_USART2_CLK_ENABLE();                        //使能USART2时钟
  207.                 __HAL_RCC_DMA2_CLK_ENABLE();                        //使能DMA2时钟
  208.                
  209.                 //端口初始化
  210.                 GPIO_Initure.Pin                =        GPIO_PIN_2;                        //PA2
  211.                 GPIO_Initure.Mode                =        GPIO_MODE_AF_PP;        //复用推挽输出
  212.                 GPIO_Initure.Pull                =        GPIO_PULLUP;                //上拉
  213.                 GPIO_Initure.Speed                =        GPIO_SPEED_FAST;        //高速
  214.                 GPIO_Initure.Alternate        =        GPIO_AF7_USART2;        //复用为USART2
  215.                 HAL_GPIO_Init(GPIOA, &GPIO_Initure);                         //初始化PA2

  216.                 GPIO_Initure.Pin                =         GPIO_PIN_3;                 //PA3
  217.                 HAL_GPIO_Init(GPIOA, &GPIO_Initure);                         //初始化PA3
  218.                
  219.                 //USART2_RX DMA初始化
  220.                 DMA_UART2_RX.Instance                                         = DMA1_Stream5;
  221.                 DMA_UART2_RX.Init.Channel                                = DMA_CHANNEL_4;        //通道选择
  222.                 DMA_UART2_RX.Init.Direction                         = DMA_PERIPH_TO_MEMORY; //从外设到内存
  223.                 DMA_UART2_RX.Init.PeriphInc                         = DMA_PINC_DISABLE;         //外设地址寄存器不变
  224.                 DMA_UART2_RX.Init.MemInc                                 = DMA_MINC_ENABLE;                 //内存地址寄存器递增
  225.                 DMA_UART2_RX.Init.PeriphDataAlignment         = DMA_PDATAALIGN_BYTE;        //外设地址宽度8位
  226.                 DMA_UART2_RX.Init.MemDataAlignment                 = DMA_MDATAALIGN_BYTE;        //内存地址宽度8位
  227.                 DMA_UART2_RX.Init.Mode                                         = DMA_NORMAL;                         //正常模式 (即一次传输完成后,需重新状态该通道)
  228.                 DMA_UART2_RX.Init.Priority                                 = DMA_PRIORITY_LOW;                //通道优先级低
  229.                 DMA_UART2_RX.Init.FIFOMode                                = DMA_FIFOMODE_DISABLE;              
  230.                 DMA_UART2_RX.Init.FIFOThreshold                        = DMA_FIFO_THRESHOLD_FULL;      
  231.                 DMA_UART2_RX.Init.MemBurst                                = DMA_MBURST_SINGLE; //存储器突发单次传输
  232.                 DMA_UART2_RX.Init.PeriphBurst                        = DMA_PBURST_SINGLE; //外设突发单次传输
  233.                 HAL_DMA_Init(&DMA_UART2_RX);
  234.                 __HAL_LINKDMA(huart, hdmarx, DMA_UART2_RX);
  235.                
  236.                 //USART2_TX DMA初始化
  237.                 DMA_UART2_TX.Instance                                         = DMA1_Stream6;
  238.                 DMA_UART2_TX.Init.Channel                                = DMA_CHANNEL_4;        //通道选择
  239.                 DMA_UART2_TX.Init.Direction                         = DMA_MEMORY_TO_PERIPH; //从内存到外设
  240.                 DMA_UART2_TX.Init.PeriphInc                         = DMA_PINC_DISABLE;                //外设地址寄存器不变
  241.                 DMA_UART2_TX.Init.MemInc                                 = DMA_MINC_ENABLE;                //内存地址寄存器递增
  242.                 DMA_UART2_TX.Init.PeriphDataAlignment         = DMA_PDATAALIGN_BYTE;        //外设地址宽度8位
  243.                 DMA_UART2_TX.Init.MemDataAlignment                 = DMA_MDATAALIGN_BYTE;        //内存地址宽度8位
  244.                 DMA_UART2_TX.Init.Mode                                         = DMA_NORMAL;                        //正常模式
  245.                 DMA_UART2_TX.Init.Priority                                 = DMA_PRIORITY_LOW;                //通道优先级低
  246.                 DMA_UART2_TX.Init.FIFOMode                                = DMA_FIFOMODE_DISABLE;              
  247.                 DMA_UART2_TX.Init.FIFOThreshold                        = DMA_FIFO_THRESHOLD_FULL;      
  248.                 DMA_UART2_TX.Init.MemBurst                                = DMA_MBURST_SINGLE; //存储器突发单次传输
  249.                 DMA_UART2_TX.Init.PeriphBurst                        = DMA_PBURST_SINGLE; //外设突发单次传输
  250.                 HAL_DMA_Init(&DMA_UART2_TX);
  251.                 __HAL_LINKDMA(huart, hdmatx, DMA_UART2_TX);
  252.                
  253.                 //关闭USART1中断
  254.                 HAL_NVIC_DisableIRQ(USART1_IRQn);
  255.                
  256.                 //USART2中断和优先级配置
  257.                 HAL_NVIC_EnableIRQ(USART2_IRQn); //使能USART2中断通道
  258.                 HAL_NVIC_SetPriority(USART2_IRQn, 3, 3); //抢占优先级3,子优先级3
  259.                
  260.                 //USART2的DMA中断和优先级配置
  261.                 HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 5, 0);
  262.                 HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
  263.                 HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 5, 0);
  264.                 HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);
  265.         }
  266. }

  267. //UART底层复位
  268. //此函数会被HAL_UART_DeInit()调用
  269. //huart:串口句柄
  270. void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
  271. {
  272.   /*
  273.   if(huart->Instance==USART1)
  274.   {
  275.     //串口1时钟关闭
  276.     __HAL_RCC_USART1_CLK_DISABLE();
  277.   
  278.         //端口复位
  279.     HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);

  280.     //串口1的DMA关闭
  281.     HAL_DMA_DeInit(huart->hdmarx);
  282.     HAL_DMA_DeInit(huart->hdmatx);

  283.     //串口1中断关闭
  284.     HAL_NVIC_DisableIRQ(USART1_IRQn);
  285.   }
  286.   */
  287.   if(huart->Instance==USART2)
  288.   {
  289.     //串口2时钟关闭
  290.     __HAL_RCC_USART2_CLK_DISABLE();
  291.   
  292.         //端口复位
  293.     HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);

  294.     //串口2的DMA关闭
  295.     HAL_DMA_DeInit(huart->hdmarx);
  296.     HAL_DMA_DeInit(huart->hdmatx);

  297.     //串口2中断关闭
  298.     HAL_NVIC_DisableIRQ(USART2_IRQn);
  299.   }
  300. }

  301. /*
  302. //USART1的DMA发送中断
  303.                                                                                                                                                                                                                                                                                
  304. {
  305.         HAL_DMA_IRQHandler(&DMA_UART1_TX);
  306.         //HAL_DMA_IRQHandler(&DMA_UART2_TX);
  307. }

  308. //USART1的DMA接收中断
  309. void DMA2_Stream5_IRQHandler(void)
  310. {
  311.         HAL_DMA_IRQHandler(&DMA_UART1_RX);
  312.         //HAL_DMA_IRQHandler(&DMA_UART2_RX);
  313. }
  314. */

  315. //USART2的DMA发送中断
  316. void DMA1_Stream6_IRQHandler(void)
  317. {
  318.         //HAL_DMA_IRQHandler(&DMA_UART1_TX);
  319.         HAL_DMA_IRQHandler(&DMA_UART2_TX);
  320. }

  321. //USART2的DMA接收中断
  322. void DMA1_Stream5_IRQHandler(void)
  323. {
  324.         //HAL_DMA_IRQHandler(&DMA_UART1_RX);
  325.         HAL_DMA_IRQHandler(&DMA_UART2_RX);
  326. }

  327. /*
  328. //串口1的DMA发送
  329. void UART1_TX_DMA_Send(u8 *buffer, u16 length)
  330. {
  331.     //等待上一次的数据发送完毕
  332.     while(HAL_DMA_GetState(&DMA_UART1_TX) == HAL_DMA_STATE_BUSY);

  333.     //关闭DMA
  334.     __HAL_DMA_DISABLE(&DMA_UART1_TX);

  335.     //开始发送数据
  336.     HAL_UART_Transmit_DMA(&UART1_Handler, buffer, length);
  337. }
  338. */

  339. //串口2的DMA发送
  340. void UART2_TX_DMA_Send(u8 *buffer, u16 length)
  341. {
  342.     //等待上一次的数据发送完毕
  343.     while(HAL_DMA_GetState(&DMA_UART2_TX) == HAL_DMA_STATE_BUSY);

  344.     //关闭DMA
  345.     __HAL_DMA_DISABLE(&DMA_UART2_TX);

  346.     //开始发送数据
  347.     HAL_UART_Transmit_DMA(&UART2_Handler, buffer, length);
  348. }

  349. /*
  350. //串口1的DMA发送printf
  351. void Debug_printf_1(const char *format, ...)
  352. {
  353.         uint32_t length = 0;
  354.         va_list args;
  355.        
  356.         __va_start(args, format);
  357.        
  358.         length = vsnprintf((char*)usart1_tx_buffer, sizeof(usart1_tx_buffer), (char*)format, args);
  359.        
  360.         UART1_TX_DMA_Send(usart1_tx_buffer, length);
  361. }
  362. */

  363. //串口2的DMA发送printf
  364. void Debug_printf_2(const char *format, ...)
  365. {
  366.         uint32_t length = 0;
  367.         va_list args;
  368.        
  369.         __va_start(args, format);
  370.        
  371.         length = vsnprintf((char*)usart2_tx_buffer, sizeof(usart2_tx_buffer), (char*)format, args);
  372.        
  373.         UART2_TX_DMA_Send(usart2_tx_buffer, length);
  374. }

  375. //串口接收空闲中断
  376. void UsartReceive_IDLE(UART_HandleTypeDef *huart)  
  377. {
  378.         uint32_t i = 0;
  379.        
  380.         //当触发了串口空闲中断
  381.     if((__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET))
  382.     {
  383. //                if(huart->Instance == USART1)
  384. //                {
  385. //                        /* 1.清除标志 */
  386. //                        __HAL_UART_CLEAR_IDLEFLAG(huart); //清除空闲标志
  387. //                       
  388. //                //        SCB_DisableDCache(); //对于F7带Cache需要注意,读取DMA前先关闭
  389. //                       
  390. //                        /* 2.读取DMA */
  391. //                        HAL_UART_DMAStop(huart); //先停止DMA,暂停接收
  392. //                        //这里应注意数据接收不要大于 USART_REC_LEN
  393. //                        usart1_rx_len = USART_DMA_RX_BUFFER_MAXIMUM - (__HAL_DMA_GET_COUNTER(&DMA_UART1_RX)); //接收个数等于接收缓冲区总大小减已经接收的个数
  394. //                       
  395. //                        /* 3.搬移数据进行其他处理 */
  396. //                        memcpy(usart1_tx_buffer, usart1_rx_buffer, usart1_rx_len);
  397. //                        usart1_rx_flag = 1; //标志已经成功接收到一包等待处理
  398. //                       

  399. //                        for(u16 i=0;i<usart1_rx_len;i++)
  400. //                        {
  401. //                                command[i]=usart1_rx_buffer[i];
  402. //                                DT_Commad_Receive_Prepare(command[i]);
  403. //                        }

  404. //                //        SCB_EnableDCache();        //对于F7带Cache需要注意,读取DMA完成后再打开
  405. //                       
  406. //                        /* 4.开启新的一次DMA接收 */
  407. //                        HAL_UART_Receive_DMA(huart, usart1_rx_buffer, USART_DMA_RX_BUFFER_MAXIMUM); //启动接收  
  408. //                }

  409.                 if(huart->Instance == USART2)
  410.                 {
  411.                         /* 1.清除标志 */
  412.                         __HAL_UART_CLEAR_IDLEFLAG(huart); //清除空闲标志
  413.                        
  414.                 //        SCB_DisableDCache(); //对于F7带Cache需要注意,读取DMA前先关闭
  415.                        
  416.                         /* 2.读取DMA */
  417.                         HAL_UART_DMAStop(huart); //先停止DMA,暂停接收
  418.                         //这里应注意数据接收不要大于 USART_REC_LEN
  419.                         usart2_rx_len = USART_DMA_RX_BUFFER_MAXIMUM - (__HAL_DMA_GET_COUNTER(&DMA_UART2_RX)); //接收个数等于接收缓冲区总大小减已经接收的个数
  420.                        
  421.                         /* 3.搬移数据进行其他处理 */
  422.                         memcpy(usart2_tx_buffer, usart2_rx_buffer, usart2_rx_len);
  423.                         usart2_rx_flag = 1; //标志已经成功接收到一包等待处理
  424.                        

  425.                         for(u16 i=0;i<usart1_rx_len;i++)
  426.                         {
  427.                                 command[i]=usart1_rx_buffer[i];
  428.                                 DT_Commad_Receive_Prepare(command[i]);
  429.                         }

  430.                 //        SCB_EnableDCache();        //对于F7带Cache需要注意,读取DMA完成后再打开
  431.                        
  432.                         /* 4.开启新的一次DMA接收 */
  433.                         HAL_UART_Receive_DMA(huart, usart2_rx_buffer, USART_DMA_RX_BUFFER_MAXIMUM); //启动接收  
  434.                 }
  435.     }
  436. }  

  437. /*
  438. //串口1中断服务程序
  439. void USART1_IRQHandler(void)                       
  440. {
  441.         u8 Res;
  442. #if SYSTEM_SUPPORT_OS                 //使用OS
  443.         OSIntEnter();   
  444. #endif
  445.        
  446.         //串口空闲中断处理
  447.         UsartReceive_IDLE(&UART1_Handler);
  448.        
  449.         //HAL库串口处理
  450.         HAL_UART_IRQHandler(&UART1_Handler);       
  451.        
  452. #if SYSTEM_SUPPORT_OS                 //使用OS
  453.         OSIntExit();                                                                                           
  454. #endif
  455. }
  456. */

  457. //串口2中断服务程序
  458. void USART2_IRQHandler(void)                       
  459. {
  460.         u8 Res;
  461. #if SYSTEM_SUPPORT_OS                 //使用OS
  462.         OSIntEnter();   
  463. #endif
  464.        
  465.         //串口空闲中断处理
  466.         UsartReceive_IDLE(&UART2_Handler);
  467.        
  468.         //HAL库串口处理
  469.         HAL_UART_IRQHandler(&UART2_Handler);       
  470.        
  471. #if SYSTEM_SUPPORT_OS                 //使用OS
  472.         OSIntExit();                                                                                           
  473. #endif
  474. }








复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2020-8-19
在线时间
335 小时
发表于 2021-7-5 13:54:06 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-7-6 00:34:24 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 10:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表