STM32F103RC UART1奇怪的BUG

2019-03-23 16:13发布

本帖最后由 shipeng 于 2018-4-16 09:23 编辑

我在main函数中int main(void)
{
    RCC_Configuration();
    BKP_Init();
   delay_init();
   NVIC_Configuration();
   uart_init(115200);
   USART_SendData(USART1,0xFF);//这条可以成功发出。
   delay_ms(1000);
   USART_SendData(USART1,0xFF);//1秒延时之后紧跟着发的这条0xFF发不出来!!!
   while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
   USART_SendData(USART1,0xFF);//这条可以成功发出。
   while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
    while(1)
    {
        IWDG_ReloadCounter();

     }
}
以下是相关函数的详细信息:
void delay_init()         
{

#ifdef OS_CRITICAL_METHOD
        u32 reload;
#endif
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //HCLK/8
        fac_us=SystemCoreClock/8000000;        //1/8  
         
#ifdef OS_CRITICAL_METHOD
        reload=SystemCoreClock/8000000;   
        reload*=1000000/OS_TICKS_PER_SEC;
                                                        //reload  
        fac_ms=1000/OS_TICKS_PER_SEC;
        SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;
        SysTick->LOAD=reload;
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;           //SYSTICK   
#else
        fac_ms=(u16)fac_us*1000;
#endif
}                                                                    

void delay_ms(u16 nms)
{                                    
        u32 temp;                  
        SysTick->LOAD=(u32)nms*fac_ms;
        SysTick->VAL =0x00;
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
        do
        {
                temp=SysTick->CTRL;
        }
        while(temp&0x01&&!(temp&(1<<16)));
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
        SysTick->VAL =0X00;                 
}

void uart_init(u32 bound){

    GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
         USART_DeInit(USART1);
         //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //USART1_RX          PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

   //USART 3õê¼»ˉéèÖÃ

        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(USART1, &USART_InitStructure);
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART1, ENABLE);

}

请教大家为何会有一个字节发不出来?
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
shipeng
2019-03-25 08:58
chuck_pz 发表于 2018-4-17 19:00
什么乱七八槽的。。。我给你例子,自己看,你那代码懒得看
void USART3_Init(void)  
{  
        GPI ...

有个问题,我跟你的发送步骤不一样,你是先判断USART_FLAG_TXE再写发送数据:
void USART3_SendByte(uint8_t ch)
{
        while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET)
                ;
        USART_SendData(USART3, ch);
}
我是先写发送数据再判断USART_FLAG_TXE标志位:
USART_SendData(USART1,0xFF);//这条可以成功发出。
   while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
我的考虑是如果是上电首次发送,先判断USART_FLAG_TC标志位会不会始终是RESET因为之前没有发送动作,从而陷入死循环?但是存在即合理你这么做应该有验证的吧。

一周热门 更多>