先理解再代码 最后代码直接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");
}
}