OpenEdv-开源电子网

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

串口2接收程序,无法进入到中断

[复制链接]

20

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-11-3
在线时间
79 小时
发表于 2017-8-28 19:15:20 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 辉常可乐 于 2017-8-28 21:37 编辑

最近买了一一块测PM2.5的传感器,传感器接通电源后直接输出PM2.5的值,输出格式如图。这是编写的串口2接收代码的主要部分,在主函数中执行时发现没有进入到中断,请问有谁能帮忙看看嘛?或者有相应类似的代码的,可以方便分享一下吗?
typedef struct
  {
      u8 head;
      u8 data[5];
      u8 tail;
      u8 data_pt;
      u8 lock_flag;
   }ptr_stack;
ptr_stack rx_stack;
void rx_stack_init(void)
{
         u8 i;
          rx_stack.head=0;
        for(i=0;i<=4;i++)
         {rx_stack.data=0;}
          rx_stack.tail=0;
          rx_stack.data_pt=0;
          rx_stack.lock_flag=UNLOCK;
          uart2_config();
}

void uart2_config(void)
{
    //GPIO&#182;&#203;&#191;úéè&#214;&#195;
    GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure1;
         
   RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO| RCC_APB2Periph_USART1, 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);

    //USART2_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 &#197;&#228;&#214;&#195;
       NVIC_InitStructure1.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 0;                //

        NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1&#196;ü
        NVIC_Init(&NVIC_InitStructure1);        //&#184;ù&#190;YNVIC_InitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèNVIC&#188;&#196;′&#230;&#198;÷USART1

    //USART 3&#245;ê&#188;&#187;ˉéè&#214;&#195;

        USART_InitStructure.USART_BaudRate = 2400;//ò&#187;°&#227;éè&#214;&#195;&#206;a9600;
        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_RXNE, ENABLE);//&#191;a&#198;&#244;&#214;D&#182;&#207;

    USART_Cmd(USART2, ENABLE);                    //ê1&#196;ü′&#174;&#191;ú
}


void USART2_IRQHandler(void)                        //′&#174;&#191;ú2&#214;D&#182;&#207;·t&#206;&#241;3ìDò
{
u8 res;
int i;
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //&#189;óê&#213;&#214;D&#182;&#207;(&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y±&#216;D&#235;ê&#199;0x0d 0x0a&#189;á&#206;2)        
        {
          res=USART_ReceiveData(USART2);
                if (rx_stack.lock_flag==UNLOCK);
                {
                if(res==0xaa)
                        {rx_stack.head=res;}
                        else if(res==0xff)
                        {rx_stack.tail=res;}
                else{
                        rx_stack.data[rx_stack.data_pt]=res;
                       rx_stack.data_pt++;
        if((rx_stack.data_pt>=5)&&(rx_stack.data[4]==rx_stack.data[0]+rx_stack.data[1]+rx_stack.data[2]+rx_stack.data[3])&&(rx_stack.tail==0xff))                           
                            rx_stack.lock_flag=LOCK;
                        }
                  }
         }
          USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}





捕获.PNG

串口读取PM2.5实验.zip

324.09 KB, 下载次数: 213

最佳答案

查看完整内容[请看2#楼]

RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO| RCC_APB2Periph_USART1, ENABLE);这句有问题,GPIO是用RCC_APB1
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2016-4-19
在线时间
139 小时
发表于 2017-8-28 19:15:21 | 显示全部楼层
RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO| RCC_APB2Periph_USART1, ENABLE);这句有问题,GPIO是用RCC_APB1
回复

使用道具 举报

20

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-11-3
在线时间
79 小时
 楼主| 发表于 2017-8-28 19:32:59 | 显示全部楼层
各位单身的贵族大神们,帮忙看看啊,自己调了两天了,就是不知道哪有问题啊,本来是想用串口2接收,再用串口1打印出来的
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-28 20:25:18 | 显示全部楼层
用示波器测一下RX这条线上用信号没
回复

使用道具 举报

20

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-11-3
在线时间
79 小时
 楼主| 发表于 2017-8-28 20:58:23 | 显示全部楼层
huanghan 发表于 2017-8-28 20:25
用示波器测一下RX这条线上用信号没

有信号的,我用串口转usb模块直接接到电脑上,会按照图中格式打印出读数来
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-28 21:20:13 | 显示全部楼层
本帖最后由 huanghan 于 2017-8-28 21:22 编辑

你两个波特频率一样,那你的配置有问题
回复

使用道具 举报

20

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-11-3
在线时间
79 小时
 楼主| 发表于 2017-8-28 21:20:34 | 显示全部楼层
这个是用开发板例程改写的完整版程序,哪位大神前辈帮忙看看。感激不尽啦(选用串口2接收,自己定义了一对结构体作为接收缓存)

串口读取PM2.5实验.zip

324.09 KB, 下载次数: 213

回复

使用道具 举报

20

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-11-3
在线时间
79 小时
 楼主| 发表于 2017-8-28 21:23:29 | 显示全部楼层
huanghan 发表于 2017-8-28 21:20
你两个波特频率一样吗?

不一样的,串口2设置成了2400,串口1是9600,我已经把例程传上来了,您可以下载下来看一下
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-28 21:26:11 | 显示全部楼层
本帖最后由 huanghan 于 2017-8-28 21:41 编辑

你有两个串口不知道你用哪个去收,如果用USART1收,那么uart_init(9600);//9600改为2400  

int main(void)
{
        int pm;
        u8 t;
        u8 len;        
        u16 times=0;         
         
        ptr_stack rx_stack;
         SystemInit();//系统时钟等初始化
        delay_init(72);             //延时初始化
        NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        rx_stack_init();
  uart_init(9600);//串口初始化为9600
        LED_Init();         //LED端口初始化
        while(1)
        {
//                if(USART_RX_STA&0x80)
//                {                                          
//                        len=USART_RX_STA&0x3f;//得到此次接收到的数据长度
//                        printf("\n您发送的消息为:\n");
//                        for(t=0;t<len;t++)
//                        {
//                                USART1->DR=USART_RX_BUF[t];
//                                while((USART1->SR&0X40)==0);//等待发送结束
//                        }
//                        printf("\n\n");//插入换行
//                        USART_RX_STA=0;
//                }else
//                {
//                        times++;
//                        if(times%5000==0)
//                        {
//                                printf("\nMiniSTM32开发板 串口实验\n");
//                                printf("正点原子@ALIENTEK\n\n\n");
//                        }
//                        if(times%200==0)printf("请输入数据,以回车键结束\n");  
//                        if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
//                        delay_ms(10);   
//                }
         if(rx_stack.lock_flag==LOCK)
         {
                 pm=ptr_handle(&rx_stack.data[0]);
              printf("%d\n",pm);
                 rx_stack_init(); //为什么在这里又初始化
         }
   LED1=!LED1;
   delay_ms(500);
         }
        }
回复

使用道具 举报

20

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-11-3
在线时间
79 小时
 楼主| 发表于 2017-8-28 21:36:20 | 显示全部楼层
huanghan 发表于 2017-8-28 21:26
int pm;
        u8 t;
        u8 len;        

应该不是这里的问题,我改了之后还是一样的,主函数中if语句根本进不去,执行的结果只有LED1在闪烁,没有打印出PM值来
回复

使用道具 举报

20

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-11-3
在线时间
79 小时
 楼主| 发表于 2017-8-28 21:40:07 | 显示全部楼层
本帖最后由 辉常可乐 于 2017-8-28 21:43 编辑
huanghan 发表于 2017-8-28 21:26
int main(void)
{
        int pm;

这里初始化是为了将结构体解锁,结构体解锁后才能再次读取数据,用的uart2接收数据,串口1打印出来,传感器练在uart2接收端的
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-28 21:50:03 | 显示全部楼层
rx_stack_init(); //为什么在这里又初始化 去掉
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-28 21:59:13 | 显示全部楼层
本帖最后由 huanghan 于 2017-8-29 08:27 编辑

给你改了一下,先把rx_stack_init();注释掉,编译,下载测试,如果有USART2中断串口1会打印 USART2_IRQHandle

串口读取PM2.5实验.rar

4.61 MB, 下载次数: 149

回复

使用道具 举报

13

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2016-4-19
在线时间
139 小时
发表于 2017-8-29 10:36:38 | 显示全部楼层
wanghy 发表于 2017-8-29 10:34
RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO| RCC_APB2Peri ...

RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2?????
回复

使用道具 举报

18

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
465
金钱
465
注册时间
2016-1-20
在线时间
89 小时
发表于 2017-8-29 11:00:35 | 显示全部楼层
楼上正解
回复

使用道具 举报

18

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
465
金钱
465
注册时间
2016-1-20
在线时间
89 小时
发表于 2017-8-29 11:02:22 | 显示全部楼层
你的时钟使能错误了串口1和串口2的时钟使能函数错误
RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO| RCC_APB2Periph_USART1, ENABLE);
//APB2的函数去打开APB1的时钟
回复

使用道具 举报

13

主题

156

帖子

0

精华

高级会员

Rank: 4

积分
883
金钱
883
注册时间
2017-8-7
在线时间
200 小时
发表于 2017-8-29 11:09:06 | 显示全部楼层
两种办法查一下你的问题在哪,第一是用串口1去读你的传感器,如果能读出来,就证明你的传感器没有毛病,第二个就是用串口2和电脑通信,看串口2配置有没有错误
回复

使用道具 举报

20

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-11-3
在线时间
79 小时
 楼主| 发表于 2017-8-29 15:32:06 | 显示全部楼层
wanghy 发表于 2017-8-29 10:34
RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO| RCC_APB2Peri ...

对的对的,就是这里配置出了点问题,改好后串口可以接收到数据了,谢谢您了,另外能否麻烦您帮忙看一下ptr_handle()函数,我调试的时候显示是已经接受到数据了,但是串口打印不出来pm值。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 06:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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