STM32F051学习开发笔记——声控电子钟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32F051学习开发笔记——声控电子钟
作者介绍:
以前主要是从事STM8和51的开发,用过STM32S10和A T91SAM的32位机。
很喜欢玩单片机。
出来两年,以前在家电方案公司做家电,现在在一家车载电子公司写软件。
学习开发的原由:
看到高性价比的新产品想学点以后备用;
看了STM32F051资料后发现它以前的STM32S10功能上多个日历和触摸功能, 触摸要重新制板,有些麻烦,所以做了电子钟的项目;
以前用ST的MCU做的项目比较多入手有优势;
感谢ST发了块开发板,DIY就容易多了。
第一步上MUC跑起来
1)找工程看例子
拿到板后,我收集了大最关于STM32F051的资料。
我习惯的去找已建好的工程(我觉得把间时浪费在建功能和设置编程环境太浪费了),刚开始怎么也联不上,一直以为ST-LINK驱动问题,后来发现我用IAR版本太底,下了个V6402就好了。
STM32F051有两个开发板,一个是针对我手上MB1034B简单的,它对应的工程文件是"stm32f0discovery_fw",但里面的例子太少了,就几个灯闪一闪那种,后来直接就用"stm32f0_stdperiph_lib"文件搞了个例子来做测试,虽然例子多,但很多地方不兼容,按键、LED、就连系统电压都不一样!ST做得有点不到位。
不过这样也好,能在测试过程有点可学的,我就选了里面的"STM32F0xx_StdPeriph_Templates"来建的工程。
要用什么功能就去'STM32F0xx_StdPeriph_Examples'里面找,有时候找不到还可去STM32S10的例子中找,程序复制过来小改就可用。
2)点LED
"STM32F0xx_StdPeriph_Templates"的工程里面只要改"stm320518_eval.h" LED的几个定义,删除LCD显示就可直接调用STM_EV AL函数,很顺利的把那两个灯点亮。
3)调串口输出
因为没有显示器,习惯用UART将数据送到PC机中,主要是用"printf()"方便调试,我在"PUTCHAR_PROTOTYPE"中映射到UART1的。
STM32的配置外设比STM8和51要复杂一些,STM8和51只要配置一下其本的串口协议就可以了,但STM32还要进行如下配置。
1、开启对应的IO和串口时钟;
2、配置IO的收发功能;
3、基本的串口配置;
4、使能串口;
5、如果要用中断,除了在USART的寄存器开启外还要在NVIC中配置;
4)看时钟
STM32F051有较多的时钟,它对编程也很重要,要一个个找资料查出工程是多少会算晕的,我调用"RCC_GetClocksFreq()"后全部打印出来,结果如下:
SYSCLK_Frequency=48000000
HCLK_Frequency=48000000
PCLK_Frequency=48000000
ADCCLK_Frequency=14000000
CECCLK_Frequency=32786
I2C1CLK_Frequency=8000000
USART1CLK_Frequency=48000000
是不是省了很多事?
在看程序的时候发现了STM32F051中的Delay()不是简单盾环,而是通过SysTick来实现的,SysTick可充当系统时钟。
可以省个定时器,而且配置使用比51的定时器还简单!
第二步可行性测试
我先用PC机采样了一下空/实拍手的波形,看了之感觉很MCU容易完成,规律性太强了,算一下频率就可以搞定。
PC机录出来的波形(左边为三次实拍, 右边为三次空拍)
但事实并不是那样,我先用DMA+ADC获取拍手的声音,每6uS的采样,采样好的波形就把它传到PC机上,倒到Excel分析,刚开始波形很杂,纠结了好久才发现是硬件问题。
改进后的电路图
经过几次改进才达到一般的较果,但与PC机比起来还是有一定的距离。
下面是用MCU 空/实拍手的波形图。
它的规律性还是比效强的。
空心拍手实心拍手
在做实验的时候每工作十几分钟就会死机,主要是采样到波形处理传送给PC出了问题,仿真时跳到了HardFault_Handler中断中导致死机。
我第一想法是缓存溢出,可能是那个数组中的指针超出的范围。
我在每个数组后面加了一个测试单元,发现并不是这个问题。
后来发现是DMA处理出了问题,我用的是循环ADC采样+DMA过半中断后进行数据转移,因波形处理传送时因时间太长,我把DMA先关闭(对相应通导的DMA_CCR),处理完后再开启,就是这个导致的死机。
我常试过把ADC使关闭,也不行。
最后我选择了什么都不关,来个标志位识别,在DMA中断时看是否需要数据转。
反正花不了多少电和间时。
第三步设计程序
我的程序主要有三部分:
1、采集声音波形并分析结论;
2、信息与日历时钟处理;
3、显示更新输出.
它们的代码依次在V oice、Calendar、Display这几个文件内。
波形分析花了我比较多的时间,主要不是在程序,而是找波形的规律,原打算能实别点汉字,看了好几份语音识别的资料,发现里面的算法非常多,不是一两天能搞定,而且STM32F051这块MCU只有8K的RAM实在有些费力,所以就搞了个空/实拍手识别。
这个功能想起来容易,但它却花费了我整个项目一半的时间,最后得出的结论是:要经功率、频率、周期和过零点综合判断。
一般情况下正确实别率可达95%以上。
时钟管理是最轻松的了,MCU自带的RTC外设再加下ST的库文件的技持,很容易搞定时钟与日历功能。
显示部分我原打算搞个大点的数码管或是LCD点阵,但STM32F051这块MCU有多通
导的DMA,串口调试有现成的硬件。
我偷了点懒也为了熟悉一下这块MCU功能,我就用
DMA+UART来刷新PC机上的串口调试助手。
DMA+UART在STM32F05的例子中并没有找到,我是参考了STM32F10中的,将DMA_CCR中的CIRC设置成非盾环模式,方便有更新需要时才输出。
在初始化后使能发出了完整的数据,后面不管怎么使能都不发数据,后来看了技术手册才发现要对DMA中的CNDTR重新复值才能再次发出数据。
功能具体的操作:
进入设置:实空实连续拍手
退出设置:空实空连续拍手
向上调节:实心拍手
向下调节:空心拍手
前进调节:实实连续拍手
后退调节:空空连续拍手
最后我把它整理了一下,我尽可能的把代码做成可读信高、移植性强。
总结:
STM32F051与8位机相比除了速度快外,最大的特点是它的DMA功能,处理多个时效要求较高、数据最大的传输有很大的优势。
如点TFT彩屏、连续高速度采ADC,这个8位机即使能做,恐怕基本上就只能做这一件事情了。
二〇一二年八月二十九日
Dallom。