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条回答
曹伟1993
1楼-- · 2019-03-24 12:38
 精彩回答 2  元偷偷看……
wsdymg
2楼-- · 2019-03-24 17:57
楼主问题解决了吗?
这是想往上位机发送三个0xff的意思嘛?
调试的时候设置断点观测程序执行到底哪里出问题,你这样的表述并不是很清晰。
shipeng
3楼-- · 2019-03-24 23:41
曹伟1993 发表于 2018-4-16 10:55
这根本不是什么BUG而是你没有搞懂串口发送的原理而已,你好好看看串口通信机制,就应该没问题了

教训的好
shipeng
4楼-- · 2019-03-25 04:12
 精彩回答 2  元偷偷看……
chuck_pz
5楼-- · 2019-03-25 04:53
什么乱七八槽的。。。我给你例子,自己看,你那代码懒得看
void USART3_Init(void)  
{  
        GPIO_InitTypeDef GPIO_InitStructure;  
        USART_InitTypeDef USART_InitStructure;  

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

        GPIO_StructInit(&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        GPIO_StructInit(&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init( GPIOC, &GPIO_InitStructure);

        GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3) ;
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_USART3) ;

        USART_InitStructure.USART_BaudRate = 921600;  
        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);

        USART3_NVIC_config();
        USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
}

void USART3_SendByte(uint8_t ch)
{
        while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET)
                ;
        USART_SendData(USART3, ch);
}
shipeng
6楼-- · 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因为之前没有发送动作,从而陷入死循环?但是存在即合理你这么做应该有验证的吧。

一周热门 更多>