寒假培训报告
本次寒假培训我们从原来的51最小系统转换到了STM32,开始了对STM32的学习,主要是通过一个课题让我们从新建工程开始,一步步地认识STM32,了解它,最后能够用它来实现我们想要实现的单片机功能。
题目:基于STM32的超声波测距显示系统
基本要求:利用STM32开发完成一个超声波测距系统(毫米级),要求能够实时显示所测距离,利用串口打印到电脑上,或者直接显示在LCD屏幕上,并且具有报警功能。(涉及内容:GPIO、定时/计数器、串口、显示屏的驱动)
前期:
搭建好STM32的开发环境,看视频来熟悉基本操作(打开/新建工程、添加/移除文件、编译、下载、配置工程文件),尝试着自己做一个工程模板;
根据视频资料和中文参考手册、数据手册等参考资料,从GPIO开始学起。我们学习使用的芯片是STM32F407ZGT6,它共有7组IO口(GPIOA-GPIOG),每组IO口有16个IO(GPIOA0-GPIOA15);GPIO的工作模式主要有8种(4种输入,4种输出):输入浮空、输入上拉、输入下拉、模拟输入,开漏输出、开漏复用输出、推挽输出、推挽复用输出。(使用IO口时,需使用寄存器对IO口进行配置)基于对GPIO的理解先编写了跑马灯程序(库函数版本):
* 初始化IO时钟(GPIO是外设的一种,外设需要提供时钟信号工作)
* 初始化IO口
* 设置IO口输出的高低电平
编写了跑马灯的程序后,继续对蜂鸣器和按键进行学习。蜂鸣器、按键的配置和LED灯的配置步骤相同,需注意的是按键的端口输出类型为GPIO_Mode_IN,而蜂鸣器和LED的端口输入类型为GPIO_Mode_OUT;与51不同的是STM32的按键有“支持连续按”和“不支持连续按”两种操作,在编写程序的时候就需要设置一个标志来分别这两种操作。
中期:
了解了一些STM32的最基本的东西后,我们开始了对中断、串口和定时器的学习。
与51不同的是,STM32的中断需要进行分组,组0-4,同时对每个中断设置一个抢占优先级和响应优先级。
STM32的每个IO口都可以作为中断输入,这就需要对IO口进行配置,其中最重要的是要设置IO口与中断线的映射关系,这样才能把外部中断与中断线连在一起;在设置中断触发条件的时候应设置为上升沿触发、下降沿触发或者是任意电平变化触发;编写中断服务函数也是很重要的,将想要进行的中断操作编写在中断服务函数中,在开启中断后才能够让程序顺利执行。串口和定时器的配置过程其实和中断的差不多啦,使能、初始化、IO口的复用映射,需注意的是串口需要用到数据寄存器和状态寄存器来操作串口数据的收发和传输状态的获取。定时器需要注意的是溢出时间的计算。
后期:
通过前两个周期的学习,对32的基本知识有了一定的了解,就开始把之前学习的模块结合起来,完成最终的课题:超声波测距。
超声波用的是HC_SR04,原理如下:
(1).给脉冲触发引脚(trig)输入一个长为20us的高电平方波 。
(2).输入方波后,模块会自动发射8个40KHz的声波,与此同时回波引脚(echo)端的电平会由0变为1;(此时应该启动定时器计时)
(3).当超声波返回被模块接收到时,回波引 脚端的电平会由1变为0;(此时应该停止定时器计数),定时器记下的这个时间即为超声波由发射到返回的总时长。
(4).根据声音在空气中的速度为344米/秒,即可计算出所测的距离。测试距离=(高电平时间*声速(340m/s))/2
在写超声波测距的课题过程中,我觉得有几个关键的地方:
* 对定时器和串口通信的原理和使用方法应该有一定的了解,在使用它们编写程序的时候要思路清晰,要注意定时器计算的是时间,在超声波的ECHO发出高电平的时候使能定时器,ECHO接收到低电平的时候关闭定时器,一次计时完成后运用距离转换公式length=t/58.8,将获取的时间转换为距离。
* 在利用串口进行阈值设置的时候,要注意给串口发送的不是我们看到的数字,而是字符串,而字符时以ASCII码的形式保存在数组中,0的ASCII码是48,我们就可以通过-48来进行数制的转换,完成设置阈值:
for(b=0;b<len;b++)
a+=(USART_RX_BUF[len-1-b]-48)*table[b];
通过这段时间的学习,我对STM32也有了一定的了解,也遇到了很多问题和难点,比如说对原理的理解,对多种寄存器的使用等等。这也让我知道了在学习东西的时候不能急,应该一步步来,打好基础,有一个好的基础才能在后面的学习过程中走得比较顺利,有了不懂的东西要及时去查资料或者问问身边的同学。在编写程序的过程之前应该先理清思路,在脑子里对整个程序有个大致的构思,然后再一步步去实现它,在编程的过程中应该细心、严谨,这样可以避免很多不必要的麻烦。