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);
}
}
}