打印

学习使用STM32的USART1和PC通讯,为什么判断条件没有用?

[复制链接]
1947|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
时光宙宇|  楼主 | 2018-1-31 16:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序是按照STM32自学笔记来写的,程序不长,请路过的大神帮帮忙
#include"stm32f10x_lib.h"
void RCC_CF(void);
void GPIO_CF(void);
void USART_CF(void);
int main(void)
{
        vu16 i=0;
        RCC_CF();//ÉèÖÃϵͳʱÖÓ
        GPIO_CF();//ÉèÖÃGPIO¿Ú
        USART_CF();//ÉèÖÃUSART
        //GPIO_ResetBits(GPIOA,GPIO_Pin_6);
        while(1)
        {         /*下面这个if语句为什么在不发送数据的时候也会执行里面的语句,使状态灯亮起来呢?
                if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)
                 { GPIO_SetBits(GPIOA,GPIO_Pin_6);
                       
                        USART_SendData(USART1,USART_ReceiveData(USART1));
                       
                        for(i=0;i<500;i++);
      }
   }
}
/*ʱÖÓº¯Êý*/
void RCC_CF(void)
{
  ErrorStatus HSEStartUpStatus;   /*¶¨Òåö¾ÙÀàÐͱäÁ¿*/
        RCC_DeInit();                   /*¸´Î»ÏµÍ³Ê±ÖÓÉèÖÃ*/
        RCC_HSEConfig(RCC_HSE_ON);      /*¿ªÆôHSE*/
        HSEStartUpStatus=RCC_WaitForHSEStartUp(); /*µÈ´ýHSEÆðÕñ²¢Îȶ¨*/
        if(HSEStartUpStatus==SUCCESS)
         {
          RCC_HCLKConfig(RCC_SYSCLK_Div1);  /*Ñ¡ÔñHCLKʱÖÓԴΪSYSCLK1·ÖƵ*/
    RCC_PCLK2Config(RCC_HCLK_Div1);   /*Ñ¡ÔñPCLK2ʱÖÓԴΪHCLK1·ÖƵ*/
    RCC_PCLK1Config(RCC_HCLK_Div2);
    FLASH_SetLatency(FLASH_Latency_2);  /*ÉèÖÃFlashÑÓʱÖÜÆÚÊýΪ2*/
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);        /*ʹÄÜFlashÓûÈ¡»º´æ*/         
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
          RCC_PLLCmd(ENABLE);   /*ʹÄÜPLL*/
          while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);/*µÈ´ýPLLÊä³öÎȶ¨*/
                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
                 while(RCC_GetSYSCLKSource()!=0x08);
   }
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
}
void GPIO_CF(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void USART_CF(void)
{
        USART_InitTypeDef USART_InitStructure;
        //USART_ClockInitTypeDef USART_ClockInitStructure;
        USART_InitStructure.USART_BaudRate=9600;
        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_Cmd(USART1,ENABLE);
}

相关帖子

沙发
airwill| | 2018-1-31 20:19 | 只看该作者
USART_FLAG_RXNE   是个输入缓冲状态的检测,  不是发送

使用特权

评论回复
板凳
caijie001| | 2018-2-1 08:23 | 只看该作者
RXNE:读数据寄存器非空 (Read data register not empty)  位5
当RDR移位寄存器中的数据被转移到USART_DR寄存器中,该位被硬件置位。如果
USART_CR1寄存器中的RXNEIE为1,则产生中断。对USART_DR的读操作可以将该位清
零。RXNE位也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。
0:数据没有收到;
1:收到数据,可以读出。
(出自stm32中文参考手册)

Bit 5 RXNE: Read data register not empty
This bit is set by hardware when the content of the RDR shift register has been transferred to
the USART_DR register. An interrupt is generated if RXNEIE=1 in the USART_CR1 register.
It is cleared by a read to the USART_DR register. The RXNE flag can also be cleared by
writing a zero to it. This clearing sequence is recommended only for multibuffer
communication.
0: Data is not received
1: Received data is ready to be read
(出自stm32英文参考手册)

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
时光宙宇 + 1 很给力!
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

19

帖子

0

粉丝