485卡死在 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)

2019-07-21 03:33发布

画了个板子 485电路如图 使用串口1, 485发送时卡死在while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)

程序用的原子的
大家帮忙看看问题在哪儿??
[mw_shl_code=c,true]#include "sys.h"
#include "rs485.h"         
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////         
//RS485Çy¶ˉ ′úÂë                                                                             
//////////////////////////////////////////////////////////////////////////////////          


#if EN_USART1_RX                   //èç1ûê1Äüá˽óêÕ             
//½óêÕ»o′æÇø        
u8 RS485_RX_BUF[64];          //½óêÕ»o3å,×î′ó64¸ö×Ö½ú.
//½óêÕμ½μÄêy¾Y3¤¶è
u8 RS485_RX_CNT=0;   
void USART1_IRQHandler(void)
{
        u8 res;            
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//½óêÕμ½êy¾Y
        {                
          res =USART_ReceiveData(USART1);//;¶á衽óêÕμ½μÄêy¾YUSART1->DR
                if(RS485_RX_CNT<64)
                {
                        RS485_RX_BUF[RS485_RX_CNT]=res;                //&#188;&#199;&#194;&#188;&#189;óê&#213;μ&#189;μ&#196;&#214;μ
                        RS485_RX_CNT++;                                                //&#189;óê&#213;êy&#190;Y&#212;&#246;&#188;ó1
                }
        }                                                                                           
}
#endif                                                                                 
//3&#245;ê&#188;&#187;ˉIO ′&#174;&#191;ú1
//bound:2¨ì&#216;&#194;ê          
void RS485_Init(u32 bound)
{           
       
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //ê1&#196;üGPIOAê±&#214;ó
        RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//ê1&#196;üUSART1ê±&#214;ó
       
  //′&#174;&#191;ú1òy&#189;&#197;&#184;′ó&#195;ó3é&#228;
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9&#184;′ó&#195;&#206;aUSART1
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10&#184;′ó&#195;&#206;aUSART1
       
        //USART1   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9ó&#235;GPIOA10
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//&#184;′ó&#195;1|&#196;ü
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //&#203;ù&#182;è100MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //í&#198;íì&#184;′ó&#195;ê&#228;3&#246;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //é&#207;à-
        GPIO_Init(GPIOA,&GPIO_InitStructure); //3&#245;ê&#188;&#187;ˉPA9£&#172A10
       
        //PA11í&#198;íìê&#228;3&#246;£&#172;485&#196;£ê&#189;&#191;&#216;&#214;&#198;  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //GPIOA11
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//ê&#228;3&#246;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //&#203;ù&#182;è100MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //í&#198;íìê&#228;3&#246;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //é&#207;à-
        GPIO_Init(GPIOA,&GPIO_InitStructure); //3&#245;ê&#188;&#187;ˉPA11
       

   //USART1 3&#245;ê&#188;&#187;ˉéè&#214;&#195;
        USART_InitStructure.USART_BaudRate = bound;//2¨ì&#216;&#194;êéè&#214;&#195;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×&#214;3¤&#206;a8&#206;&#187;êy&#190;Y&#184;&#241;ê&#189;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò&#187;&#184;&#246;í£&#214;1&#206;&#187;
        USART_InitStructure.USART_Parity = USART_Parity_No;//&#206;T&#198;&#230;&#197;&#188;D£&#209;é&#206;&#187;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//&#206;Tó2&#188;têy&#190;Yá÷&#191;&#216;&#214;&#198;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //ê&#213;·¢&#196;£ê&#189;
  USART_Init(USART1, &USART_InitStructure); //3&#245;ê&#188;&#187;ˉ′&#174;&#191;ú1
       
  USART_Cmd(USART1, ENABLE);  //ê1&#196;ü′&#174;&#191;ú 1
       
        USART_ClearFlag(USART1, USART_FLAG_TC);
       
#if EN_USART1_RX       
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//&#191;a&#198;&#244;&#189;óêü&#214;D&#182;&#207;

        //USART1 NVIC &#197;&#228;&#214;&#195;
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                //×óó&#197;&#207;è&#188;&#182;3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1&#196;ü
        NVIC_Init(&NVIC_InitStructure);        //&#184;ù&#190;Y&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉVIC&#188;&#196;′&#230;&#198;÷&#161;¢

#endif       
       
        RS485_TX_EN=0;                                //&#196;&#172;è&#207;&#206;a&#189;óê&#213;&#196;£ê&#189;       
}

//RS485·¢&#203;ílen&#184;&#246;×&#214;&#189;ú.
//buf:·¢&#203;í&#199;&#248;ê×μ&#216;&#214;·
//len:·¢&#203;íμ&#196;×&#214;&#189;úêy(&#206;aá&#203;oí±&#190;′ú&#194;&#235;μ&#196;&#189;óê&#213;&#198;¥&#197;&#228;,&#213;aà&#239;&#189;¨òé2&#187;òa3&#172;1y64&#184;&#246;×&#214;&#189;ú)
void RS485_Send_Data(u8 *buf,u8 len)
{
        u8 t;
        RS485_TX_EN=1;                        //éè&#214;&#195;&#206;a·¢&#203;í&#196;£ê&#189;
          for(t=0;t<len;t++)                //&#209;-&#187;··¢&#203;íêy&#190;Y
        {
          while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //μè′y·¢&#203;í&#189;áê&#248;               
    USART_SendData(USART1,buf[t]); //·¢&#203;íêy&#190;Y
        }         
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //μè′y·¢&#203;í&#189;áê&#248;               
        RS485_RX_CNT=0;          
        RS485_TX_EN=0;                                //éè&#214;&#195;&#206;a&#189;óê&#213;&#196;£ê&#189;       
}
//RS4852é&#209;ˉ&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y
//buf:&#189;óê&#213;&#187;o′&#230;ê×μ&#216;&#214;·
//len:&#182;áμ&#189;μ&#196;êy&#190;Y3¤&#182;è
void RS485_Receive_Data(u8 *buf,u8 *len)
{
        u8 rxlen=RS485_RX_CNT;
        u8 i=0;
        *len=0;                                //&#196;&#172;è&#207;&#206;a0
        delay_ms(10);                //μè′y10ms,á&#172;D&#248;3&#172;1y10ms&#195;&#187;óD&#189;óê&#213;μ&#189;ò&#187;&#184;&#246;êy&#190;Y,&#212;òè&#207;&#206;a&#189;óê&#213;&#189;áê&#248;
        if(rxlen==RS485_RX_CNT&&rxlen)//&#189;óê&#213;μ&#189;á&#203;êy&#190;Y,&#199;ò&#189;óê&#213;íê3éá&#203;
        {
                for(i=0;i<rxlen;i++)
                {
                        buf=RS485_RX_BUF;       
                }               
                *len=RS485_RX_CNT;        //&#188;&#199;&#194;&#188;±&#190;′&#206;êy&#190;Y3¤&#182;è
                RS485_RX_CNT=0;                //&#199;&#229;á&#227;
        }
}[/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
xiaowu191
1楼-- · 2019-07-22 05:46
就是因为串口初始化时清除了发送完成标志位;

建议在串口初始化后发送一个空数据,如果不介意的话;
cheng8152
2楼-- · 2019-07-22 10:22
Denniky 发表于 2016-4-6 09:35
仔细看了一下你的程序,如果你是用的stm32f103系列芯片的话,可能有以下几个问题:

1,RCC_AHB1PeriphCl ...

谢谢!我用的STM32F407VET6,和103应该有些不一样,初始化IO参考的原子407的例程,例程串口2改成了串口1.  
现在在考虑硬件问题,试了一下把原来的偏置电阻10K拆了,,不行;换成了2K,还是不行;不知道是不是MAX485有问题,准备换一个试试
csmjmcc
3楼-- · 2019-07-22 14:08
发送数据(void RS485_Send_Data(u8 *buf,u8 len))与外接485硬件没有关系的。这仅关联MCU内部。
csmjmcc
4楼-- · 2019-07-22 20:04
 精彩回答 2  元偷偷看……
cheng8152
5楼-- · 2019-07-23 00:53
Denniky 发表于 2016-4-6 09:35
仔细看了一下你的程序,如果你是用的stm32f103系列芯片的话,可能有以下几个问题:

1,RCC_AHB1PeriphCl ...

。。。        错在        RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
应该是RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
痛啊!
cheng8152
6楼-- · 2019-07-23 04:28
cheng8152 发表于 2016-4-6 09:44
谢谢!我用的STM32F407VET6,和103应该有些不一样,初始化IO参考的原子407的例程,例程串口2改成了串口1. ...

。。。        错在        RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
应该是RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
痛啊!

一周热门 更多>