OpenEdv-开源电子网

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

STM32F103 串口进不了空闲中断,硬件没有问题

[复制链接]

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2020-8-5
在线时间
31 小时
发表于 2020-8-17 17:33:50 | 显示全部楼层 |阅读模式
1金钱
我利用DMA+空闲中断,在调试的时候一直进不了中断,求解答undefined
void RS485_Configuration()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        /* Configure USART3 Tx (PB.10) as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //¸′óÃíÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
   
        /* Configure USART3 Rx (PB.11) as input floating */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //¸¡¿Õêäèë
        GPIO_Init(GPIOB, &GPIO_InitStructure);
      
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //íÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //·-×aÆμÂê50MHz
        GPIO_Init(GPIOE, &GPIO_InitStructure);
      
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //íÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //·-×aÆμÂê50MHz
        GPIO_Init(GPIOA, &GPIO_InitStructure);
      
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
        GPIO_Init(GPIOA, &GPIO_InitStructure);//TX½Å¸′óÃíÆíìêä3ö
      
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
        GPIO_Init(GPIOA, &GPIO_InitStructure);//RX½Å¸¡¿Õêäèë
      
      
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//íÆíìêä3ö
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        USART_InitStructure.USART_BaudRate            = 9600;//2¨ìØÂê
        USART_InitStructure.USART_WordLength          = USART_WordLength_8b;//êy¾Yλ
        USART_InitStructure.USART_StopBits            = USART_StopBits_1;//í£Ö1λ
        USART_InitStructure.USART_Parity              = USART_Parity_No;//ÎTD£Ñé
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ó2¼tá÷¿ØÖÆê§Äü
        USART_InitStructure.USART_Mode                = USART_Mode_Rx;//·¢Ëí½óêÕê1Äü
        USART_Init(USART2, &USART_InitStructure);//′®¿ú23õê¼»ˉ
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//ê1Äü½óêÕÖD¶Ï
        USART_Cmd(USART2, ENABLE);//′®¿ú2íaéèê1Äü
      
      
        USART_InitStructure.USART_BaudRate            = 9600  ;
        USART_InitStructure.USART_WordLength          = USART_WordLength_8b;  //8¸öêy¾Yλ
        USART_InitStructure.USART_StopBits            = USART_StopBits_1;     //1¸öí£Ö1λ
        USART_InitStructure.USART_Parity              = USART_Parity_No ;     //ÎTÆæÅ¼D£Ñé
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//½ûóÃó2¼tá÷¿ØÖÆ
        USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;//ê1Äü·¢Ëí/½óêÕ
        USART_Init(USART3, &USART_InitStructure);        //′®¿ú33õê¼»ˉ
        USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);   //ê1Äü¿ÕÏDÖD¶Ï
        USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE);     //ê1ÄüDMA½óêÕ
        USART_Cmd(USART3, ENABLE);
}
/******************************************************************************
£»DMAÅäÖÃ
******************************************************************************/
void UART3_DMA_RX_Configuration()
{
    DMA_InitTypeDef    DMA_Initstructure;

                DMA_Initstructure.DMA_PeripheralBaseAddr =  (u32)(&USART3->DR);
                DMA_Initstructure.DMA_MemoryBaseAddr     = (u32)receive_data;  
                DMA_Initstructure.DMA_DIR = DMA_DIR_PeripheralSRC;   
                DMA_Initstructure.DMA_BufferSize = 20;   
                DMA_Initstructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   
                DMA_Initstructure.DMA_MemoryInc =DMA_MemoryInc_Enable;  
                DMA_Initstructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;   
                DMA_Initstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;  
                DMA_Initstructure.DMA_Mode = DMA_Mode_Normal;  
                DMA_Initstructure.DMA_Priority = DMA_Priority_High;  
                DMA_Initstructure.DMA_M2M = DMA_M2M_Disable;   
                DMA_Init(DMA1_Channel3,&DMA_Initstructure);        
                DMA_Cmd(DMA1_Channel3,ENABLE);      
    //DMA_ITConfig(DMA1_Channel3,DMA_IT_TC,ENABLE);
}

/******************************************************************************
£»ÖD¶ÏóÅÏè¼¶ÅäÖÃ
******************************************************************************/
void NVIC_Configuration()
{
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//Ñ¡Ôñ×é2                                                                                                         
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//TIME2         
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//ÏèÕ¼óÅÏè¼¶
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//′óóÅÏè¼¶      
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//¿aÆôTIME2ÖD¶Ï
  NVIC_Init(&NVIC_InitStructure);
      
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//TIME3         
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//ÏèÕ¼óÅÏè¼¶
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//′óóÅÏè¼¶      
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//¿aÆôTIME3ÖD¶Ï
  NVIC_Init(&NVIC_InitStructure);
      
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//UART2
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//ÏèÕ¼óÅÏè¼¶
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//′óóÅÏè¼¶
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//¿aÆôUART2ÖD¶Ï
  NVIC_Init(&NVIC_InitStructure);      
      
        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;//UART3
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//ÏèÕ¼óÅÏè¼¶
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//′óóÅÏè¼¶
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//¿aÆôUART3ÖD¶Ï
  NVIC_Init(&NVIC_InitStructure);      
      
}

unsigned char aa;
void USART3_IRQHandler()
{
unsigned char num=0;
unsigned char n=0;
        aa++;
                if(USART_GetITStatus(USART3,USART_IT_IDLE) !=RESET)   
                {       num = USART3->SR;      
                        num = USART3->DR;      
                        DMA_Cmd(DMA1_Channel3,DISABLE);                           
                        num = 20 -  DMA_GetCurrDataCounter(DMA1_Channel3);                  
                              DMA1_Channel3->CNDTR=20;   
                          //if(floortemp==2 && switchdowntemp==1){
                                        for(n=0;n<num;n++)
                                                          {
                                                                        receive_buf1[n]=receive_data[n];                                                                       
                                                                }    //&#189;óê&#213;5&#184;&#246;ì&#189;í·êy&#190;Y
                                          RX_Counter3++;     //&#189;óê&#213;êy×é&#206;&#187;&#214;&#195;+1
                                                DMA_Cmd(DMA1_Channel3,ENABLE);      
                                        uart_receive_flag = 1;   

                        }      

}

最佳答案

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

我在https://bbs.21ic.com/icview-359588-1-1.html这个帖子里找到原因了,因为我开着USART3窗口,在读数据的时候把我标志位清0了,所以我才会在==RESET时进入中断
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2020-8-5
在线时间
31 小时
 楼主| 发表于 2020-8-17 17:33:51 | 显示全部楼层
我在https://bbs.21ic.com/icview-359588-1-1.html这个帖子里找到原因了,因为我开着USART3窗口,在读数据的时候把我标志位清0了,所以我才会在==RESET时进入中断
回复

使用道具 举报

5

主题

152

帖子

0

精华

高级会员

Rank: 4

积分
777
金钱
777
注册时间
2016-7-15
在线时间
119 小时
发表于 2020-8-17 20:35:55 | 显示全部楼层
眼睛都看瞎了
好好学习,天天向上。
回复

使用道具 举报

5

主题

269

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1053
金钱
1053
注册时间
2020-5-11
在线时间
253 小时
发表于 2020-8-17 21:27:18 | 显示全部楼层
哈哈哈怎么是这个颜色
回复

使用道具 举报

5

主题

269

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1053
金钱
1053
注册时间
2020-5-11
在线时间
253 小时
发表于 2020-8-17 21:28:06 | 显示全部楼层
485吗?  发送完控制引脚变成接收模式了么
回复

使用道具 举报

11

主题

2149

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4919
金钱
4919
注册时间
2015-1-10
在线时间
617 小时
发表于 2020-8-18 08:31:24 | 显示全部楼层
啊。。。。。。我的眼睛
回复

使用道具 举报

5

主题

269

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1053
金钱
1053
注册时间
2020-5-11
在线时间
253 小时
发表于 2020-8-18 09:14:28 | 显示全部楼层
485的话。检查一下发送完有没有把控制引脚改为接收状态
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2020-8-5
在线时间
31 小时
 楼主| 发表于 2020-8-18 09:52:10 | 显示全部楼层
thisisdemo 发表于 2020-8-18 09:14
485的话。检查一下发送完有没有把控制引脚改为接收状态

引脚没问题,现在我把USART_GetITStatus(USART3,USART_IT_IDLE) !=RESET改为==RESET 他就可以进中断了是为什么?

回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2020-8-5
在线时间
31 小时
 楼主| 发表于 2020-8-18 10:24:54 | 显示全部楼层
thisisdemo 发表于 2020-8-17 21:27
哈哈哈怎么是这个颜色

我把隔壁21IC发的帖子复制过来就这样了
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2020-8-13
在线时间
20 小时
发表于 2020-8-19 08:46:10 | 显示全部楼层
mark一下以后来看
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 15:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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