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

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

[复制链接]
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
没有发现开启全局中断的指令。
七哥 回答时间: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

查看全部评分

power568 回答时间:2017-8-23 13:16:58
1. 首先确保硬件是好的;
2. 你可以使用STM32CubeMx直接生成一个工程看看,生成的工程时可以直接使用的。
3. 验证功能好了以后,在更改代码。

评分

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

查看全部评分

ataudio 回答时间:2017-8-23 13:24:46
无薪税绵 发表于 2017-8-23 11:43
没有发现开启全局中断的指令。

HAL_Init();应该有你说的。
废鱼 回答时间:2017-8-23 14:06:04
如果可以进去中断说明有数据接收,产生的原因可能是外部干扰,楼主可以用示波器看一下接收引脚的状态。

评分

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

查看全部评分

张亚飞 回答时间:2017-8-24 17:51:37
不知道是是否还在关注这个帖子,下边截图是我的管脚配置。
你的管脚配置把输入输出都配置成复用推挽输出有问题吗?
微信截图_20170824175012.png
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版