使用串口3.波特滤可以达到两百万波特,2000_000pbs,在使用正点原子高速无线下载器的情况下,完美使用。
1、CubeMX配置
配置好波特,打开DMA,打开中断就行
2、代码编写
创建缓存数组,高效率 重定义的串口DMA,串口中断函数的继续重定义编写(做保护)
//串口
unsigned char s_buf[]="hello world\r\n";//串口3专用数组
unsigned char RS232_UART1_s_buf[]="hello world\r\n";
unsigned char UART2_s_buf[]="hello world\r\n";
unsigned char UartTxBuf[250];
void Usart1Printf(const char *format,...)
{
uint16_t len;
va_list args;
va_start(args,format);
len = vsnprintf((char*)UartTxBuf,sizeof(UartTxBuf)+1,(char*)format,args);
va_end(args);
HAL_UART_Transmit_DMA(&huart3, UartTxBuf, len);
}
/**
* @brief This function handles USART1 global interrupt.
*/
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
unsigned int timeout=0;
unsigned int maxDelay=0x1FFFF;
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
timeout=0;
while (HAL_UART_GetState(&huart1)!=HAL_UART_STATE_READY)//等待就绪
{
timeout++;//超时处理
if(timeout>maxDelay) break;
}
timeout=0;
while(HAL_UART_Receive_IT(&huart1,(unsigned char *)aRxBuffer, 1)!=HAL_OK)//一次处理完成之后,重新开启中断并设置RxXferCount为1
{
timeout++; //超时处理
if(timeout>maxDelay) break;
}
/* USER CODE END USART1_IRQn 1 */
}
示例:
int ADC_value_buf[4];
void ADC3_Process(void)//已经准确获取电压
{
HAL_ADC_Start_DMA(&hadc3,(uint32_t *)ADC3_Value,chanle3);
// Usart1Printf("%d\r %d\r %d\r %d\r\n",ADC3_Value[0],ADC3_Value[1],ADC3_Value[2],ADC3_Value[3]);
//卡尔曼滤波
ADC3_Value[0]= KalmanFilter1(ADC3_Value[0]);
ADC3_4 =ADC3_Value[0]/ 4095.0f * 3.3f ;
ADC3_Value[1]= KalmanFilter2(ADC3_Value[1]);
ADC3_3 =ADC3_Value[1]/ 4095.0f * 3.3f ;
ADC3_Value[2]= KalmanFilter3(ADC3_Value[2]);
ADC3_2 =ADC3_Value[2]/ 4095.0f * 3.3f ;
ADC3_Value[3]= KalmanFilter4(ADC3_Value[3]);
ADC3_1 =ADC3_Value[3]/ 4095.0f * 3.3f ;
Usart1Printf(" %.6f,%.6f,%.6f,%.6f\n",ADC3_4,ADC3_3,ADC3_2,ADC3_1);
}