STM32CubeMX 串口收发+不定长收数据+pirntfl使用

先理解再代码 最后代码直接CV

 先是接受不定长数据方法(用DMA节省CPU空间)

中断回调函数

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if(huart==&huart1)
	{
		HAL_UART_Transmit_DMA(&huart1,rx_buff,sizeof(rx_buff));
		//HAL_UART_Transmit_DMA(&huart1,"\r\n",sizeof("\r\n"));
		
		HAL_UARTEx_ReceiveToIdle_DMA(&huart1,rx_buff,sizeof(rx_buff));
		__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
		
	}

}

 最开始的接受启动!

uint8_t rx_buff[50];



HAL_UARTEx_ReceiveToIdle_DMA(&huart1,rx_buff,sizeof(rx_buff));
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
	

放在USART.H里面的

extern DMA_HandleTypeDef hdma_usart1_rx;

这是重定向printfl 就可以轻松玩printfl 

#define printfl(...) HAL_UART_Transmit(&huart1,(uint8_t*)u_buff,sprintf((char *)u_buff,__VA_ARGS__),0xffff)
uint8_t u_buff[256];	

这是最普通给的接受中断回调函数 

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){

	if(huart->Instance==USART1){
	printfl("rx_buf=%s\r",rx_buf);
	}

}

附加一点点随便带的

定时器捕获中断回调 和普通定时器中断

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
	if(htim->Instance==TIM4){
		key_up=HAL_TIM_ReadCapturedValue(&htim4,TIM_CHANNEL_1);
		
		printfl("%fs\r",(float)(key_up));
		TIM4->CNT=0;
	}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
	if(htim->Instance==TIM3){
		printfl("cw_666\r\n");
	}
}

        

猜你喜欢

转载自blog.csdn.net/weixin_63163242/article/details/132029849