串口 重映射 DMA 接收 闲时中断

USART.C

/* USER CODE BEGIN 0 */
/******************************************************************
串口重定义
开串口1与串口3
*******************************************************************/
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}
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(huart);  
			HAL_UART_DMAStop(huart);  
			temp = (*huart).hdmarx->Instance->CNDTR;  
			UsartType.RX_Size =  RX_LEN - temp; 
			HAL_UART_Receive_DMA(huart,UsartType.RX_pData,RX_LEN); 
			if(UsartType.RX_pData[UsartType.RX_Size-1]==0xff)
			{
				UsartType.RX_flag=1;//标志位
			}				
    }			
}  
/* 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 */

main.C

	HAL_UART_Receive_DMA(&huart1, UsartType.RX_pData, RX_LEN);  //启动串口1DMA转换通道
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //开启串口1 闲时中断

stm32f1xx_it.c

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 */
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猛笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值