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)观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新【消息订阅】。在该模式中,发生改变的对象称为观察目标,被通知的对象称为观察者&…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
ubuntu中安装conda的后遗症
缘由: 在编译rk3588的sdk时,遇到编译buildroot失败,提示如下: 提示缺失expect,但是实测相关工具是在的,如下显示: 然后查找借助各个ai工具,重新安装相关的工具,依然无解。 解决&am…...
