OpenEdv-开源电子网

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

请问,我在串口中断函数里面加了led的函数,让它发送数据回电脑前led闪烁一下,可电脑发送后只有led亮没有闪,还收不到数据

[复制链接]

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2016-10-28
在线时间
13 小时
发表于 2016-10-28 19:10:01 | 显示全部楼层 |阅读模式
1金钱
请问,我在串口中断函数里面加了led的函数,让它发送数据回电脑前led闪烁一下,可电脑发送后只有led亮没有闪,还收不到数据,仿佛程序就卡在串口中断函数中的GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10)这一行,是怎么回事?是程序问题吗还是别的。想了很久都没想出来,求助。


#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "fengminqi.h"

//ALIENTEK ì½Ë÷ÕßSTM32F407¿a·¢°å êμÑé0
//STM32F41¤3ìÄ£°å-¿aoˉêy°æ±¾
//¼¼êõÖ§3Ö£owww.openedv.com
//ìÔ±|μêÆì£ohttp://eboard.taobao.com
//1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾  
//×÷ÕߣoÕyμãÔ-×ó @ALIENTEK


void My_USART1_Init(void)
{
          GPIO_InitTypeDef  GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//ê1ÄüUSART1ê±Öó
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        USART_InitStructure.USART_BaudRate=115200;
        USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
        USART_InitStructure.USART_Parity=USART_Parity_No;
        USART_InitStructure.USART_StopBits=USART_StopBits_1;
        USART_InitStructure.USART_WordLength=USART_WordLength_8b;
       
        USART_Init(USART1,&USART_InitStructure);
        USART_Cmd(USART1 ,ENABLE);

        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
       
        NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_InitStructure);
       
       
}

void USART1_IRQHandler(void)
{
        u8 res;
        if(USART_GetITStatus(USART1,USART_IT_RXNE))
        {
                GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
               
                delay_ms(200);
                GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
               
                delay_ms(200);
               
                res=USART_ReceiveData(USART1);
                USART_SendData(USART1,res);

        }

}
int main(void)
{  
        LED_Init();
        FENGMINQI_Init();
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        My_USART1_Init();
        while(1);
}

最佳答案

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

就是想进入中断时让LED灯亮一会儿才想到要加延时的,加了延时显示就出问题了 有解决办法吗 设定一个标志位,在中断服务程序中将标志位置1,主程序中查询这个标志位,如果被置1则点亮LED并延时。实际上你说的无限中断是你程序的问题。中断中是可以调用延时函数的。 中断的目的就是为了提高效率 你延时违背原则啦 理论上是可以放的,但是实际上绝对不要这样做。单片机设计中断的目的是为了减少处理外部事件时所占用的单片机 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2016-10-28
在线时间
13 小时
 楼主| 发表于 2016-10-28 19:10:02 | 显示全部楼层
就是想进入中断时让LED灯亮一会儿才想到要加延时的,加了延时显示就出问题了 有解决办法吗

设定一个标志位,在中断服务程序中将标志位置1,主程序中查询这个标志位,如果被置1则点亮LED并延时。实际上你说的无限中断是你程序的问题。中断中是可以调用延时函数的。

中断的目的就是为了提高效率 你延时违背原则啦

理论上是可以放的,但是实际上绝对不要这样做。单片机设计中断的目的是为了减少处理外部事件时所占用的单片机运行时间。在中断处理程序中加入延时会使外部事件处理占据大部分运行时间。当延时时间大于中断发生的周期时,单片机就会一直运行中断程序,导致主程序没有时间运行。
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12999
金钱
12999
注册时间
2012-11-26
在线时间
3791 小时
发表于 2016-10-28 19:25:35 | 显示全部楼层
在串口接收中断里delay 400 ms  简直作死   原因也不想解释了,就问你,200ms在115200的波特率下,能接收多少字节数据了
回复

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2016-10-28
在线时间
13 小时
 楼主| 发表于 2016-10-29 11:37:03 | 显示全部楼层
jermy_z 发表于 2016-10-28 19:25
在串口接收中断里delay 400 ms  简直作死   原因也不想解释了,就问你,200ms在115200的波特率下,能接收多 ...

115200/8/0.2=2880  是的,昨晚我把延时改得很小,就能接收了,于是我就开始怀疑串口中断函数是有时间限制或是有字节限制,根本原因尚不清楚,只怪我还学艺不精,还请指导一下哪里有参考资料可以研究
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12999
金钱
12999
注册时间
2012-11-26
在线时间
3791 小时
发表于 2016-10-29 11:41:16 | 显示全部楼层
绵延的山峰 发表于 2016-10-29 11:37
115200/8/0.2=2880  是的,昨晚我把延时改得很小,就能接收了,于是我就开始怀疑串口中断函数是有时间限 ...

上面已经回答过了

在中断里用延时 就是找死
学无止境
回复

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2016-10-28
在线时间
13 小时
 楼主| 发表于 2016-10-29 11:57:46 | 显示全部楼层
绵延的山峰 发表于 2016-10-29 11:37
115200/8/0.2=2880  是的,昨晚我把延时改得很小,就能接收了,于是我就开始怀疑串口中断函数是有时间限 ...

     
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2016-10-29 15:54:45 | 显示全部楼层
中断里还有敢延时的,真的不知道“死”字怎么写
我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2016-10-28
在线时间
13 小时
 楼主| 发表于 2016-10-29 16:53:04 | 显示全部楼层
对贴友反映强烈的回复,表示高兴,可毕竟我刚学习中断不久,难免懵懵懂懂,中断里面延时的确是找死,我知道错了,我接受,可死也要有个死因啊。毕竟我还是第一次在论坛发帖,不周到之处还请包涵。
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-10-29
在线时间
2 小时
发表于 2016-10-29 19:37:14 | 显示全部楼层
本帖最后由 Nqsoon 于 2016-10-30 12:42 编辑
绵延的山峰 发表于 2016-10-29 16:53
对贴友反映强烈的回复,表示高兴,可毕竟我刚学习中断不久,难免懵懵懂懂,中断里面延时的确是找死,我知道 ...

把自己当成傻子,不懂就问,才能学得更多。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-3-1 05:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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