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)观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新【消息订阅】。在该模式中,发生改变的对象称为观察目标,被通知的对象称为观察者&…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
