STM32CubeMX stm32不限长度使用DMA收发串口数据
STM32CubeMX 配置

 
代码
stm32h7xx_it.c
/*** @brief This function handles UART7 global interrupt.*/
void UART7_IRQHandler(void)
{/* USER CODE BEGIN UART7_IRQn 0 */if (UART7 == huart7.Instance) // 判断是否是空闲中断{if (__HAL_UART_GET_FLAG(&huart7, UART_FLAG_RXNE) != RESET) // 接收中断的标志位{printf("\r\nUART7 接收中断 可能超过缓冲区长度了 重启串口 \r\n");MX_UART7_Init();    //因为溢出 造成 串口不能恢复正常接收 所以重新初始化一下receives_uaru_7();        // 启用中断}if (__HAL_UART_GET_FLAG(&huart7, UART_FLAG_IDLE) == SET) // 触发空闲中断{HAL_UART_DMAStop(&huart7); // 停止本次DMA传输//printf("\r\nUART7 检测到空闲\r\n");UART_7_Callback(&huart7); // 调用用户空闲中断回调函数receives_uaru_7();        // 启用中断}}/* USER CODE END UART7_IRQn 0 */HAL_UART_IRQHandler(&huart7);/* USER CODE BEGIN UART7_IRQn 1 *//* USER CODE END UART7_IRQn 1 */
}

加入头文件
 
 uart.h
//*********************串口7 */
// UART接收中断变量
#define RXBUFFERSIZE_7 1024          // 缓冲区长度
extern uint8_t RxBuff_7[RXBUFFERSIZE_7]; // 接收后的数据
void UART_7_Callback(UART_HandleTypeDef *huart);//空闲中断
void receives_uaru_7(void);//接收
void uart7_printf(const char *format, ...);//打印
//*********************串口7 */

 uart.c
uint8_t RxBuff_7[RXBUFFERSIZE_7]; // 接收后的数据

    /* USER CODE BEGIN UART7_Init 2 */__HAL_UART_ENABLE_IT(&huart7, UART_IT_RXNE); // 开启接收中断__HAL_UART_ENABLE_IT(&huart7, UART_IT_IDLE); // 使能空闲中断receives_uaru_7();                           // 接收数据/* USER CODE END UART7_Init 2 */

/*用户自定义串口空闲中断回调函数
*/
void UART_7_Callback(UART_HandleTypeDef *huart)
{// 计算接收到的数据长度uint32_t data_length = RXBUFFERSIZE_7 - __HAL_DMA_GET_COUNTER(&hdma_uart7_rx);printf("数据长度(length = %d): ", data_length);printf("\r\n");// HAL_UART_Transmit(&huart1, RxBuff_7, data_length, 0x200);//串口1发送 0x200超时时间RxBuff_7[data_length] = '\0';//尾部加0//{"a":6}cJSON *json;json = cJSON_Parse((const char *)RxBuff_7);if (json != NULL){cJSON *robj = cJSON_GetObjectItem(json, "a");printf("a: %d\r\n", robj->valueint);cJSON_Delete(json);}
}
// 删除中断标志 启用 DMA 接收
void receives_uaru_7(void)
{__HAL_UART_CLEAR_IDLEFLAG(&huart7); // 清除空闲中断标志)// 重启开始DMA传输HAL_UART_Receive_DMA(&huart7, (uint8_t *)RxBuff_7, RXBUFFERSIZE_7 - 1);//预留一个字节尾部放'0'
}

完整代码
usart.c
/* USER CODE BEGIN Header */
/********************************************************************************* @file    usart.c* @brief   This file provides code for the configuration*          of the USART instances.******************************************************************************* @attention** Copyright (c) 2024 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "usart.h"/* USER CODE BEGIN 0 */#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"// #include "stdio.h"
// #include <string.h>
// #include <stdarg.h>
void cmd(char *str);
//*********************串口1 */
#define RXBUFFERSIZE_1 1          // 每接收1个字节中断1次
uint8_t RxBuff_1[RXBUFFERSIZE_1]; // 中断后数据储存位置
// 启动中断
void receives_uaru_1(void);
// UART2接收缓冲区
#define MAX_LEN_1 10
char data1[MAX_LEN_1];
// 已经接收的长度
uint8_t data_len_1 = 0;//串口7
uint8_t RxBuff_7[RXBUFFERSIZE_7]; // 接收后的数据
/* USER CODE END 0 */UART_HandleTypeDef huart7;
UART_HandleTypeDef huart1;
DMA_HandleTypeDef hdma_uart7_rx;
DMA_HandleTypeDef hdma_uart7_tx;/* UART7 init function */
void MX_UART7_Init(void)
{/* USER CODE BEGIN UART7_Init 0 *//* USER CODE END UART7_Init 0 *//* USER CODE BEGIN UART7_Init 1 *//* USER CODE END UART7_Init 1 */huart7.Instance = UART7;huart7.Init.BaudRate = 750000;huart7.Init.WordLength = UART_WORDLENGTH_8B;huart7.Init.StopBits = UART_STOPBITS_1;huart7.Init.Parity = UART_PARITY_NONE;huart7.Init.Mode = UART_MODE_TX_RX;huart7.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart7.Init.OverSampling = UART_OVERSAMPLING_16;huart7.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;huart7.Init.ClockPrescaler = UART_PRESCALER_DIV1;huart7.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;if (HAL_UART_Init(&huart7) != HAL_OK){Error_Handler();}if (HAL_UARTEx_SetTxFifoThreshold(&huart7, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK){Error_Handler();}if (HAL_UARTEx_SetRxFifoThreshold(&huart7, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK){Error_Handler();}if (HAL_UARTEx_DisableFifoMode(&huart7) != HAL_OK){Error_Handler();}/* USER CODE BEGIN UART7_Init 2 */__HAL_UART_ENABLE_IT(&huart7, UART_IT_RXNE); // 开启接收中断__HAL_UART_ENABLE_IT(&huart7, UART_IT_IDLE); // 使能空闲中断receives_uaru_7();                           // 接收数据/* USER CODE END UART7_Init 2 */
}
/* USART1 init function */void MX_USART1_UART_Init(void)
{/* USER CODE BEGIN USART1_Init 0 *//* USER CODE END USART1_Init 0 *//* USER CODE BEGIN USART1_Init 1 *//* USER CODE END USART1_Init 1 */huart1.Instance = USART1;huart1.Init.BaudRate = 750000;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK){Error_Handler();}if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK){Error_Handler();}if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN USART1_Init 2 */// 启用接收中断receives_uaru_1();/* USER CODE END USART1_Init 2 */
}void HAL_UART_MspInit(UART_HandleTypeDef *uartHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};if (uartHandle->Instance == UART7){/* USER CODE BEGIN UART7_MspInit 0 *//* USER CODE END UART7_MspInit 0 *//** Initializes the peripherals clock*/PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_UART7;PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK){Error_Handler();}/* UART7 clock enable */__HAL_RCC_UART7_CLK_ENABLE();__HAL_RCC_GPIOF_CLK_ENABLE();/**UART7 GPIO ConfigurationPF6     ------> UART7_RXPF7     ------> UART7_TX*/GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF7_UART7;HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);/* UART7 DMA Init *//* UART7_RX Init */hdma_uart7_rx.Instance = DMA1_Stream5;hdma_uart7_rx.Init.Request = DMA_REQUEST_UART7_RX;hdma_uart7_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;hdma_uart7_rx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_uart7_rx.Init.MemInc = DMA_MINC_ENABLE;hdma_uart7_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;hdma_uart7_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;hdma_uart7_rx.Init.Mode = DMA_NORMAL;hdma_uart7_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;hdma_uart7_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;if (HAL_DMA_Init(&hdma_uart7_rx) != HAL_OK){Error_Handler();}__HAL_LINKDMA(uartHandle, hdmarx, hdma_uart7_rx);/* UART7_TX Init */hdma_uart7_tx.Instance = DMA2_Stream4;hdma_uart7_tx.Init.Request = DMA_REQUEST_UART7_TX;hdma_uart7_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;hdma_uart7_tx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_uart7_tx.Init.MemInc = DMA_MINC_ENABLE;hdma_uart7_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;hdma_uart7_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;hdma_uart7_tx.Init.Mode = DMA_NORMAL;hdma_uart7_tx.Init.Priority = DMA_PRIORITY_HIGH;hdma_uart7_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;if (HAL_DMA_Init(&hdma_uart7_tx) != HAL_OK){Error_Handler();}__HAL_LINKDMA(uartHandle, hdmatx, hdma_uart7_tx);/* UART7 interrupt Init */HAL_NVIC_SetPriority(UART7_IRQn, 3, 0);HAL_NVIC_EnableIRQ(UART7_IRQn);/* USER CODE BEGIN UART7_MspInit 1 *//* USER CODE END UART7_MspInit 1 */}else if (uartHandle->Instance == USART1){/* USER CODE BEGIN USART1_MspInit 0 *//* USER CODE END USART1_MspInit 0 *//** Initializes the peripherals clock*/PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1;PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK){Error_Handler();}/* USART1 clock enable */__HAL_RCC_USART1_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/**USART1 GPIO ConfigurationPB14     ------> USART1_TXPB15     ------> USART1_RX*/GPIO_InitStruct.Pin = GPIO_PIN_14 | GPIO_PIN_15;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF4_USART1;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/* USART1 interrupt Init */HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);HAL_NVIC_EnableIRQ(USART1_IRQn);/* USER CODE BEGIN USART1_MspInit 1 *//* USER CODE END USART1_MspInit 1 */}
}void HAL_UART_MspDeInit(UART_HandleTypeDef *uartHandle)
{if (uartHandle->Instance == UART7){/* USER CODE BEGIN UART7_MspDeInit 0 *//* USER CODE END UART7_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_UART7_CLK_DISABLE();/**UART7 GPIO ConfigurationPF6     ------> UART7_RXPF7     ------> UART7_TX*/HAL_GPIO_DeInit(GPIOF, GPIO_PIN_6 | GPIO_PIN_7);/* UART7 DMA DeInit */HAL_DMA_DeInit(uartHandle->hdmarx);HAL_DMA_DeInit(uartHandle->hdmatx);/* UART7 interrupt Deinit */HAL_NVIC_DisableIRQ(UART7_IRQn);/* USER CODE BEGIN UART7_MspDeInit 1 *//* USER CODE END UART7_MspDeInit 1 */}else if (uartHandle->Instance == USART1){/* USER CODE BEGIN USART1_MspDeInit 0 *//* USER CODE END USART1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_USART1_CLK_DISABLE();/**USART1 GPIO ConfigurationPB14     ------> USART1_TXPB15     ------> USART1_RX*/HAL_GPIO_DeInit(GPIOB, GPIO_PIN_14 | GPIO_PIN_15);/* USART1 interrupt Deinit */HAL_NVIC_DisableIRQ(USART1_IRQn);/* USER CODE BEGIN USART1_MspDeInit 1 *//* USER CODE END USART1_MspDeInit 1 */}
}/* USER CODE BEGIN 1 */
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
/*串口7发送数据*/
void uart7_printf(const char *format, ...)
{char buffer[256];va_list args;va_start(args, format);vsnprintf(buffer, sizeof(buffer), format, args);va_end(args);// HAL_UART_Transmit(&huart7, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);//串口发送HAL_UART_Transmit_DMA(&huart7, (uint8_t *)buffer, strlen(buffer)); // DMA发送// uint8_t send_char[]="所想要发送的内容\n";//发送的字符串// HAL_UART_Transmit_DMA(&huart7,(uint8_t *)send_char, sizeof(send_char));//DMA发送 字节发送
}/*重定义串口接收回调函数
*/
// UART接收完成回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{// UART接收完成回调函数// 每接收一个字节中断一次if (huart->Instance == USART1){data1[data_len_1] = (char)RxBuff_1[0];data_len_1++;// 接收完成if (RxBuff_1[0] == '\n' || data_len_1 == MAX_LEN_1 - 1){                             // 接收结束为换行符data1[data_len_1] = '\0'; // 字符串结束符printf("%s", data1);cmd(data1);     // 将命令转到处理函数data_len_1 = 0; // 清空缓存}// 启用接收中断receives_uaru_1();}else if (huart->Instance == UART7) // 中断7{printf("中断\n");// receives_uaru_7(); // 启用中断}
}/*用户自定义串口空闲中断回调函数
*/
void UART_7_Callback(UART_HandleTypeDef *huart)
{// 计算接收到的数据长度uint32_t data_length = RXBUFFERSIZE_7 - __HAL_DMA_GET_COUNTER(&hdma_uart7_rx);printf("数据长度(length = %d): ", data_length);printf("\r\n");// HAL_UART_Transmit(&huart1, RxBuff_7, data_length, 0x200);//串口1发送 0x200超时时间RxBuff_7[data_length] = '\0';//尾部加0//{"a":6}cJSON *json;json = cJSON_Parse((const char *)RxBuff_7);if (json != NULL){cJSON *robj = cJSON_GetObjectItem(json, "a");printf("a: %d\r\n", robj->valueint);cJSON_Delete(json);}
}
// 删除中断标志 启用 DMA 接收
void receives_uaru_7(void)
{__HAL_UART_CLEAR_IDLEFLAG(&huart7); // 清除空闲中断标志)// 重启开始DMA传输HAL_UART_Receive_DMA(&huart7, (uint8_t *)RxBuff_7, RXBUFFERSIZE_7 - 1);//预留一个字节尾部放'0'
}
// 串口1启用中断服务程序
void receives_uaru_1(void)
{HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff_1, RXBUFFERSIZE_1);// 该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
}void cmd(char *str)
{printf("处理数据\n");printf("\n");
}//__use_no_semihosting was requested, but _ttywrch was
void _ttywrch(int ch)
{ch = ch;
}/* USER CODE END 1 */stm32h7xx_it.c
/* USER CODE BEGIN Header */
/********************************************************************************* @file    stm32h7xx_it.c* @brief   Interrupt Service Routines.******************************************************************************* @attention** Copyright (c) 2024 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32h7xx_it.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "usart.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD *//* USER CODE END TD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//* External variables --------------------------------------------------------*/
extern DMA_HandleTypeDef hdma_uart7_rx;
extern DMA_HandleTypeDef hdma_uart7_tx;
extern UART_HandleTypeDef huart7;
extern UART_HandleTypeDef huart1;
extern TIM_HandleTypeDef htim6;/* USER CODE BEGIN EV *//* USER CODE END EV *//******************************************************************************/
/*           Cortex Processor Interruption and Exception Handlers          */
/******************************************************************************/
/*** @brief This function handles Non maskable interrupt.*/
void NMI_Handler(void)
{/* USER CODE BEGIN NonMaskableInt_IRQn 0 *//* USER CODE END NonMaskableInt_IRQn 0 *//* USER CODE BEGIN NonMaskableInt_IRQn 1 */while (1){}/* USER CODE END NonMaskableInt_IRQn 1 */
}/*** @brief This function handles Hard fault interrupt.*/
void HardFault_Handler(void)
{/* USER CODE BEGIN HardFault_IRQn 0 *//* USER CODE END HardFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_HardFault_IRQn 0 *//* USER CODE END W1_HardFault_IRQn 0 */}
}/*** @brief This function handles Memory management fault.*/
void MemManage_Handler(void)
{/* USER CODE BEGIN MemoryManagement_IRQn 0 *//* USER CODE END MemoryManagement_IRQn 0 */while (1){/* USER CODE BEGIN W1_MemoryManagement_IRQn 0 *//* USER CODE END W1_MemoryManagement_IRQn 0 */}
}/*** @brief This function handles Pre-fetch fault, memory access fault.*/
void BusFault_Handler(void)
{/* USER CODE BEGIN BusFault_IRQn 0 *//* USER CODE END BusFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_BusFault_IRQn 0 *//* USER CODE END W1_BusFault_IRQn 0 */}
}/*** @brief This function handles Undefined instruction or illegal state.*/
void UsageFault_Handler(void)
{/* USER CODE BEGIN UsageFault_IRQn 0 *//* USER CODE END UsageFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_UsageFault_IRQn 0 *//* USER CODE END W1_UsageFault_IRQn 0 */}
}/*** @brief This function handles System service call via SWI instruction.*/
void SVC_Handler(void)
{/* USER CODE BEGIN SVCall_IRQn 0 *//* USER CODE END SVCall_IRQn 0 *//* USER CODE BEGIN SVCall_IRQn 1 *//* USER CODE END SVCall_IRQn 1 */
}/*** @brief This function handles Debug monitor.*/
void DebugMon_Handler(void)
{/* USER CODE BEGIN DebugMonitor_IRQn 0 *//* USER CODE END DebugMonitor_IRQn 0 *//* USER CODE BEGIN DebugMonitor_IRQn 1 *//* USER CODE END DebugMonitor_IRQn 1 */
}/*** @brief This function handles Pendable request for system service.*/
void PendSV_Handler(void)
{/* USER CODE BEGIN PendSV_IRQn 0 *//* USER CODE END PendSV_IRQn 0 *//* USER CODE BEGIN PendSV_IRQn 1 *//* USER CODE END PendSV_IRQn 1 */
}/*** @brief This function handles System tick timer.*/
void SysTick_Handler(void)
{/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 *//* USER CODE BEGIN SysTick_IRQn 1 *//* USER CODE END SysTick_IRQn 1 */
}/******************************************************************************/
/* STM32H7xx Peripheral Interrupt Handlers                                    */
/* Add here the Interrupt Handlers for the used peripherals.                  */
/* For the available peripheral interrupt handler names,                      */
/* please refer to the startup file (startup_stm32h7xx.s).                    */
/******************************************************************************//*** @brief This function handles DMA1 stream5 global interrupt.*/
void DMA1_Stream5_IRQHandler(void)
{/* USER CODE BEGIN DMA1_Stream5_IRQn 0 *//* USER CODE END DMA1_Stream5_IRQn 0 */HAL_DMA_IRQHandler(&hdma_uart7_rx);/* USER CODE BEGIN DMA1_Stream5_IRQn 1 *//* USER CODE END DMA1_Stream5_IRQn 1 */
}/*** @brief This function handles USART1 global interrupt.*/
void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 *//* USER CODE END USART1_IRQn 0 */HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 *//* USER CODE END USART1_IRQn 1 */
}/*** @brief This function handles TIM6 global interrupt, DAC1_CH1 and DAC1_CH2 underrun error interrupts.*/
void TIM6_DAC_IRQHandler(void)
{/* USER CODE BEGIN TIM6_DAC_IRQn 0 *//* USER CODE END TIM6_DAC_IRQn 0 */HAL_TIM_IRQHandler(&htim6);/* USER CODE BEGIN TIM6_DAC_IRQn 1 *//* USER CODE END TIM6_DAC_IRQn 1 */
}/*** @brief This function handles DMA2 stream4 global interrupt.*/
void DMA2_Stream4_IRQHandler(void)
{/* USER CODE BEGIN DMA2_Stream4_IRQn 0 *//* USER CODE END DMA2_Stream4_IRQn 0 */HAL_DMA_IRQHandler(&hdma_uart7_tx);/* USER CODE BEGIN DMA2_Stream4_IRQn 1 *//* USER CODE END DMA2_Stream4_IRQn 1 */
}/*** @brief This function handles UART7 global interrupt.*/
void UART7_IRQHandler(void)
{/* USER CODE BEGIN UART7_IRQn 0 */if (UART7 == huart7.Instance) // 判断是否是空闲中断{if (__HAL_UART_GET_FLAG(&huart7, UART_FLAG_RXNE) != RESET) // 接收中断的标志位{printf("\r\nUART7 接收中断 可能超过缓冲区长度了 重启串口 \r\n");MX_UART7_Init();    //因为溢出 造成 串口不能恢复正常接收 所以重新初始化一下receives_uaru_7();        // 启用中断}if (__HAL_UART_GET_FLAG(&huart7, UART_FLAG_IDLE) == SET) // 触发空闲中断{HAL_UART_DMAStop(&huart7); // 停止本次DMA传输//printf("\r\nUART7 检测到空闲\r\n");UART_7_Callback(&huart7); // 调用用户空闲中断回调函数receives_uaru_7();        // 启用中断}}/* USER CODE END UART7_IRQn 0 */HAL_UART_IRQHandler(&huart7);/* USER CODE BEGIN UART7_IRQn 1 *//* USER CODE END UART7_IRQn 1 */
}/* USER CODE BEGIN 1 *//* USER CODE END 1 */usart.h
/* USER CODE BEGIN Header */
/********************************************************************************* @file    usart.h* @brief   This file contains all the function prototypes for*          the usart.c file******************************************************************************* @attention** Copyright (c) 2024 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __USART_H__
#define __USART_H__#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"/* USER CODE BEGIN Includes */
#include "stdio.h"
#include <string.h>
#include <stdarg.h>
/* USER CODE END Includes */extern UART_HandleTypeDef huart7;extern UART_HandleTypeDef huart1;/* USER CODE BEGIN Private defines *//* USER CODE END Private defines */void MX_UART7_Init(void);
void MX_USART1_UART_Init(void);/* USER CODE BEGIN Prototypes *///*********************串口7 */
// UART接收中断变量
#define RXBUFFERSIZE_7 8          // 缓冲区长度
extern uint8_t RxBuff_7[RXBUFFERSIZE_7]; // 接收后的数据
void UART_7_Callback(UART_HandleTypeDef *huart);//空闲中断
void receives_uaru_7(void);//接收
void uart7_printf(const char *format, ...);//打印
//*********************串口7 *//* USER CODE END Prototypes */#ifdef __cplusplus
}
#endif#endif /* __USART_H__ */相关文章:
 
STM32CubeMX stm32不限长度使用DMA收发串口数据
STM32CubeMX 配置 代码 stm32h7xx_it.c /*** brief This function handles UART7 global interrupt.*/ void UART7_IRQHandler(void) {/* USER CODE BEGIN UART7_IRQn 0 */if (UART7 huart7.Instance) // 判断是否是空闲中断{if (__HAL_UART_GET_FLAG(&huart7, UART_FLA…...
 
Jmeter系列之作用域、执行顺序
这一节主要解释元件作用域和执行顺序,以及整理之前说过的参数化的方式。 作用域 之前也留下了一个问题。怎么给不同的请求设置不同的Header?后续也透露了可以使用Sample Controller,结合元件的作用域来实现 在Jmeter中,元件的作…...
 
舜宇光学科技社招校招入职测评:商业推理测验真题汇总、答题要求、高分技巧
舜宇光学科技(集团)有限公司,成立于1984年,是全球领先的综合光学零件及产品制造商。2007年在香港联交所主板上市,股票代码2382.HK。公司专注于光学产品的设计、研发、生产及销售,产品广泛应用于手机、汽车、…...
C语言——构造(结构体)
指针——内存操作 我们对于内存的操作借助于 <string.h>这个库提供的内存操作函数。 内存填充 头文件: #include<string.h> 函数原型: void*memset(void *s,int c,size_t n); 函数功能: 填充s开始的堆内存空间前n个字节,使得每个字节值为c…...
 
京东2025届秋招 算法开发工程师 第2批笔试
目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间:2024/08/17 🔄 输入输出:ACM格式 ⏳ 时长:2h 本试卷还有选择题部分,但这部分比较简单就不再展示。 1. 第一题 村子里有一些桩子,从左到右高度依次为 1 , 1 2…...
 
模具监视器的技术参数有哪些
模具监视器的技术参数涵盖了多个方面,这些参数对于确保模具监视器的性能、稳定性和检测精度至关重要。以下是一些主要的技术参数: 一、显示器参数 屏幕尺寸:常见的模具监视器显示器尺寸为12.5英寸至13.5英寸,具体尺寸可能因不同…...
 
使用QGIS配置管线流向地图
一、需求概述 在管网项目中,需要进行地图配置使用QGIS显示管网的流向。 二、目标 配置一副管网地图,可以在地图上显示出每个管段的流向。 三、数据结构 管网数据: id[管线编码]source[起始节点ID]target[终点节点ID]dir[方向]1100101FT2101102FT……………………节点数据…...
白骑士的C#教学附加篇 5.1 C#开发工具
系列目录 上一篇:白骑士的C#教学实战项目篇 4.4 游戏开发 在这一部分,我们将介绍一些额外的内容和工具,以帮助您提高 C# 开发的效率和质量。掌握合适的开发工具和调试技巧,可以让您在编写和维护代码时更加高效和从容。 开发工具对…...
C++中的多线程编程和锁机制
二、多线程、锁 2.1 C语言线程库pthread(POSIX threads) 2.2.1 线程创建 pthread_create #include <pthread.h>pthread_t thread; ThreadData args {1, "Hello from parameterized thread"}; int result pthread_create(&threa…...
 
【投融界-注册安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
 
自动打电话软件给企业带来了什么?
使用机器人外呼系统肯定都是想要给自己企业带来好处和解决问题的,想让自己的企业有所改变,有更好的发展,所以才会选择使用机器人外呼系统。而它也确实没让大家失望,使用了机器人外呼系统之后确实有许多企业发生了很大改变和进步&a…...
 
聚鼎科技:新手做装饰画生意卖什么比较好
在艺术的广阔天地里,装饰画以其独特的魅力逐渐成为室内装饰不可或缺的元素。对于刚入行的新手而言,选择合适的装饰画产品至关重要,它关系到业务的成功与否。以下是一些关于新手做装饰画生意卖什么比较好的建议。 考虑到市场需求的多样性&…...
 
从零开始搭建k8s集群详细步骤
声明:本文仅作为个人记录学习k8s过程的笔记。 节点规划: 两台节点为阿里云ECS云服务器,操作系统为centos7.9,master为2v4GB,node为2v2GB,硬盘空间均为40GB。(节点基础配置不低于2V2GB) 主机名节点ip角色部…...
大模型智能体可以用来实现哪些需求?
大模型智能体可以用来实现广泛的需求,以下是一些常见的应用场景: 自然语言处理(NLP)应用 文本生成:自动撰写文章、编写代码、生成新闻摘要。 对话系统:智能客服、虚拟助手、聊天机器人。 语言翻译…...
Vue 3 组合式 API 全面讲解:defineCustomElement
Vue 3 引入的组合式 API(Composition API)为开发者提供了更加灵活和强大的代码组织能力。除了常用的 defineComponent 用于定义普通组件外,Vue 3 还提供了 defineCustomElement 函数,允许开发者定义可在 Web Components 规范下使用…...
 
SwiftUI 6.0(iOS 18)监听滚动视图视口中子视图可见性的极简方法
概览 在 SwiftUI 的应用开发中,我们有时需要监听滚动视图中子视图当前的显示状态:它们现在是被滚动到可见视口(Viewport)?或仍然是隐藏在“未知的黑暗”中呢? 在 SwiftUI 早期版本中为了得偿所愿,我们需要借助一些“取巧”的手段。不过,从 SwiftUI 6.0(iOS 18)开始情…...
 
分享五种mfc140.dll丢失如何修复?五种修复错误的详细解决办法
在Windows操作系统中,DLL(动态链接库)文件扮演着至关重要的角色,它们为应用程序提供了共享的函数和资源。其中,mfc140.dll是Microsoft Visual C 2015 Redistributable Package的一部分,对于许多使用Microso…...
 
MATLAB 手动实现投影密度法分割建筑物立面 (73)
专栏文章往期回顾,包含本文章 MATLAB 手动实现投影密度法分割建筑物立面 (73) 一、算法介绍二、算法实现1.代码2.效果总结一、算法介绍 从原始点云中,自动分割提取建筑物立面点云用于立面绘图,可以减少人为操作流程。这里从0开始,手动实现一种基于投影密度法的建筑物立…...
QT的基础数据类型(上)
本文将介绍几个QT中常用的数据类型 QString 是处理字符串的主要类 使用Unicode编码,每个字符是16位的QChar 初始化 QString的初始化方法有以下几种: //字符串常量初始化QString str1 = "Hello, World! str1";//使用构造函数初始化QString str2("Hello, Wo…...
 
【系统分析师】-综合知识-系统架构
1、设计模式 1)观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新【消息订阅】。在该模式中,发生改变的对象称为观察目标,被通知的对象称为观察者&…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
 
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
 
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
 
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
 
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
 
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
