OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7390|回复: 1

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

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-9-2
在线时间
2 小时
发表于 2012-9-2 16:44:28 | 显示全部楼层 |阅读模式
#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。

想请大侠们帮我看看这程序哪出了问题。。。
本人是初学者,也请各位帮我看看我这段程序语句可有用的不恰当的地方,帮忙指点指点。。。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-9-2 21:57:27 | 显示全部楼层
回复【楼主位】z5805350:

---------------------------------
死在中断里面的哪句?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 16:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表