STM32F401RCT6 串口驱动

1.配置响应的引脚为串口模式

2.配置相关参数

3.打开DMA对应串口通道,使能中断

4.生成代码,代码中增加

main.c文件中增加:重构fput

定义接收串口缓存shuju

uint8_t usart1_rx_buffer[1024] ={0};
uint8_t usart6_rx_buffer[512] ={0};

#if defined (__CC_ARM)          //KEIL
	#pragma import(__use_no_semihosting)             
	//标准库需要的支持函数                 
	struct __FILE 
	{ 
		int handle; 

	}; 

	FILE __stdout;       
	//定义_sys_exit()以避免使用半主机模式    
	void _sys_exit(int x) 
	{ 
		x = x; 
	} 
	//重定义fputc函数 
	int fputc(int ch, FILE *f)
	{      
		while((USART6->SR& 0X40)==0);  
		USART6->DR = (uint8_t) ch;         
		return ch;
	}
#endif

main函数开启DMA中断:

    if(HAL_UART_Receive_DMA(&huart1,usart1_rx_buffer,1024) != HAL_OK) 
    {
       printf("bsp_st32_uart1_init Fail\r\n");
    }

	if(HAL_UART_Receive_DMA(&huart6,usart6_rx_buffer,512) != HAL_OK) 
    {
       printf("bsp_st32_uart6_init Fail\r\n");
    }

stm32f4xxx_it.c中断处理函数:

void UART6_RxIdleCallback(UART_HandleTypeDef *huart,DMA_HandleTypeDef *hdma_usart_rx)
{
	uint8_t dma_recv_len;
     
	if(huart->Instance == USART6){
	
		if(__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE)){
			__HAL_UART_CLEAR_IDLEFLAG(huart);
			HAL_UART_DMAStop(huart);
			
			dma_recv_len = 512 - __HAL_DMA_GET_COUNTER(hdma_usart_rx);//这个是本次接收到的长度
            //这个是我自己封装好的接收的数据放入队列
			usart6_rx_dma_len = dma_recv_len;
			usart6_rx_dma_status = 1;
		}
	}
}

void UART1_RxIdleCallback(UART_HandleTypeDef *huart,DMA_HandleTypeDef *hdma_usart_rx)
{
	int dma_recv_len;
     
	if(huart->Instance == USART1){
	
		if(__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE)){
			  __HAL_UART_CLEAR_IDLEFLAG(huart);
			  HAL_UART_DMAStop(huart);

			  dma_recv_len = 1024 - __HAL_DMA_GET_COUNTER(hdma_usart_rx);//这个是本次接收到的长度
              //这个是我自己封装好的接收的数据放入队列
              dataListWrite(&Uart1NodeHead, (char*)usart1_rx_buffer, dma_recv_len);

              memset(usart1_rx_buffer, 0, sizeof(usart1_rx_buffer));
              //再次打开DMA
			  HAL_UART_Receive_DMA(huart,usart1_rx_buffer,1024);
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值