打印
[STM32F1]

STM32无法进入串口中断

[复制链接]
12345|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guyan1987|  楼主 | 2014-8-19 08:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新手刚学习STM32,遇到一问题,无法进入串口中断,请大神看看是哪出问题了,信息!
#include "stm32f10x.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_usart.h"



void RCC_Config(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void Delay(vu32 nCount);
void Usart1_Configration(void);
void NVIC_Configuration(void);
vu32 nCount1;


void RCC_Configuration(void)
{

  /* Enable GPIOA/GPIOB clocks */
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1 |RCC_APB2Periph_AFIO, ENABLE);
}

/**
  * @brief  Configures the different GPIO ports.
  * @param  None
  * @retval None
  */
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure PA.02, PA.03  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        //USART1_TX =PA9
  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);

  //USART1_RX =PA10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);  

       

}
       
void Usart1_Configration()
{
// 配置串口参数   
  /* USARTx configured as follow:
        - BaudRate = 9600 baud  
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
  */
        USART_InitTypeDef USART_InitStructure;
  USART_InitStructure.USART_BaudRate = 9600;//波特率
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长8位
  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);                    //使能串口

}

void NVIC_Configuration(void)
{

        NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//选择中断分组

  /* Enable the EXTI Interrupt */
  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);//初始化
}

void USART1_IRQHandler(void)                 //串口1中断服务程序
{
    vu32 temp;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断         
    {
                            
                        temp=USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
          
     //while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//等待接收结束
                       
                if(temp==0xff)nCount1=1;
    }
                USART_ClearITPendingBit(USART1,  USART_IT_RXNE); //清楚接收标志
}

void Delay(vu32 nCount)
{
  for(; nCount != 0; nCount--);
}


int main()
{
          
        vu32 nCount1=0;
  RCC_Configuration();
        GPIO_Configuration();
  NVIC_Configuration();
  Usart1_Configration();
while(1)
{
                 GPIO_ResetBits(GPIOA,GPIO_Pin_2);
                  Delay(0x2fffff);
     GPIO_SetBits(GPIOA,GPIO_Pin_2);
           Delay(0x2fffff);
         
           while( nCount1==1)
                 {
      nCount1=0;
                        GPIO_ResetBits(GPIOA,GPIO_Pin_3);
                   Delay(0x2fffff);
      GPIO_SetBits(GPIOA,GPIO_Pin_3);
            Delay(0x2fffff);
                        USART_SendData(USART1 ,0xfa);
                        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)== RESET);//等待发送完成
                        USART_ClearITPendingBit(USART1,  USART_FLAG_TXE); //清楚发送标志
                                  
     }
       
  }
}


沙发
mmuuss586| | 2014-8-19 13:16 | 只看该作者

对了一遍程序没任何问题;
1、发送可以吗?
2、再查下硬件连接看看;
   拿示波器看下,或者将PA9,10短接测试下;

使用特权

评论回复
板凳
xuan309170083| | 2014-8-19 13:33 | 只看该作者
你的RCC里面没有打开串口时钟

加上这句试试:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

使用特权

评论回复
地板
xuan309170083| | 2014-8-19 13:34 | 只看该作者
要记住所有外设都有对应时钟,你只开了GPIO的时钟外设是没法工作的

使用特权

评论回复
5
Leeone| | 2014-8-19 13:43 | 只看该作者
xuan309170083 发表于 2014-8-19 13:33
你的RCC里面没有打开串口时钟

加上这句试试:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); ...

楼主已经打开了

使用特权

评论回复
6
guyan1987|  楼主 | 2014-8-19 13:54 | 只看该作者
mmuuss586 发表于 2014-8-19 13:16
对了一遍程序没任何问题;
1、发送可以吗?
2、再查下硬件连接看看;

发送没问题,就是进不了中断!

使用特权

评论回复
7
呆——呆| | 2014-8-19 14:59 | 只看该作者
while( nCount1==1)这里感觉有问题,改成while(1){if(nCount1==1)}好像就可以了

使用特权

评论回复
8
guyan1987|  楼主 | 2014-8-19 16:54 | 只看该作者
呆——呆 发表于 2014-8-19 14:59
while( nCount1==1)这里感觉有问题,改成while(1){if(nCount1==1)}好像就可以了

能不能进中断,跟主循环函数,应该没关系吧?主要是配置方面

使用特权

评论回复
9
呆——呆| | 2014-8-20 08:46 | 只看该作者
guyan1987 发表于 2014-8-19 16:54
能不能进中断,跟主循环函数,应该没关系吧?主要是配置方面

配置没问题吧,我就把你的程序这样改了就可以进入中断了,具体什么原因我解释不了。。。

使用特权

评论回复
10
xuan309170083| | 2014-8-20 12:51 | 只看该作者
Leeone 发表于 2014-8-19 13:43
楼主已经打开了

没仔细看后面的了,都是注释惹的祸

使用特权

评论回复
11
mryw| | 2014-8-21 17:29 | 只看该作者
你是怎么知道没进中断的呢?

使用特权

评论回复
12
guyan1987|  楼主 | 2014-8-21 21:40 | 只看该作者
mryw 发表于 2014-8-21 17:29
你是怎么知道没进中断的呢?

实验板,做的测试。PC机串口程序给MCU发送,单片机没反应,。单片机给PC发送,串口软件有信息显示。

使用特权

评论回复
13
diweo| | 2014-8-22 14:04 | 只看该作者
guyan1987 发表于 2014-8-21 21:40
实验板,做的测试。PC机串口程序给MCU发送,单片机没反应,。单片机给PC发送,串口软件有信息显示。 ...

接调试器设断点才能确定到底有没有进中断。

使用特权

评论回复
14
mryw| | 2014-8-22 16:02 | 只看该作者
程序的确没问题,在中断中点亮一盏灯吧,如果PC发送数据而灯不亮,那确实没进入中断,那就看看硬件吧!

使用特权

评论回复
15
lmc123ms| | 2015-5-26 17:02 | 只看该作者
我也遇到同样的问题。

使用特权

评论回复
16
zh113214| | 2015-5-26 20:17 | 只看该作者
感觉没进入中断,是硬件的问题。。

使用特权

评论回复
17
yqarmer| | 2015-9-24 13:57 | 只看该作者
不知道楼主问题解决了没有?同样出现问题 进不了中断函数

使用特权

评论回复
18
zkyc| | 2015-10-23 15:42 | 只看该作者
yqarmer 发表于 2015-9-24 13:57
不知道楼主问题解决了没有?同样出现问题 进不了中断函数

你的问题解决了么,我的也不行。中断里的等也点亮不了。不单纯是接收中断,虽然能发送数据到电脑,但是发送中断无法进入。

使用特权

评论回复
19
逍遥哥哥| | 2017-3-15 20:22 | 只看该作者
问题解决了吗?

使用特权

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

本版积分规则

29

主题

133

帖子

2

粉丝