打印

关于STM32一串口程序,急求大侠帮忙看看啊???

[复制链接]
1690|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhang5805350|  楼主 | 2012-9-1 17:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include"stm32f10x.h"
void RCC_Config(void)
{
           ErrorStatus HSEStartUpStatus;
          RCC_DeInit();
           RCC_HSEConfig(RCC_HSE_ON);
           HSEStartUpStatus=RCC_WaitForHSEStartUp();
           if(HSEStartUpStatus==SUCCESS)
                 {
                            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
                            FLASH_SetLatency(FLASH_Latency_2);
                            RCC_HCLKConfig(RCC_SYSCLK_Div1);
                            RCC_PCLK2Config(RCC_HCLK_Div1);
                            RCC_PCLK1Config(RCC_HCLK_Div2);
                            RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
                            RCC_PLLCmd(ENABLE);
                            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
                            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
                            while(RCC_GetSYSCLKSource()!=0x08);
                                                                
                         }
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);         
}

void GPIO_Config(void)
{
            GPIO_InitTypeDef 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);
       
            GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
            GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
            GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        }
void USART1_Config(void)
{
           USART_InitTypeDef USART_InitStructure;
       
           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_Mode=USART_Mode_Rx|USART_Mode_Tx;//指定了使能或者失能发送和接收模式
           USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//设置硬件流失能

            USART_Init(USART1,&USART_InitStructure);  //将以上赋完值的结构体带入库函数USART_Init进行初始化
       
            //USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
            
            USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  
            USART_Cmd(USART1,ENABLE);  //开启USART1,注意与上面RCC_APB2PeriphClockCmd()设置的区别
}
       
void Delay(vu16 cnt)
{
unsigned short i,j;
for (i=0;i<cnt;i++)
{ for (j=0;j<1000;j++)
  { }
}
}
void NVIC_Config(void)
{       
        NVIC_InitTypeDef NVIC_InitStructure;
             
            
           NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       
           NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
           NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
           NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
           NVIC_Init(&NVIC_InitStructure);
        }       

int main(void)
{
          RCC_Config();
          GPIO_Config();
          NVIC_Config();
          USART1_Config();
   USART_ClearFlag(USART1,USART_FLAG_TC);//清除标志位,否则第1位数据会丢失

         while(1)
         {
                 
                                       if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)
                   {
                              USART_SendData(USART1,0x89);
                               while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
                                                             Delay(800);
                            }
                 }
}
void USART1_IRQHandler(void)
{
          u8 dat;

        if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
        {
                   dat=USART_ReceiveData(USART1);
                   USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                                 USART_ClearFlag(USART1,USART_FLAG_RXNE);
               
                   while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);
               
                   USART_SendData(USART1,dat);
                  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
                  
                }
               
                         USART_SendData(USART1,0x66);
                  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}

这段程序中我想让串口在PA0为低电平的时候一直发送0x89,当通过串口调试助手发送和接收一数据后,继续发送0x89。
但现在是我一上电开始可以发送0x89,当在串口调试助手上发送和接收一数据后,程序貌似是卡在中断服务程序里了,无法继续发送0x89。

想请大侠们帮我看看这程序哪出了问题。。。
本人是初学者,也请各位帮我看看我这段程序语句可有用的不恰当的地方,帮忙指点指点。。。。
沙发
zhang5805350|  楼主 | 2012-9-2 16:27 | 只看该作者
没人会么????

使用特权

评论回复
板凳
wufei608| | 2012-9-2 20:32 | 只看该作者
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);
这句注释掉看可行不?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

65

帖子

1

粉丝