你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

[已更新]一个标准的串口中断接收,为何进不了中断?

[复制链接]
ataudio 提问时间:2017-8-21 22:26 /
本帖最后由 ataudio 于 2017-8-23 13:24 编辑

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的输入信号(通过串口调试助手发送的数据)。。



1 收藏 1 评论15 发布时间:2017-8-21 22:26

举报

15个回答
无薪税绵 回答时间:2017-8-23 11:43:12
没有发现开启全局中断的指令。
toofree 回答时间:2017-8-21 22:39:36
那叫个乱呀
ataudio 回答时间:2017-8-21 22:41:33

论坛自动排版的。你进来看时,我正在手动排版修改中
回答时间:2017-8-22 08:51:48
排除法解决,配置完串口后,看一下串口寄存器的状态、时钟配置的状态。可以先测试发送是否成功。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

张亚飞 回答时间:2017-8-22 10:00:24
代码是有点乱。我大概看了一下,你的代码是用cubemx自动生成的吗?还是部分自己添加的,截图部分你的管脚配置,输入的管脚在哪里呢?

2.png

10.png

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

ataudio 回答时间:2017-8-22 16:24:45
张亚飞 发表于 2017-8-22 10:00
代码是有点乱。我大概看了一下,你的代码是用cubemx自动生成的吗?还是部分自己添加的,截图部分你的管脚配 ...

输入信号的管脚是外部接入的,比如PC的USB转的串口线。

代码是CUBEMX生成之后,自己添加了一部分。
zero99 回答时间:2017-8-22 17:29:40
ataudio 发表于 2017-8-21 22:41
论坛自动排版的。你进来看时,我正在手动排版修改中。

楼主用每个楼层底部的【支持】就可以顶上去哦
张亚飞 回答时间:2017-8-22 18:28:35
ataudio 发表于 2017-8-22 16:24
输入信号的管脚是外部接入的,比如PC的USB转的串口线。

代码是CUBEMX生成之后,自己添加了一部分。 ...

你没明白我的意思? 你的管脚配置对吗?
言墨瞳 回答时间:2017-8-23 10:53:58
本帖最后由 言墨瞳 于 2017-8-23 11:29 编辑

我也再写GPRS的程序,我的程序中数据1s发送一次,刚开始的时候接收正常,但发送一段时间后回调函数中也触发不了串口中断了

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

言墨瞳 回答时间:2017-8-23 10:57:35
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);
    }

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版