OpenEdv-开源电子网

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

求组:stm32F429 进不去串口2中断(RS485通信)

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-7-31
在线时间
3 小时
发表于 2018-4-20 09:45:49 | 显示全部楼层 |阅读模式
1金钱
#include "stm32f4xx.h"
#include "stdio.h"



#define LED1_ON GPIO_SetBits(GPIOD, GPIO_Pin_15);   
#define LED1_OFF GPIO_ResetBits(GPIOD, GPIO_Pin_15);


#define LED2_ON GPIO_SetBits(GPIOC, GPIO_Pin_6);  
#define LED2_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_6);

#define LED3_ON GPIO_SetBits(GPIOC, GPIO_Pin_7);  
#define LED3_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_7);  

#define EN_USART2_TX  GPIO_SetBits(GPIOD,GPIO_Pin_7);
#define EN_USART2_RX  GPIO_ResetBits(GPIOD,GPIO_Pin_7);

u8 USART_RX_BUFF[200];     //接收缓冲,最大USART_REC_LEN个字节.   
u16 USART_RX_STAA=0;       //接收状态标记

void USART2_IRQHandler(void);



//发送数据
int fputc(int ch,FILE*f)
{
USART_SendData(USART2,(unsigned char)ch);

while(!(USART2->SR&USART_FLAG_TXE));
return(ch);
}

//接收数据
int GetKey(void)
{
while(!(USART2->SR & USART_FLAG_RXNE));
return((int)(USART2->DR&0x1FF));

}

void delay_ms(u16 time)      
{      
  u32 i=0;      
  while(time--)      
  {      
    i=36000;      
    while(i--);      
  }      
}   
void RCC_Configuration(void)   
{     
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC |RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOB,ENABLE);   
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);  
}   

void GPIO_Configuration(void)   
{   
  GPIO_InitTypeDef GPIO_InitStructure;   

  GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,GPIO_AF_USART2);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_USART2);

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;             //CS_485  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出  
  GPIO_Init(GPIOD, &GPIO_InitStructure);     

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;             //管脚2  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;       //复用推挽输出  
  GPIO_Init(GPIOD, &GPIO_InitStructure);                //TX初始化  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;             //管脚3  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//浮空输入         
  GPIO_Init(GPIOD, &GPIO_InitStructure);                //RX初始化  

}   

void InitUSART2 ( void )
{
    USART_InitTypeDef USART_InitStructure;

    RCC_APB1PeriphClockCmd ( RCC_APB1Periph_USART2, ENABLE );

    USART_InitStructure.USART_BaudRate = 9600u;/*设置波特率为9600*/
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;/*设置数据位为8*/
    USART_InitStructure.USART_StopBits = USART_StopBits_1;/*设置停止位为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 ( USART2, &USART_InitStructure );


    USART_Cmd ( USART2, ENABLE );

    USART_ITConfig ( USART2, USART_IT_TXE, DISABLE );
    USART_ITConfig ( USART2, USART_IT_RXNE, ENABLE );
}

void InitNVIC ( void )
{
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_PriorityGroupConfig ( NVIC_PriorityGroup_0 );

    NVIC_InitStructure.NVIC_IRQChannel = ( uint8_t ) USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init ( &NVIC_InitStructure );

}


void USART2_IRQHandler(void)
{  
    u8 Res;   
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
                {
                USART_ClearFlag(USART2,USART_FLAG_RXNE);

                Res =USART_ReceiveData(USART2);        //读取接收到的数据
               
                if((USART_RX_STAA&0x8000)==0)//接收未完成
                        {
                        if(USART_RX_STAA&0x4000)//接收到了0x0d
                                {
                                if(Res!=0x0a)USART_RX_STAA=0;//接收错误,重新开始
                                else USART_RX_STAA|=0x8000;        //接收完成了
                                }
                        else //还没收到0X0D
                                {       
                                if(Res==0x0d)USART_RX_STAA|=0x4000;
                                else
                                        {
                                        USART_RX_BUFF[USART_RX_STAA&0X3FFF]=Res ;
                                        USART_RX_STAA++;
                                        if(USART_RX_STAA>200)
                                        {
                                          USART_RX_STAA=0;//接收数据错误,重新开始接收
                                        }
                                        }                 
                                }
                        }                    
                }
}






int main()  
{  
  u8 len;
  u8 t;
  RCC_Configuration();
  GPIO_Configuration();
  InitUSART2 ();
  InitNVIC ();
  EN_USART2_TX;
  printf("\r\n您发送的消息为:\r\n");
  EN_USART2_RX;
  while(1)
  {
            if(USART_RX_STAA&0x8000)
        {       
              EN_USART2_TX;
              len=USART_RX_STAA&0x3fff;//得到此次接收到的数据长度
              for(t=0;t<len;t++)
                {
                USART2->DR=USART_RX_BUFF[t];
                while((USART2->SR&0X40)==0);//等待发送结束
                }
                delay_ms(1000);
                EN_USART2_RX;
        }

  }

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-7-31
在线时间
3 小时
 楼主| 发表于 2018-4-20 09:46:49 | 显示全部楼层
程序如上,EN_USART2_RX/EN_USART2_TX为485发送接收使能,配置应该没有问题,有大神知道错误在哪嘛?
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-7-31
在线时间
3 小时
 楼主| 发表于 2018-4-20 09:53:21 | 显示全部楼层
程序运行就传出一个这个,断点设置在中断函数第一行也进不去
4~E%QR2$81`0T241TLHMUWF.png
回复

使用道具 举报

17

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
394
金钱
394
注册时间
2015-1-7
在线时间
101 小时
发表于 2018-4-20 10:38:29 | 显示全部楼层
查查硬件问题吧
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-7-31
在线时间
3 小时
 楼主| 发表于 2018-4-20 10:43:10 | 显示全部楼层

硬件烧别的程序可以进行Modbus通信。。。。。
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-7-31
在线时间
3 小时
 楼主| 发表于 2018-4-20 10:43:28 | 显示全部楼层

能进行Modbus说明应该没问题吧
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-7-31
在线时间
3 小时
 楼主| 发表于 2018-4-20 10:45:04 | 显示全部楼层
while(!(USART2->SR&USART_FLAG_TXE));
为什么会卡这句啊。。。
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164846
金钱
164846
注册时间
2010-12-1
在线时间
2098 小时
发表于 2018-4-21 02:19:28 | 显示全部楼层
ty1148456099 发表于 2018-4-20 10:45
while(!(USART2->SR&USART_FLAG_TXE));
为什么会卡这句啊。。。

说明串口配置不对。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-7-31
在线时间
3 小时
 楼主| 发表于 2018-4-23 09:49:46 | 显示全部楼层
正点原子 发表于 2018-4-21 02:19
说明串口配置不对。

求指教哪里配置有问题。。。。
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164846
金钱
164846
注册时间
2010-12-1
在线时间
2098 小时
发表于 2018-4-24 01:49:02 | 显示全部楼层
ty1148456099 发表于 2018-4-23 09:49
求指教哪里配置有问题。。。。

看不出来,得你自己测试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2021-4-24
在线时间
2 小时
发表于 2021-5-1 18:34:05 | 显示全部楼层
我的也是stm32f429串口不进中断
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2021-4-24
在线时间
2 小时
发表于 2021-5-1 18:38:02 | 显示全部楼层
急求解决?

void uart_init(u32 bound)
{       
        //UART 3&#245;ê&#188;&#187;ˉéè&#214;&#195;
        UART2_Handler.Instance=USART2;                                            //USART1
        UART2_Handler.Init.BaudRate=bound;                                    //2¨ì&#216;&#194;ê
        UART2_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //×&#214;3¤&#206;a8&#206;&#187;êy&#190;Y&#184;&#241;ê&#189;
        UART2_Handler.Init.StopBits=UART_STOPBITS_1;            //ò&#187;&#184;&#246;í£&#214;1&#206;&#187;
        UART2_Handler.Init.Parity=UART_PARITY_NONE;                    //&#206;T&#198;&#230;&#197;&#188;D£&#209;é&#206;&#187;
        UART2_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //&#206;Tó2&#188;tá÷&#191;&#216;
        UART2_Handler.Init.Mode=UART_MODE_TX_RX;                    //ê&#213;·¢&#196;£ê&#189;
        HAL_UART_Init(&UART2_Handler);                                            //HAL_UART_Init()&#187;áê1&#196;üUART1
       
        HAL_UART_Receive_IT(&UART2_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//&#184;&#195;oˉêy&#187;á&#191;a&#198;&#244;&#189;óê&#213;&#214;D&#182;&#207;£o±ê&#214;&#190;&#206;&#187;UART_IT_RXNE£&#172;2¢&#199;òéè&#214;&#195;&#189;óê&#213;&#187;o3&#229;ò&#212;&#188;°&#189;óê&#213;&#187;o3&#229;&#189;óê&#213;×&#238;′óêy&#190;Yá&#191;
  
}

//UARTμ×2&#227;3&#245;ê&#188;&#187;ˉ£&#172;ê±&#214;óê1&#196;ü£&#172;òy&#189;&#197;&#197;&#228;&#214;&#195;£&#172;&#214;D&#182;&#207;&#197;&#228;&#214;&#195;
//′&#203;oˉêy&#187;á±&#187;HAL_UART_Init()μ÷ó&#195;
//huart:′&#174;&#191;ú&#190;&#228;±ú

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    //GPIO&#182;&#203;&#191;úéè&#214;&#195;
        GPIO_InitTypeDef GPIO_Initure;
       
        if(huart->Instance==USART2)//è&#231;1&#251;ê&#199;′&#174;&#191;ú1£&#172;&#189;&#248;DD′&#174;&#191;ú1 MSP3&#245;ê&#188;&#187;ˉ
        {
                __HAL_RCC_GPIOA_CLK_ENABLE();                        //ê1&#196;üGPIOAê±&#214;ó
                __HAL_RCC_USART2_CLK_ENABLE();                        //ê1&#196;üUSART1ê±&#214;ó
          
        //        HAL_UART_DeInit(huart);
                GPIO_Initure.Pin=GPIO_PIN_2;                        //PA9
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //&#184;′ó&#195;í&#198;íìê&#228;3&#246;
                GPIO_Initure.Pull=GPIO_PULLUP;                        //é&#207;à-
                GPIO_Initure.Speed=GPIO_SPEED_FAST;                //&#184;&#223;&#203;ù
                GPIO_Initure.Alternate=GPIO_AF7_USART2;        //&#184;′ó&#195;&#206;aUSART1
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //3&#245;ê&#188;&#187;ˉPA9

                GPIO_Initure.Pin=GPIO_PIN_3;                        //PA10
                GPIO_Initure.Mode=GPIO_MODE_INPUT;                //&#184;′ó&#195;í&#198;íìê&#228;3&#246;
                GPIO_Initure.Pull=GPIO_NOPULL;                        //é&#207;à-
                GPIO_Initure.Speed=GPIO_SPEED_FAST;                //&#184;&#223;&#203;ù
                GPIO_Initure.Alternate=GPIO_AF7_USART2;        //&#184;′ó&#195;&#206;aUSART1
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //3&#245;ê&#188;&#187;ˉPA10
               
#if EN_USART2_RX
                HAL_NVIC_EnableIRQ(USART2_IRQn);                //ê1&#196;üUSART1&#214;D&#182;&#207;í¨μà
                HAL_NVIC_SetPriority(USART2_IRQn,3,3);        //&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;3£&#172;×óó&#197;&#207;è&#188;&#182;3
#endif       
        }

}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart->Instance==USART2)//è&#231;1&#251;ê&#199;′&#174;&#191;ú1
        {
                if((USART_RX_STA&0x8000)==0)//&#189;óê&#213;&#206;′íê3é
                {
                        if(USART_RX_STA&0x4000)//&#189;óê&#213;μ&#189;á&#203;0x0d
                        {
                                if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//&#189;óê&#213;′í&#206;ó,&#214;&#216;D&#194;&#191;aê&#188;
                                else USART_RX_STA|=0x8000;        //&#189;óê&#213;íê3éá&#203;
                        }
                        else //&#187;1&#195;&#187;ê&#213;μ&#189;0X0D
                        {       
                                if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//&#189;óê&#213;êy&#190;Y′í&#206;ó,&#214;&#216;D&#194;&#191;aê&#188;&#189;óê&#213;          
                                }                 
                        }
                }

        }
}

//′&#174;&#191;ú1&#214;D&#182;&#207;·t&#206;&#241;3ìDò
//void USART2_IRQHandler(void)                       
//{
//        u32 timeout=0;
//        u32 maxDelay=0x1FFFF;
//#if SYSTEM_SUPPORT_OS                 //ê1ó&#195;OS
//        OSIntEnter();   
//#endif
//       
//        HAL_UART_IRQHandler(&UART2_Handler);        //μ÷ó&#195;HAL&#191;a&#214;D&#182;&#207;′|àí1&#171;ó&#195;oˉêy
//       
//        timeout=0;
//    while (HAL_UART_GetState(&UART2_Handler) != HAL_UART_STATE_READY)//μè′y&#190;íD÷
//        {
//         timeout++;////3&#172;ê±′|àí
//     if(timeout>maxDelay) break;               
//        }
//     
//        timeout=0;
//        while(HAL_UART_Receive_IT(&UART2_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//ò&#187;′&#206;′|àííê3é&#214;&#174;oó£&#172;&#214;&#216;D&#194;&#191;a&#198;&#244;&#214;D&#182;&#207;2¢éè&#214;&#195;RxXferCount&#206;a1
//        {
//         timeout++; //
//         if(timeout>maxDelay) break;       
//        }
//#if SYSTEM_SUPPORT_OS                 //ê1ó&#195;OS
//        OSIntExit();                                                                                           
//#endif
//}
//#endif       



//′&#174;&#191;ú1&#214;D&#182;&#207;·t&#206;&#241;3ìDò
void USART2_IRQHandler(void)                       
{
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //ê1ó&#195;OS
        OSIntEnter();   
#endif
        if((__HAL_UART_GET_FLAG(&UART2_Handler,UART_FLAG_RXNE)!=RESET))  //&#189;óê&#213;&#214;D&#182;&#207;(&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y±&#216;D&#235;ê&#199;0x0d 0x0a&#189;á&#206;2)
        {
        HAL_UART_Receive(&UART2_Handler,&Res,1,1000);
                if((USART_RX_STA&0x8000)==0)//&#189;óê&#213;&#206;′íê3é
                {
                        if(USART_RX_STA&0x4000)//&#189;óê&#213;μ&#189;á&#203;0x0d
                        {
                                if(Res!=0x0a)USART_RX_STA=0;//&#189;óê&#213;′í&#206;ó,&#214;&#216;D&#194;&#191;aê&#188;
                                else USART_RX_STA|=0x8000;        //&#189;óê&#213;íê3éá&#203;
                        }
                        else //&#187;1&#195;&#187;ê&#213;μ&#189;0X0D
                        {       
                                if(Res==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//&#189;óê&#213;êy&#190;Y′í&#206;ó,&#214;&#216;D&#194;&#191;aê&#188;&#189;óê&#213;          
                                }                 
                        }
                }                    
        }
        HAL_UART_IRQHandler(&UART2_Handler);       
#if SYSTEM_SUPPORT_OS                 //ê1ó&#195;OS
        OSIntExit();                                                                                           
#endif
}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-4-20 06:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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