STM32F405做的实验
首先我定义了3字节的数组
UART_HandleTypeDef huart2;
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t uart_receive[3]={0}; //看这里
uint8_t uart_transmit[3]={0};
uint16_t uart_len =3;
uint8_t *uart_recv =(uint8_t *)&uart_receive;
uint8_t *uart_tran =(uint8_t *)&uart_transmit;
/* USER CODE END PV */
然后再main()里面开接收中断
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart2,uart_recv, uart_len); //看这里
再然后中断里什么都没写
void USART2_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart2);//清中断
HAL_UART_Receive_IT(&huart2,uart_recv, 1);//开中断
}
上位机随意发送3字节,进了3次中断
所以,STM32FCUBEMX的UART进中断
不是根据用户数组字节长度进中断,而是接一字节进一次中断
所以长数组接收的,或者较高波特率通讯的,最好不要在中断里做数据处理
非固定长度报文的 协议,DMA用起来还是比较不方便的。
比如modbus。
ST提供了一份文档
介绍使用DMA超时方式接收不定长报文的方法,你可以找一下(我忘记文档号了),就在使用说明里面
主要方式就是使用DMA模拟了FIFO,解决了STM32没有FIFO的问题,当然了,虽然解决了问题,但是从开发者角度和系统性能而言还是不如FIFO,不知为何ST为何不为通讯提供FIFO,成本没多少的,唉!一个公司一个发展思路,既然图便宜了,那么就免不了在很多地方要凑合一下。
涨姿势了,下次去看看。
一周热门 更多>