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条回答
chuck_pz
1楼-- · 2019-03-25 12:47
 精彩回答 2  元偷偷看……
shipeng
2楼-- · 2019-03-25 14:03
chuck_pz 发表于 2018-4-18 11:32
你不会单步看下寄存器是什么状态啊!!!
我那个都用过很多次了

我这种写法就是这个少发一个字节的问题,貌似和我的写法没有关系。我现在有个临时方案解决了少发一个字节的问题:在要发送前加入一个假发送动作也就是随便发一个字节实际这个字节无法发出但是紧随其后的就是我实际要发送的数据。
chuck_pz
3楼-- · 2019-03-25 17:14
shipeng 发表于 2018-4-18 13:48
我这种写法就是这个少发一个字节的问题,貌似和我的写法没有关系。我现在有个临时方案解决了少发一个字节 ...

串口这东西简单啊,你这搞法不靠谱。。。

一周热门 更多>