打印
[STM32F1]

无法进入串口中断

[复制链接]
1712|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yinxiangh|  楼主 | 2016-8-25 23:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#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); //清楚发送标志
                                 
     }
        
  }
}
沙发
pangb| | 2016-8-25 23:01 | 只看该作者
对了一遍程序没任何问题

使用特权

评论回复
板凳
chenjunt| | 2016-8-25 23:02 | 只看该作者
发送可以吗?

使用特权

评论回复
地板
ousj| | 2016-8-25 23:02 | 只看该作者
再查下硬件连接看看

使用特权

评论回复
5
morrisk| | 2016-8-25 23:03 | 只看该作者
   拿示波器看下,或者将PA9,10短接测试下;

使用特权

评论回复
6
小小猫咪| | 2016-8-25 23:06 | 只看该作者
加上这句试试:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

使用特权

评论回复
7
kangzj| | 2016-8-25 23:06 | 只看该作者

要记住所有外设都有对应时钟,你只开了GPIO的时钟外设是没法工作的

使用特权

评论回复
8
zwll| | 2016-8-25 23:06 | 只看该作者
楼主已经打开了

使用特权

评论回复
9
yinxiangh|  楼主 | 2016-8-25 23:07 | 只看该作者
发送没问题,就是进不了中断!

使用特权

评论回复
10
chuxh| | 2016-8-25 23:08 | 只看该作者
while( nCount1==1)这里感觉有问题,改成while(1){if(nCount1==1)}好像就可以了

使用特权

评论回复
11
yinxiangh|  楼主 | 2016-8-25 23:09 | 只看该作者
能不能进中断,跟主循环函数,应该没关系吧?主要是配置方面

使用特权

评论回复
12
zwll| | 2016-8-25 23:09 | 只看该作者
配置没问题吧,我就把你的程序这样改了就可以进入中断了,具体什么原因我解释不了。。。

使用特权

评论回复
13
juventus9554| | 2016-8-25 23:10 | 只看该作者
你是怎么知道没进中断的呢?

使用特权

评论回复
14
yinxiangh|  楼主 | 2016-8-25 23:10 | 只看该作者
实验板,做的测试。PC机串口程序给MCU发送,单片机没反应,。单片机给PC发送,串口软件有信息显示。

使用特权

评论回复
15
司徒老鹰| | 2016-8-25 23:11 | 只看该作者
接调试器设断点才能确定到底有没有进中断。

使用特权

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

使用特权

评论回复
17
dingy| | 2016-8-25 23:13 | 只看该作者
我的也不行。中断里的等也点亮不了。不单纯是接收中断,虽然能发送数据到电脑,但是发送中断无法进入。

使用特权

评论回复
18
yinxiangh|  楼主 | 2016-8-25 23:13 | 只看该作者
好的,我明天去单位试一下,多谢各位大侠了哈,结贴了先

使用特权

评论回复
19
joketinnle| | 2016-8-25 23:33 | 只看该作者
你用主循环一直读取USART 看看有没有效果   先别用中断读

使用特权

评论回复
20
低八度的声线| | 2016-8-27 10:11 | 只看该作者
跑官方的例程看看,是否是一样的问题呢

使用特权

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

本版积分规则

723

主题

7134

帖子

2

粉丝