Understand first, then code, and finally code directly to CV
First, accept the variable length data method (use DMA to save CPU space)
interrupt callback function
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);
}
}
The very first to accept the launch!
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);
Put it in USART.H
extern DMA_HandleTypeDef hdma_usart1_rx;
This is redirecting printfl so you can easily play with printfl
#define printfl(...) HAL_UART_Transmit(&huart1,(uint8_t*)u_buff,sprintf((char *)u_buff,__VA_ARGS__),0xffff)
uint8_t u_buff[256];
This is the most common accept interrupt callback function
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance==USART1){
printfl("rx_buf=%s\r",rx_buf);
}
}
add a little whatever
Timer capture interrupt callback and ordinary timer interrupt
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");
}
}