当前位置:首页 > 单片机 > 单片机
[导读]刚刚做了我的第一个嵌入式项目----基于STM32F103的频率和AD采集系统。是一个大系统的一个部分,没用操作系统,使用库函数编写,虽然东西很简单,但是对于我这个还没入门的菜鸟来说还是有点难度的。前后断断续续已经两

刚刚做了我的第一个嵌入式项目----基于STM32F103的频率和AD采集系统。

是一个大系统的一个部分,没用操作系统,使用库函数编写,虽然东西很简单,但是对于我这个还没入门的菜鸟来说还是有点难度的。前后断断续续已经两周多了,到目前为止系统已经完成了接近90%,在这个过程中犯了很多错误,也走了很多的弯路,在这里记录下来,让自己以后不要再犯同样的错误,也给那些和我一样刚入门的朋友一点提示。


1、USART初始化问题:

STM32F103启动文件默认有两个入口,一个是systemInit(),另一个是main(),其中systemInit默认是用户编写的软件初始化部分。

开始时我把时钟、GPIO、USART、定时器、EXTI、NVIC、ADC的初始化都放在了systemInit函数中,可是在测试中却发现USART初始化不成功。USART端口初始化成功的话默认为高电平,而在实际测试中却发现USART端口为低电平,第二次初始化却能成功初始化,这个问题困扰了我N天的时间。串口初始化不成功,后面的程序就无法进行。


错误原因:我在main函数中定义了几个全局变量,用于在中断中作为标记使用(中断中尽量不要放太多程序,最好只做一个标记,处理程序放到主程序中来完成)。

我把中断的初始化放在了systemInit函数中,在初始化过程中中断比mian初始化要早,但全局变量的定义都是在main中,所以导致了中断初始化失败,进而导致后面的程序初始化失败。而在第二次运行时,因为第一次已经给main中的变量分配空间,所以中断以及后面的程序都能成功运行。


错误处理:将除了时钟以外的模块都放入main中初始化,这样就保证了main中的全局变量能够成功分配空间。

(一定记住这个血淋淋的教训,还因此被老师狠狠鄙视了一番。。。)



2、中断问题:

程序要用到外部中断,但是在调试过程中发现程序无法进入中断。开始分析有两个原因,一是外部硬件设计问题,不能触发中断;二是中断没有初始化成功,中断向量或者中断通道没有成功初始化。

对于第一个分析,用示波器检测后发现端口电平有变化,说明硬件设计没有问题,问题出在软件上面。

开始时,我的中断向量初始化代码把配置中断引脚中断的代码放到了一起。

是这样的:


GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource2|GPIO_PinSource3|GPIO_PinSource4|GPIO_PinSource5);

/*配置中断引脚相应参数*/

EXTI_InitStruct.EXTI_Line=EXTI_Line0;

EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//设定中断模式为中断处理模式

EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//设定中断触发模式为上升沿触发

EXTI_InitStruct.EXTI_LineCmd=ENABLE;//使能中断

EXTI_Init(&EXTI_InitStruct);//按照结构体初始化中断

EXTI_InitStruct.EXTI_Line=EXTI_Line1;

EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//设定中断模式为中断处理模式

EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//设定中断触发模式为上升沿触发

EXTI_InitStruct.EXTI_LineCmd=ENABLE;//使能中断

EXTI_Init(&EXTI_InitStruct);//按照结构体初始化中断

..........


后来经过查阅手册得知,这样是不正确的,其实每个引脚跟每个中断线路是一一对应的,不能一起配置,要一对一配置。


解决:将代码改成这样就解决了:

[cpp]view plaincopyprint?

/*将GPIOE0-7引脚配置为中断引脚*/

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource0);

/*配置中断引脚相应参数*/

EXTI_InitStruct.EXTI_Line=EXTI_Line0;

EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//设定中断模式为中断处理模式

EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//设定中断触发模式为上升沿触发

EXTI_InitStruct.EXTI_LineCmd=ENABLE;//使能中断

EXTI_Init(&EXTI_InitStruct);//按照结构体初始化中断

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource1);

/*配置中断引脚相应参数*/

EXTI_InitStruct.EXTI_Line=EXTI_Line1;

EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//设定中断模式为中断处理模式

EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//设定中断触发模式为上升沿触发

EXTI_InitStruct.EXTI_LineCmd=ENABLE;//使能中断

EXTI_Init(&EXTI_InitStruct);//按照结构体初始化中断




/**************************************************未完待续**************************************************************/


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在电子电路领域,滤波是一项极为重要的技术手段,其主要目的是去除信号中不必要的频率成分,保留所需的信号分量,以确保电路的稳定运行和信号的准确传输。RC 串联滤波和单一电容滤波作为两种常见的滤波方式,虽然都利用电容的特性来实...

关键字: 滤波 频率 电子电路

在数字信号处理领域,滤波器作为一种重要的工具,用于对信号进行筛选、增强或抑制特定频率成分。FIR(有限脉冲响应)滤波器和 IIR(无限脉冲响应)滤波器是其中最为常用的两种类型,它们在结构、性能、设计方法以及应用场景等方面...

关键字: 数字信号 滤波器 频率

‌‌激光雷达是一种先进的遥感技术,通过发射激光束并测量其反射光的返回时间或频率变化,来精确探测目标物体的距离、速度、角度及其三维形状等信息‌

关键字: 激光雷达 频率

晶振的基本构成是从一块石英晶体上按一定方位角切下薄片,并在其两个对应面上涂覆银层作为电极,每个电极上各焊一根引线接到管脚上,再加上封装外壳就构成了石英晶体谐振器。当在石英晶体的两个电极上加一电场时,晶片会产生机械变形;反...

关键字: 晶振 频率

滤波器是个很重要的组件,它在生活中最为大家所知的功能就是“降噪”。不过,滤波器功能上的降噪是一个广义的降噪,不仅是声音的“噪声”,还有各种电信号中我们不想要的,人为定义的噪声分量。

关键字: 滤波器 频率

ORAN实现的另一个关键方面是精确的时间同步,特别是在5G环境中,精确的定时、频率和相位对准对于数据传输、切换以及无线单元和分布式单元之间的协调至关重要。

关键字: 5G 频率

在这篇文章中,小编将为大家带来变频器的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 变频器 电压 频率

电源在接通之初到提供稳定的输出必然需要一定的时间的稳定周期,在这个周期中电压的稳定度很难保证,所以电源设计者让电源延时100ms-500ms,等电源稳定后再向电脑提供高质量的电源。

关键字: 电源 频率

交流电的频率较低,正半周将电容器充满电荷以后,负半周仍未到来,则电流会在中途断流,电容器对于这个低频的交流电来说,就不是完全通路了。

关键字: 交流电 频率

电机我们都很熟悉,在生活中处处可见。日常的生产生活中,电动机基本都有所参与。变频器是一种控制设备,它可以改变电压的频率,同时还有很好的节能效果。

关键字: 电机 频率
关闭