原文为STM32F407的实现,https://blog.csdn.net/medojonh/article/details/80135567,如果要用STM32F103还需要修改部分。
在此感谢原作者!
关于CubeMx的配置可直接看原文,我省懒事直接把修改后的代码贴上来。
实现的功能是,串口接收上来的数值再发出去。
因为我用的是485,所以在发送前还是得改变一下485的使能管脚。
和原文不同的是,原文在发送后没有等待过程,我在调试时发现接收到的时候没问题,发的时候有问题。所以是需要加上等待发送完成的。
main.c
/* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart1, UsartType.RX_pData, RX_LEN);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
/* USER CODE END 2 */
usart.c
/* USER CODE BEGIN 0 */
USART_RECEIVETYPE UsartType;
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
void UsartReceive_IDLE(UART_HandleTypeDef *huart)
{
uint32_t temp;
if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_DMAStop(&huart1);
temp = huart1.hdmarx->Instance->CNDTR;
UsartType.RX_Size = RX_LEN - temp;
UsartType.RX_flag=1;
HAL_UART_Receive_DMA(&huart1,UsartType.RX_pData,RX_LEN);
}
if(UsartType.RX_flag) // Receive flag
{
UsartType.RX_flag=0; // clean flag
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_SET);
HAL_UART_Transmit_DMA(&huart1, UsartType.RX_pData, UsartType.RX_Size);
while(__HAL_UART_GET_FLAG(huart,UART_FLAG_TC)!=SET); //等待发送结束
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_RESET);
}
}
/* USER CODE END 1 */
usart.h
/* USER CODE BEGIN Private defines */
#define RX_LEN 1024
typedef struct
{
uint8_t RX_flag:1; //IDLE receive flag
uint16_t RX_Size; //receive length
uint8_t RX_pData[RX_LEN]; //DMA receive buffer
}USART_RECEIVETYPE;
extern USART_RECEIVETYPE UsartType;
/* USER CODE END Private defines */
/* USER CODE BEGIN Prototypes */
extern void UsartReceive_IDLE(UART_HandleTypeDef *huart);
/* USER CODE END Prototypes */
stm32f1xx_it.c
/* USER CODE BEGIN 0 */
#include "usart.h"
/* USER CODE END 0 */
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
UsartReceive_IDLE(&huart1);
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}