OpenEdv-开源电子网

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

串口中断接收问题

[复制链接]

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2016-4-28
在线时间
27 小时
发表于 2017-3-2 21:31:22 | 显示全部楼层 |阅读模式
1金钱
[mw_shl_code=c,true]#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "usart2.h"
#include "crc8_16.h"


       
int main(void)
{       
extern u8 USART_TX_BUF[12];
extern u8 USART3_RX_BUF[12];          
        u8 i=0;
        delay_init();                     //Ñóê±oˉêy3õê¼»ˉ          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);         //éèÖÃNVICÖD¶Ï·Ö×é2:2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
        uart_init(115200);                 //′®¿ú3õê¼»ˉÎa115200
        uart2_init(115200);
        uart3_init(115200);
        LED_Init();                             //LED¶Ë¿ú3õê¼»ˉ
        LCD_Init();
        POINT_COLOR=RED;
                
          while(1)
        {
           //if(flag==1)
             Put_String((u8*)(USART_TX_BUF+i));
                 if(i>12)
                 i=0;
                 for(i=0;i<12;i++)
                 {
                         LCD_ShowString(30,10+20*i,200,16,16,&USART_TX_BUF);
                 LCD_ShowString(100,10+20*i,200,16,16,&USART3_RX_BUF);
                 }
                 LED0=!LED0;
                 delay_ms(250);
                 
                 
                 
}         
}
[/mw_shl_code]


[mw_shl_code=c,true]#include "sys.h"
#include "usart2.h"
//////////////////////////////////////////////////////////////////////////////////         
char USART_TX_BUF[12]={"0123456789\r\n"}; //
char USART3_RX_BUF[12];   
u8 Rx_Lenght;        
u8 Rx_flg;
void uart2_init(u32 bound)
{
    //GPIO????
    GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
     //USART2_TX   PA.2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    //USART1_RX          PA.3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

   //Usart1 NVIC ??

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ????
        NVIC_Init(&NVIC_InitStructure);        //??NVIC_InitStruct???????????NVIC???USART1
  
   //USART ?????
   
        USART_InitStructure.USART_BaudRate = bound;//?????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_Init(USART2, &USART_InitStructure);
  
    USART_ITConfig(USART2, USART_IT_TXE, ENABLE);//????
   
    USART_Cmd(USART2, ENABLE);                    //????

}

void Put_String(u8 *p)
{  
       

        while(*p)  
        {
                USART_SendData(USART2, *p++);   
                while(USART_GetFlagStatus(USART2, USART_FLAG_TXE)== RESET){  }  
                USART_ClearITPendingBit(USART2, USART_IT_TXE);
        }
       
}  
//?????????????
void Uart_PutChar(u8 ch)
{     

      
  USART_SendData(USART2, (u8) ch);     
  while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET){     }
  USART_ClearITPendingBit(USART2, USART_IT_TXE);
   
  //return ch;
}
void Uart_PutString(u8* buf,u8 len)
{   
          u8 i;
        for(i=0;i<len;i++)   
         {  
            Uart_PutChar(*buf++);   
         }
}

void uart3_init(u32 bound)
{
           GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
     //USART3_TX     PB.10
   
   
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

   
    //USART1_RX                   PB11
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   //Usart1 NVIC ??

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;               
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ????
        NVIC_Init(&NVIC_InitStructure);        //??NVIC_InitStruct???????????NVIC???USART1
  
   //USART ?????
   
        USART_InitStructure.USART_BaudRate = bound;//?????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_Init(USART3, &USART_InitStructure);
   
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//??????3
            
    USART_Cmd(USART3, ENABLE);                    //????3   

}

/*void USART1_IRQHandler(void)                        //??1??????
{
        //u8 i=0;
        if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)  //????(?????????0x0d 0x0a??)
       
                {
                  flag1=1;
                  USART_ClearITPendingBit(USART1, USART_IT_TXE);
                  //USART_SendData(USART1, USART_RX_BUF[i++]);                            
        }
                else
                {flag1=0;}
}*/
/*void USART3_IRQHandler(void)                        //??3??????
{
        //u8 i=0;
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //????(?????????0x0d 0x0a??)
       
        {
          flag3=1;
          USART_ClearITPendingBit(USART3,USART_IT_RXNE);
          //USART_RX_BUF[i++]=USART_ReceiveData(USART3);
          
        }
        else{flag3=0;}
      
}*/
void USART3_IRQHandler(void)
{  u8 tmp;   
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
         
          {   
                  tmp=USART_ReceiveData(USART3);   
                        if(tmp!='\0')   
                        {  
                                Rx_Lenght=0;        
                                Rx_flg=1;      
                                USART_ClearITPendingBit(USART3, USART_IT_RXNE);
                        }   
                                else {   
                                                USART3_RX_BUF[Rx_Lenght]=tmp;     
                                                Rx_Lenght++;     
                                         }
        }
       
}








[/mw_shl_code]写了一个用串口2发个串口3的程序,用仿真可以看出数据已经成功发送,但中断接收不到任何数据,还望各位大神帮忙看一下,谢谢

串口副.rar

2.66 MB, 下载次数: 60

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

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2016-4-28
在线时间
27 小时
 楼主| 发表于 2017-3-3 13:36:27 | 显示全部楼层
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
发表于 2017-3-3 15:16:40 | 显示全部楼层
虽然不懂  但建议你把设置文字改成 中文GB2312  免得中文注释乱码
回复

使用道具 举报

22

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2012-9-7
在线时间
3 小时
发表于 2017-3-3 15:46:03 | 显示全部楼层
首先你可以看一下中断有没有打开,然后在线调试一下,看看中断服务程序有没有进去,如果进去了,看看接收标志位是不是置位了,一步一步的往下调试就是了,这东西最好还是自己慢慢解决。
回复

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2016-4-28
在线时间
27 小时
 楼主| 发表于 2017-3-3 23:33:27 | 显示全部楼层
liusukai 发表于 2017-3-3 15:46
首先你可以看一下中断有没有打开,然后在线调试一下,看看中断服务程序有没有进去,如果进去了,看看接收标 ...

程序中中断是有打开,我开在线调试,发现中断接收不到数据,接收标志位也正常开了
回复

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2016-4-28
在线时间
27 小时
 楼主| 发表于 2017-3-3 23:34:03 | 显示全部楼层
我是路人甲 发表于 2017-3-3 15:16
虽然不懂  但建议你把设置文字改成 中文GB2312  免得中文注释乱码

好的好的
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2017-3-4 18:31:26 | 显示全部楼层
解决了没??

看你的程序好多????
看着好累
回复

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2016-4-28
在线时间
27 小时
 楼主| 发表于 2017-3-5 16:04:32 | 显示全部楼层
peng1554 发表于 2017-3-4 18:31
解决了没??

看你的程序好多????

还没,主要是用了2个串口
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 16:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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