STM32F1的USART3一直陷入死循环

2019-07-14 16:33发布

void USART3_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART3| RCC_APB2Periph_GPIOB,ENABLE);
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOAtiNG;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        /*USART3 mode config*/
        USART_InitStructure.USART_BaudRate=9200;
        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(USART3,&USART_InitStructure);
        USART_Cmd(USART3,ENABLE);
}

int fputc(int ch,FILE *f)
{
        USART_SendData(USART3,(unsigned char)ch);
        while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
        return(ch);
}

static char *itoa(int value, char *string, int radix)
{
        int     i, d;
        int     flag = 0;
        char    *ptr = string;

        /* This implementation only works for decimal numbers. */
        if (radix != 10)
        {
            *ptr = 0;
            return string;
        }

        if (!value)
        {
            *ptr++ = 0x30;
            *ptr = 0;
            return string;
        }

        /* if this is a negative value insert the minus sign. */
        if (value < 0)
        {
            *ptr++ = '-';

            /* Make the value positive. */
            value *= -1;
        }

        for (i = 10000; i > 0; i /= 10)
        {
            d = value / i;

            if (d || flag)
            {
                *ptr++ = (char)(d + 0x30);
                value -= (d * i);
                flag = 1;
            }
        }


void USART3_printf(USART_TypeDef* USARTx, uint8_t *Data,...)
{
        const char *s;
        int d;   
        char buf[16];

        va_list ap;
        va_start(ap, Data);

        while ( *Data != 0)     
        {                                                          
                if ( *Data == 0x5c )
        {                                                                          
        switch ( *++Data )
        {
                case 'r':                                                                  
                        USART_SendData(USARTx, 0x0d);
                        Data ++;
                break;

                case 'n':                                                                  
                        USART_SendData(USARTx, 0x0a);       
                        Data ++;
                break;

                default:
                        Data ++;
                break;
        }                         
        }
        else if ( *Data == '%')
        {                                                                       
        switch ( *++Data )
        {                               
                case 's':                                                                                  
                        s = va_arg(ap, const char *);
        for ( ; *s; s++)
        {
                USART_SendData(USARTx,*s);
                while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
        }
                Data++;
                break;

        case 'd':                                                                               
        d = va_arg(ap, int);
        itoa(d, buf, 10);
        for (s = buf; *s; s++)
        {
                USART_SendData(USARTx,*s);
                while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
        }
        Data++;
        break;
                 default:
                                Data++;
                    break;
        }                 
        } /* end of else if */
        else USART_SendData(USARTx, *Data++);
        while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
        }
}
这个是STM32开发书中的程序,我想问一下各位为什么在我运行程序时一旦运行到while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET)就一直陷入死循环,卡在那里运行不下去呢?到底哪里有问题?
0条回答

一周热门 更多>