OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4989|回复: 8

stm32f407进不了空闲中断,可以正常收发

[复制链接]

5

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2021-5-26
在线时间
39 小时
发表于 2023-3-13 09:39:26 | 显示全部楼层 |阅读模式
100金钱
void uart_init(u32 bound){

  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOC,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);

        //´®¿Ú5¶ÔÓ¦Òý½Å¸´ÓÃÓ³Éä
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource2,GPIO_AF_UART5);
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource12,GPIO_AF_UART5); //
       
       
        //USART5¶Ë¿ÚÅäÖÃ
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PD2(U5-RX) PC12(U5-TX)
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //
        GPIO_Init(GPIOD,&GPIO_InitStructure); //
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PD2(U5-RX) PC12(U5-TX)
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //
        GPIO_Init(GPIOC,&GPIO_InitStructure); //
       
       
       

   //USART5
        USART_InitStructure.USART_BaudRate = bound;//
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//
        USART_InitStructure.USART_Parity = USART_Parity_No;//
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;       
  USART_Init(UART5, &USART_InitStructure); //
       
  USART_Cmd(UART5, ENABLE);  //
       
        //USART_ClearFlag(USART1, USART_FLAG_TC);
       
       
        USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);//
        USART_ITConfig(UART5, USART_IT_IDLE, ENABLE);//

       
  NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;//
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =4;                //
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //
        NVIC_Init(&NVIC_InitStructure);        //


       
}

void UART5_IRQHandler(void)                        //´®¿Ú5ÖжϷþÎñ³ÌÐò
{
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //Èç¹ûSYSTEM_SUPPORT_OSΪÕ棬ÔòÐèÒªÖ§³ÖOS.
        OSIntEnter();   
#endif

       
      if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)  
    {
        Res =USART_ReceiveData(UART5);                                                                       
                USART_RX_BUF[USART_RX_STA] = Res;
                USART_RX_STA++;

    }
                else if(USART_GetITStatus(UART5, USART_IT_IDLE) != RESET)       
                {
                        Res = USART_ReceiveData(UART5);
                        UART5_flag= 1 ;
                        USART_RX_STA=0;
                               
                }

#if SYSTEM_SUPPORT_OS        
        OSIntExit();                                                                                           
#endif
}



串口5 stm32f407 可以发送接收 进入接收中断 但是进不了空闲中断 发送间隔时间长
串口5接了422 422接电脑max3490

最佳答案

查看完整内容[请看2#楼]

max3490差分线有两个120欧姆电阻 拆掉之后就正常了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2021-5-26
在线时间
39 小时
 楼主| 发表于 2023-3-13 09:39:27 | 显示全部楼层
max3490差分线有两个120欧姆电阻  拆掉之后就正常了
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8462
金钱
8462
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-3-13 09:48:11 | 显示全部楼层
看不出来进没进空闲中断有什么区别。楼主是怎么知道没进空闲中断的?
比如在空闲中断里让某个IO口翻转,比如点亮LED?
专治疑难杂症
回复

使用道具 举报

5

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2021-5-26
在线时间
39 小时
 楼主| 发表于 2023-3-13 10:33:25 | 显示全部楼层
LcwSwust 发表于 2023-3-13 09:48
看不出来进没进空闲中断有什么区别。楼主是怎么知道没进空闲中断的?
比如在空闲中断里让某个IO口翻转,比 ...

调试断点 在uart5_flag=1那里
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8462
金钱
8462
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-3-13 10:54:34 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-3-13 10:59 编辑
tianduyingcai 发表于 2023-3-13 10:33
调试断点 在uart5_flag=1那里

else if(USART_GetITStatus(UART5, USART_IT_IDLE) != RESET)   
这里应把 else去掉,
比如两个中断同时产生的情况,前面的处理完了,后面的中断就得等下次了。
对了,USART_IT_RXNE的处理是不是也会让USART_IT_IDLE被清除掉呢?

再不行就监测一下状态寄存器看IDLE是否置位。

我没用过IDLE标志,平时都用定时器实现类似功能。


专治疑难杂症
回复

使用道具 举报

5

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2021-5-26
在线时间
39 小时
 楼主| 发表于 2023-3-13 11:02:49 来自手机 | 显示全部楼层
LcwSwust 发表于 2023-3-13 10:54
else if(USART_GetITStatus(UART5, USART_IT_IDLE) != RESET)   
这里应把 else去掉,
比如两个中断同 ...

else去掉了也不行,这是示波器接收的0x05 0x05的两字节数据
IMG20230313105358.jpg
IMG20230313105416.jpg
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8462
金钱
8462
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-3-13 11:17:59 | 显示全部楼层
tianduyingcai 发表于 2023-3-13 11:02
else去掉了也不行,这是示波器接收的0x05 0x05的两字节数据

从波形看,这波形是反相端的,而且不只两字节,多了一字节FF,波特率约500K,不知双方是否统一?
我也没招了。
专治疑难杂症
回复

使用道具 举报

5

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2021-5-26
在线时间
39 小时
 楼主| 发表于 2023-3-13 11:36:23 来自手机 | 显示全部楼层
LcwSwust 发表于 2023-3-13 11:17
从波形看,这波形是反相端的,而且不只两字节,多了一字节FF,波特率约500K,不知双方是否统一?
我也没 ...

我发两个字节,它会进接收中断三次,这里确实有问题最后一个字节总为0x00,硬件有啥会影响这吗
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8462
金钱
8462
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-3-13 11:38:58 | 显示全部楼层
tianduyingcai 发表于 2023-3-13 11:36
我发两个字节,它会进接收中断三次,这里确实有问题最后一个字节总为0x00,硬件有啥会影响这吗

那估计是发送方的程序有问题了,用串口调试助手给它发试试。
硬件只是电平转换,应该不会形成多余的数据。
专治疑难杂症
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 17:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表