完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
STM32L073,多个uart,但是调试接收中断时,只开启了uart2和uart4,都进不了中断.请网友指正,我到底犯了什么高级的还是低级的错误?直接上代码吧:初始化:
void MX_UART_Init(UART_HandleTypeDef* huart, uint32_t BaudRate) { if (huart == &huart2) { huart->Instance = USART2; __HAL_RCC_GPIOA_CLK_ENABLE(); } else if (huart == &huart4) { huart->Instance = USART4; __HAL_RCC_GPIOC_CLK_ENABLE(); } huart->Init.BaudRate = BaudRate; huart->Init.WordLength = UART_WORDLENGTH_8B; huart->Init.StopBits = UART_STOPBITS_1; huart->Init.Parity = UART_PARITY_NONE; huart->Init.Mode = UART_MODE_TX_RX; huart->Init.HwFlowCtl = UART_HWCONTROL_NONE; //huart->Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; //huart->AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(huart) != HAL_OK) { Error_Handler(); } } 管脚配置: void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct; if(uartHandle->Instance==USART2) { /* Peripheral clock enable */ __HAL_RCC_USART2_CLK_ENABLE(); /**USART2 GPIO Configuration PA2 ------> USART2_TX PA3 ------> USART2_RX */ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* Peripheral interrupt init */ HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART2_IRQn); } else if(uartHandle->Instance==USART4) { /* Peripheral clock enable */ __HAL_RCC_USART4_CLK_ENABLE(); /**USART4 GPIO Configuration PC10 ------> USART4_TX PC11 ------> USART4_RX */ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF6_USART4; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /* Peripheral interrupt init */ HAL_NVIC_SetPriority(USART4_5_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART4_5_IRQn); } } 中断服务程序: void USART2_IRQHandler(void) { HAL_UART_IRQHandler(&huart2); } /* USART4/5的中断处理函数 */ void USART4_5_IRQHandler(void) { HAL_UART_IRQHandler(&huart4); HAL_UART_IRQHandler(&huart5); } 回调函数: void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) { unsigned char data = 0; /* Read Received character. RXNE flag is cleared by reading of RDR register */ data = LL_USART_ReceiveData8(UartHandle->Instance); if (UartHandle == &huart2) { Uart2Ready = SET; ProtocolRecvBuff2.Revbuff[ProtocolRecvBuff2.phead] = data; ProtocolRecvBuff2.phead++; if ( ProtocolRecvBuff2.phead >= PROTOCOLMAXRECVBUFF ) { ProtocolRecvBuff2.phead = 0; ProtocolRecvBuff2.ptail = 0; } while (HAL_UART_GetState(&huart2) != HAL_UART_STATE_READY); HAL_UART_Receive_IT(&huart2, ProtocolRecvBuff2.Revbuff, 1); } else if (UartHandle == &huart4) { Uart4Ready = SET; ProtocolRecvBuff1.Revbuff[ProtocolRecvBuff1.phead] = data; ProtocolRecvBuff1.phead++; if ( ProtocolRecvBuff1.phead >= PROTOCOLMAXRECVBUFF ) { ProtocolRecvBuff1.phead = 0; ProtocolRecvBuff1.ptail = 0; } /* 处理完上一次的接收中断后,需要再次打开中断。 */ while (HAL_UART_GetState(&huart4) != HAL_UART_STATE_READY); HAL_UART_Receive_IT(&huart4, &(ProtocolRecvBuff1.Revbuff[ProtocolRecvBuff1.phead]), 1); } } main()调用: int main(void) { HAL_Init(); SystemClock_Config(); SystemPower_Config(); MX_UART_Init(&huart2, ComBaudRate_9600); MX_UART_Init(&huart4, ComBaudRate_9600); if(HAL_UART_Receive_IT(&huart2, ProtocolRecvBuff2.Revbuff, 1) != HAL_OK) { Error_Handler(); } if(HAL_UART_Receive_IT(&huart4, ProtocolRecvBuff1.Revbuff, 1) != HAL_OK) { Error_Handler(); } while ( 1U ) { HAL_Delay(1000); printf("GPRS_POWER LOOP.n"); } } int main(void)整个工程已经调试多天了,卡在了接收这个地方,很是郁闷。也很疲了,一直没找到这个问题的原因在哪里。。。希望论坛里各位网友支持一下,非常感谢。 最新进展:上述的代码其实是可以进中断的。但中断不可控,上机测试在上电初始化过程中就莫名其妙进去好多次,UART_IT_FE,可能出不来。也可能不响应RX的输入信号(通过串口调试助手发送的数据)。。 |
|
相关推荐
14个回答
|
|
|
论坛自动排版的。你进来看时,我正在手动排版修改中。
|
|
|
|
|
|
排除法解决,配置完串口后,看一下串口寄存器的状态、时钟配置的状态。可以先测试发送是否成功。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
你没明白我的意思? 你的管脚配置对吗? |
|
|
|
|
|
本帖最后由 言墨瞳 于 2017-8-23 11:29 编辑
我也再写GPRS的程序,我的程序中数据1s发送一次,刚开始的时候接收正常,但发送一段时间后回调函数中也触发不了串口中断了 |
|
|
|
|
|
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{ if(huart->Instance == USART2) { QueueIn(&USART2Recieve,aRx2Buffer[0]); HAL_UART_Receive_IT(&huart2,aRx2Buffer,1); } else if(huart->Instance == USART1) { HAL_TIM_Base_Start_IT(&htim4); __HAL_TIM_SET_COUNTER(&htim4,1); if(sim_ready == 0) { GPRS_Recv_Buf[GPRS_Recv_lens++] = aRx1Buffer[0]; Time_GPRS_counts = 0; if(GPRS_Recv_lens>=600) { Flag_GPRS_Recv = 1; HAL_TIM_Base_Stop_IT(&htim4); } } else { QueueIn(&USART1Recieve,aRx1Buffer[0]); } HAL_UART_Receive_IT(&huart1,aRx1Buffer,1); } |
|
|
|
|
|
没有发现开启全局中断的指令。
|
|
|
|
|
|
|
|
|
|
|
|
HAL_Init();应该有你说的。
|
|
|
|
|
|
如果可以进去中断说明有数据接收,产生的原因可能是外部干扰,楼主可以用示波器看一下接收引脚的状态。
|
|
|
|
|
|
|
|
|
|
|
|
本帖最后由 ataudio 于 2017-8-27 11:48 编辑
谢谢这位兄弟保持关注。。按照原理来说,输入输出配成对应的方式,肯定是没有问题的。。 但是,对你的回复,今天我特意测试了几遍。 当我把GPIO都按照AF_PP配置时,程序跑起来,UART4收发是正常的。调试信息能清楚看到远端串口返回的数据。 当我TX与RX分别配置成AF_PP、INPUT时,调试信息不见任何返回。等有时间我再分析是不是卡在中断里了。 我的板子没再出现上电就进串口中断或者其他错误的原因,可能重要的一点在电源。。之前我一直电池供电,可能电压不稳,现在换成稳压电源。。 除了上面的模式配置,我把使能uart中断,写进了uart的init中和RX的callback中。 最后,我把库函数UART_Receive_IT()替换成自己的处理函数了。 |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2810 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2420 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2288 浏览 0 评论
2404 浏览 1 评论
1643 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 13:51 , Processed in 1.074782 second(s), Total 100, Slave 83 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1072