kiss_u_999 发表于 2011-4-21 14:53:31

无法进入中断接收程序

串口始终无法进入中断接收子程序,但是要是在main()里的for(;;)循环里头刚开始加入USART1_Putc(‘c’);就会一直进入接收中断子程序,并且串口调试助手就会无限循环输出“获取到串口1数据:”,当我发数据给它的话毫无反应哈,不知道怎么回事,你们看看:int main(void){    ChipHalInit();            //片内硬件初始化    ChipOutHalInit();      //片外硬件初始化      for(;;)    {            //串口2使用中断方式置位标志      if(Uart1_Get_Flag)      {            Uart1_Get_Flag=0;            USART1_Puts("\r\n获取到串口1数据:");            USART1_Putc(Uart1_Get_Data);            USART1_Puts("\r\n");      }            }}------------void USART1_IRQHandler(void){    //接收中断    if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)    {      USART_ClearITPendingBit(USART1,USART_IT_RXNE);      Uart1_Get_Data=USART_ReceiveData(USART1);        Uart1_Get_Flag=1;      }      //溢出-如果发生溢出需要先清空SR的溢出位,再读DR寄存器 则可清除不断入中断的问题    if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)    {      USART_ClearFlag(USART1,USART_FLAG_ORE);    //清溢出位      USART_ReceiveData(USART1);                //读DR    }}-----void USART_Configuration(void){    GPIO_InitTypeDef GPIO_InitStructure;    USART_InitTypeDef USART_InitStructure;    USART_ClockInitTypeDef USART_ClockInitStructure;      //使能串口1,PA,AFIO总线    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |             RCC_APB2Periph_AFIO |            RCC_APB2Periph_USART1 ,             ENABLE);    /* A9 USART1_Tx */    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      //推挽输出-TX    GPIO_Init(GPIOA, &GPIO_InitStructure);    /* A10 USART1_Rx  */    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入-RX    GPIO_Init(GPIOA, &GPIO_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_HardwareFlowControl = USART_HardwareFlowControl_None;    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;      USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;    USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;    USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;    USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;    USART_ClockInit(USART1, &USART_ClockInitStructure);        USART_Init(USART1, &USART_InitStructure);    /* Enable the USARTx */    USART_Cmd(USART1, ENABLE);    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);}void USART1_Putc(unsigned char c){    USART_SendData(USART1, c);    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );}void USART1_Puts(char * str){    while(*str)    {        USART_SendData(USART1, *str++);        /* Loop until the end of transmission */        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);    }}-----------------void NVIC_Configuration(void)
{
 NVIC_InitTypeDef NVIC_InitStructure;
 
 /* Configure one bit for preemption priority */
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
 
 /*UART2*/
 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);
}

发表于 2011-4-21 17:10:09

RE:无法进入中断接收程序

没有初始化串口、NVIC

瘦猪呆兔 发表于 2011-4-21 15:09:50

RE:无法进入中断接收程序

兄弟好像串口时钟没使能吧

fxw451 发表于 2011-4-21 16:02:19

RE:无法进入中断接收程序

中断配置对不??

瘦猪呆兔 发表于 2011-4-21 19:18:01

RE:无法进入中断接收程序

还有个原因是你串口2、3脚搞短接了,你发送的时候会进中断?

zhouke58 发表于 2011-4-22 23:31:56

RE:无法进入中断接收程序

串口无非就是以下几个步骤:
1:GPIO口设置TXD,RXD;
2.USARTX和对应GPIO口时钟使能;
3.USARTX全局中断NVIC设置
4.USART初始化设置包括波特率等;
5.使能USARTX外设,接收中断使能,发送中断使能
从你的程序没看出什么问题就一个地方NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;这里的USART1_IRQn应该不是这样写,除非你自己定义要不然应该是USART1_IRQChannel;
,你再看看你自己的初始化程序吧,应该漏掉以上的哪部分的.

wkong501 发表于 2013-3-23 16:03:57

回复:无法进入中断接收程序

回复第 6 楼 于2011-04-22 23:31:56发表:
串口无非就是以下几个步骤:
1:GPIO口设置TXD,RXD;
2.USARTX和对应GPIO口时钟使能;
3.USARTX全局中断NVIC设置
4.USART初始化设置包括波特率等;
5.使能USARTX外设,接收中断使能,发送中断使能
从你的程序没看出什么问题就一个地方NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;这里的USART1_IRQn应该不是这样写,除非你自己定义要不然应该是USART1_IRQChannel;
,你再看看你自己的初始化程序吧,应该漏掉以上的哪部分的.
 
第5点说错了, USART1_IRQn是3.X固件写法,你说的是2.0的
 

buainilema 发表于 2013-3-24 23:56:14

RE:无法进入中断接收程序

void USART1_IRQHandler(void)
这里错了!
页: [1]
查看完整版本: 无法进入中断接收程序