历史上的今天
返回首页

历史上的今天

今天是:2025年06月09日(星期一)

正在发生

2018年06月09日 | STM32自学之串口中断模式

2018-06-09 来源:eefocus

    今天是自学STM32的第7天了,之前的流水灯,按键,查询方式串口,PWM,计数器和红外有时间再补上来吧,先从今天调试的中断式串口写起吧。

    事先说明,写此博客只是为了记录自己的自学历程,由于水平极其有限,所以很多理解可能是错的,欢迎大家积极指出,让我们一起在嵌入式的开发上向前进。

   我所使用的是神舟三号学习开发板,芯片型号是STM32F103ZE。功能很齐全了,作为初期自学用绰绰有余。

   串口的printf在STM32程序调试过程中,确实可以起到实时跟踪程序进程的作用,但是经过昨天的红外和今天的中断式串口程序的坑爹BUG之后,深深感觉,没事还是不要加printf了,特别是在待处理事件的时间频率很高时,如昨天的红外调试时,信号的解码在ms级别,在加了printf和不加printf时,所解码的结果相差十万八千里。

  好了,回到正题,先上今天的中断式串口程序吧。

  以下是串口配置函数,我单独写了一个头文件,仅贴出核心部分。

void USART1_Configuration(void)
{
   //定义GPIO,,NVIC,USART结构体
   GPIO_InitTypeDef GPIO_InitStructure;
   NVIC_InitTypeDef NVIC_InitStructure;
   USART_InitTypeDef USART_InitStructure;
   //初始化系统时钟
   SystemInit();
//   //调试用指示灯 
//   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOF, ENABLE);   //首先是开调试用LED灯的GPIO口时钟
//   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
//   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;               //或者写成 GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2一直重复下去 
//   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
//   GPIO_Init(GPIOF,&GPIO_InitStructure);

//进行串口配置

//   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);   //开串口和GPIOA的时钟
   //进行中断配置
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                         //中断优先组0
   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;       
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
   //配置PA9即USART1_TX_
   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);
   //配置PA10即USART1_RX
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
   GPIO_Init(GPIOA,&GPIO_InitStructure);
   //配置USART1
   USART_InitStructure.USART_BaudRate=115200;
   USART_InitStructure.USART_WordLength=USART_WordLength_8b;
   USART_InitStructure.USART_StopBits=USART_StopBits_1;
   USART_InitStructure.USART_Parity=USART_Parity_No;
   USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
   USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
   USART_Init(USART1,&USART_InitStructure);

/***************

      今天的一大坑点来了。在开中断使能时,不能开IT-TXE中断使能,因为 初始化时也会有TXE置位,

  原因就是此时发送数据寄存器为空。今天在这里被深深的坑了一下

                                                    **************************/

// USART_ITConfig(USART1,USART_TI_TXE,ENABLE);    //就是这句,千万不能要,不然马上进入中断
   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
   USART_Cmd(USART1,ENABLE);
   USART_ClearFlag(USART1,USART_FLAG_TC);
}

再就是中断处理函数了。

void USART1_IRQHandler(void)
{
   int i=0;      //中断内读取字符串组用
   flag=0;     //主函数中打印字符串组用,每进一次中断就清零。 
// GPIO_Write(GPIOF,0X340); //调试时用来判断进入中断否的LED灯标志
   if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)    //每个中断函数最好都加上这句,原因我也不知道,前辈说的。
   {
      while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)    //如果接收数据寄存器非空,就不停地读
 {
              RxBuffer[i++]=USART_ReceiveData(USART1);

/********************

第二大坑点来了,这句本来是为了跟踪读取过程的,结果每次读了2个数据就跳出来了,

很是无语,开始怀疑是前面的配置有问题,一句句的核对了2个小时,实在没发现错误,

再拿出前几天调的查询时串口和这个作比较,发现唯一的不同是这里的printf多了一个\r\n。

其实也就是换行而已,结果我尝试性的把它去掉,一切正常。我嘞个去啊,坑了劳资一下午。

                                                                                 **************/
// printf("%c\r\n",RxBuffer[i-1]);  //调试用语句,为什么这里多一个\r\n就只能获取2个值便跳出中断??????????????
      }
 USART_ClearITPendingBit(USART1,USART_IT_RXNE);     //清除中断标志位,每个中断必备的,不然就出不来了。
   }
}


推荐阅读

史海拾趣

安碁科技(AKER)公司的发展小趣事

在电子行业快速发展的背景下,安碁科技始终坚持持续创新和客户导向的经营理念。公司不断投入研发资源,推出具有竞争力的新产品和解决方案,以满足客户不断变化的需求。同时,安碁科技也注重与客户的沟通和合作,深入了解客户的需求和反馈,不断优化产品和服务。这种以客户为中心的经营模式,使得安碁科技在市场上赢得了良好的声誉和口碑。

这五个故事只是安碁科技发展历程中的一部分,但它们充分展示了公司在电子行业中的崛起和发展。安碁科技凭借其卓越的技术实力、品质管理和创新能力,在激烈的市场竞争中脱颖而出,成为行业的佼佼者。未来,随着电子行业的不断发展和变化,安碁科技将继续保持创新和进取的精神,为客户和市场带来更多优质的产品和服务。

Chiefdom Electronic Co Ltd公司的发展小趣事

随着全球化的深入发展,Chiefdom Electronic Co Ltd意识到国际化布局对于提升竞争力的重要性。公司开始积极拓展海外市场,设立海外研发中心和销售网络,以便更好地了解当地市场需求和文化特点。通过本地化运营和定制化服务,公司成功打入多个国际市场,并获得了良好的业绩回报。这些国际化布局不仅提升了公司的整体竞争力,还为其在全球电子行业中占据了更加重要的地位。

Engineered Components Co公司的发展小趣事

Engineered Components Co(ECC)公司成立于XXXX年,由几位在电子制造领域有丰富经验的工程师共同创立。他们看到了电子行业中对于高质量、高精度电子元件的迫切需求,因此决定专注于此领域。ECC在创立初期就确立了以客户需求为导向,以技术创新为驱动的发展战略。他们通过自主研发,生产出了第一批高精度电子连接器,并在市场上获得了良好的反响。

AURORA公司的发展小趣事

为了降低外购成本、增加自主研发能力,AURORA公司进行了多次收购。比如,2019年5月,AURORA收购了激光雷达初创公司Blackmore,进一步提升了公司在自动驾驶感知技术方面的实力。2021年2月,AURORA又收购了OURS,这是该公司在不到两年的时间里收购的第二家激光雷达初创公司。这些收购使得AURORA在自动驾驶产业链上的布局更加完善,为公司未来的发展提供了有力支持。

Amphenol Thermometrics公司的发展小趣事

AURORA公司成立于2016年,初出茅庐便面临着巨大的挑战。然而,公司的三位联合创始人Chris Urmson、J. Andrew Bagnell和Sterling Anderson均来自自动驾驶汽车领域的顶尖团队,拥有丰富的经验和深厚的技术背景。他们凭借对自动驾驶技术的深刻理解和前瞻性眼光,为AURORA的发展奠定了坚实的基础。在初创时期,AURORA通过与多家汽车制造商合作,共同设计和开发传感器、软件和数据服务,逐渐在自动驾驶领域崭露头角。

Dynastream公司的发展小趣事

随着技术的不断进步,Dynastream公司意识到要想在竞争激烈的市场中立足,必须不断创新。因此,公司加大了研发投入,致力于提高产品的性能和稳定性。经过数年的努力,Dynastream成功推出了一款具有革命性意义的产品——一款高精度、低功耗的个人监视传感器。这一产品的推出,不仅让Dynastream在市场上树立了良好的口碑,也为公司未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

windows系统清理小工具ccleaner

小弟初到贵宝地,献上小礼物一份,与大家一同分享…

查看全部问答>

4000系列资料(总)

本来想一次传上去,但是网络问题自动退出。请原谅。 …

查看全部问答>

让人头大的屏蔽层问题......

使用了屏蔽层,结果不能正常使用, 请问如何正常使用屏蔽线的屏蔽层?…

查看全部问答>

上班了!重新求助关于调试BUG的问题!

产品:PDA设备,CPU:PXA270 起因:电源管理中,PDA有两种供电模式:1,电池;  2.外部电源或USB供电       当当前PDA是电池供电时,在CE系统的桌面的下方(任务栏上)无图标,在控制面板的电源管理中显示是电池 ...…

查看全部问答>

请问WinCE5.0下可以编程读取XML数据吗?

如题,如果有,能不能给几个相关资料链接呢?谢谢…

查看全部问答>

不看白不看

深圳程序员QQ群联盟拥有三十个以上的QQ群,人数达二千多人,现在群雄云集,现推介如下QQ群,如有兴趣速速加入:高级程序员:17538442c++:15195967 .NET:12203296 mobile:31501597嵌入式:37489763 …

查看全部问答>

WIFI链接程序

小弟不想用wince自带的WIFI配置链接程序 于是参考了 http://www.cnblogs.com/Jade2009/archive/2009/02/23/1368201.html 这里文章编写了一个程序 尝试进行链接:         WirelessConnect(g_FirstWirelessCard, L\"ABC\", ...…

查看全部问答>

请教stm32地址线复用问题?

                                 使用到FSMC总线控制16位LCD液晶,其中使用100Pin的STM32,A16连接到LCD的A0,那么在读写LCD的时候,A17,A18这些地 ...…

查看全部问答>

sw笨笨的STM32学前班教程之六:这些代码大家都用得到

注:下面是一些常用的代码,网上很多但是大多注释不全。高手看没问题,对于我们这些新手就费劲了……所以我把这些代码集中,进行了逐句注释,希望对新手们有价值。阅读flash: 芯片内部存储器flash操作函数我的理解——对芯片内部flash进 ...…

查看全部问答>