使用串口1中断收发数据,可以发送,单独测试过了,串口中断接收数据出现问题,现象是在板子上电后,在外界没有给串口发数据的时候会进入HAL_UART_RxCpltCallback回调函数1次,然后就再也进不去了,上位机通过USB转422/485的转接线,给板子发数据,串口无法进入接收中断,在进入while循环前,我开启了一次接收中断,在回调函数中如果收到数据,我再次开启接收中断,这个逻辑上有什么问题啊?怎么就是进不了串口接收中断呢?同样的操作串口2,也是无法进入串口中断。 感觉是HAL库处理有问题,但是找不到根本所在啊,还请使用HAL库操作过串口中断的大神们,指点迷津啊 代码很简单,大体如下: int main(void) { HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_GFXSIMULATOR_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); /* USER CODE END 2 */ /* Infinite loop */ while (1) { if(Uart1_Rx_Cnt>=7) { if(HAL_UART_Transmit_IT(&UartHandle1, (uint8_t*)&Usart_RxBuffer1, 7)!= HAL_OK) { /* Transfer error in transmission process */ Error_Handler(); } Uart1_Rx_Cnt = 0; } } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) { if(UartHandle->Instance == USART1) { Usart_RxBuffer1[Uart1_Rx_Cnt++] = aRxBuffer; //接收数据转存 HAL_UART_Receive_IT(&UartHandle1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断 } } static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 921600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); } void HAL_UART_MspInit(UART_HandleTypeDef* huart) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(huart->Instance==USART1) { /* Peripheral clock enable */ __HAL_RCC_USART1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */ GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USART1 interrupt Init */ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); } } |
ST的hal库有问题手头有STM32L4或STM32F7的帮忙测试DMA SD卡
STM32F756 DCMI +GC0308 Camera图片不正常
STM32F722RET6无法被JLINK/STLIN和IAR/KEIL识别
STM32F767以太网换PIN脚无数据
STM32F7 DSP库使用
没有人分享一下STM32F767 硬JPEG 编码解码吗
求STM32F777与FPGA通过FMC通信的参考设计
求STM32F7 1.15版本 固件库
STM32F7xx AXIM & ITCM
除了Flash芯片,STM32F7的QSPI能接其他外设吗?
HAL_UART_Receive_IT(&huart1,(uint8_t *)&aRxBuffer,1);
评分
查看全部评分
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
if(UartHandle->Instance == USART1)
{
Usart_RxBuffer1[Uart1_Rx_Cnt++] = aRxBuffer; //接收数据转存
HAL_UART_Receive_IT(&UartHandle1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断
}
}
我放到接收中断的回调函数里了,这个跟放到主循环中有什么区别吗?
{
uint32_t temp1= 0x00U, temp2 = 0x00U;
temp1 = huart->gState;
temp2 = huart->RxState;
return (HAL_UART_StateTypeDef)(temp1 | temp2);
}
跟踪发现接收状态
huart->RxState=0x22 HAL_UART_STATE_BUSY_RX
检查下SR寄存器,根据状态做相应的回调处理。
上述代码,只要出错,就重新使能中断接收一字节。
评分
查看全部评分
不该放在中断函数里的。
仔细看了你的代码,好像不会冲突占用。不过你可以试着先把发送代码注释,测试一下。
评分
查看全部评分
非常感谢提供思路,我尝试了一下,上电后程序会进入错误中断的回调函数,我加入了重新使能中断接收一字节
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1){
HAL_UART_Receive_IT(&huart1,usart1_rx_buf,1);
}
}
但是还是无法接收到数据啊,状态还是一直huart->RxState=0x22 HAL_UART_STATE_BUSY_RX
就没响应了,不进接收中断
我试试放到主循环中
我测试了把 HAL_UART_Receive_IT(&UartHandle1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断
放到主循环中,还是进步了中断,状态一直是huart->RxState=0x22 HAL_UART_STATE_BUSY_RX,我强制修改状态为HAL_UART_STATE_READY,下次开启接收中断,状态又变成了HAL_UART_STATE_BUSY_RX,真是无语了
我是要用接收中断来接数据,在主循环中累计到一定数据再发出去,现在收不到数,不会触发发送数据,仅仅是想不接收发送跑通
降低波特率试试。
降低波特率还是不行,我找块开发板试试吧,好无奈了
评分
查看全部评分