STM32F103频率和AD採集项目总结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F103频率和AD採集项目总结相关的知识,希望对你有一定的参考价值。
刚刚做了我的第一个嵌入式项目----基于STM32F103的频率和AD採集系统。
是一个大系统的一个部分。没用操作系统,使用库函数编写,尽管东西非常easy。可是对于我这个还没入门的菜鸟来说还是有点难度的。
前后断断续续已经两周多了。到眼下为止系统已经完毕了接近90%,在这个过程中犯了非常多错误。也走了非常多的弯路。在这里记录下来。让自己以后不要再犯相同的错误。也给那些和我一样刚入门的朋友一点提示。
1、USART初始化问题:
STM32F103启动文件默认有两个入口。一个是systemInit(),还有一个是main(),当中systemInit默认是用户编写的软件初始化部分。
開始时我把时钟、GPIO、USART、定时器、EXTI、NVIC、ADC的初始化都放在了systemInit函数中,但是在測试中却发现USART初始化不成功。USARTport初始化成功的话默觉得高电平,而在实际測试中却发现USARTport为低电平,第二次初始化却能成功初始化,这个问题困扰了我N天的时间。
串口初始化不成功,后面的程序就无法进行。
错误原因:我在main函数中定义了几个全局变量。用于在中断中作为标记使用(中断中尽量不要放太多程序。最好仅仅做一个标记,处理程序放到主程序中来完毕)。
我把中断的初始化放在了systemInit函数中,在初始化过程中中断比mian初始化要早,但全局变量的定义都是在main中,所以导致了中断初始化失败。进而导致后面的程序初始化失败。而在第二次执行时,由于第一次已经给main中的变量分配空间,所以中断以及后面的程序都能成功执行。
错误处理:将除了时钟以外的模块都放入main中初始化,这样就保证了main中的全局变量可以成功分配空间。
(一定记住这个血淋淋的教训,还因此被老师狠狠歧视了一番。。
。)
2、中断问题:
程序要用到外部中断。可是在调试过程中发现程序无法进入中断。開始分析有两个原因,一是外部硬件设计问题,不能触发中断;二是中断没有初始化成功,中断向量或者中断通道没有成功初始化。
对于第一个分析,用示波器检測后发现port电平有变化。说明硬件设计没有问题,问题出在软件上面。
開始时。我的中断向量初始化代码把配置中断引脚中断的代码放到了一起。
是这种:
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);//依照结构体初始化中断 ..........
后来经过查阅手冊得知。这样是不对的,事实上每一个引脚跟每一个中断线路是一一相应的。不能一起配置,要一对一配置。
解决:将代码改成这样就攻克了:
/*将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);//依照结构体初始化中断
/**************************************************未完待续**************************************************************/
以上是关于STM32F103频率和AD採集项目总结的主要内容,如果未能解决你的问题,请参考以下文章
STM32F103VET6基于STM32CubeMX利用EXTI外部中断测量PWM频率
STM32F103五分钟入门系列时钟框图+相关寄存器总结+系统时钟来源代码(寄存器)