第二章stm技术强化_第1页
第二章stm技术强化_第2页
第二章stm技术强化_第3页
第二章stm技术强化_第4页
第二章stm技术强化_第5页
已阅读5页,还剩254页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第二章第二章 STM32STM32强化应用强化应用本章目标本章目标掌握掌握GPIOGPIO口输入输出口输入输出的用法的用法掌握掌握stm32stm32的中断系统的中断系统掌握通用定时器的三个用法掌握通用定时器的三个用法掌握掌握SPISPI、I2CI2C接口的用法接口的用法掌握以太网、液晶等的用法掌握以太网、液晶等的用法第二章第二章 STM32STM32强化应用强化应用2.1 STM322.1 STM32要点要点 2.1.1 2.1.1 命名规范命名规范 STM32F103RBT6:64引脚,128K的flash,LQFP封装第二章第二章 STM32STM32强化应用强化应用2.1 STM322

2、.1 STM32要点要点 2.1.2 FLASH2.1.2 FLASH容量、选型容量、选型 第二章第二章 STM32STM32强化应用强化应用2.1 STM322.1 STM32要点要点 2.1.3 2.1.3 启动文件选择启动文件选择 第二章第二章 STM32STM32强化应用强化应用2.1 STM322.1 STM32要点要点 2.1.4 2.1.4 时钟树时钟树 系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用:、送给AHB总线、内核、内存和DMA使用

3、的HCLK时钟。、通过8分频后送给Cortex的系统定时器时钟。、直接送给Cortex的空闲运行时钟FCLK。第二章第二章 STM32STM32强化应用强化应用2.1 STM322.1 STM32要点要点 2.1.4 2.1.4 时钟树时钟树、送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。、送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大

4、频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。第二章第二章 STM32STM32强化应用强化应用2.1 STM322.1 STM32要点要点 2.1.4 2.1.4 时钟树时钟树 第二章第二章 STM32STM32强化应用强化应用2.1 STM322.1 STM32要点要点 2.1.5 2.1.5 管脚功能管脚功能 第二章第二章 STM32STM32强化应用强化应用2.1 STM322.1 STM32要点要点

5、2.1.6 2.1.6 技术手册技术手册 CM3权威指南:主要讲解了Cortex M3内核的原理和实现; STM32中文参考手册:使用最频繁的文档,详细讲解stm32的接口、外设的原理,使用方法和寄存器; STM32F10 xxx Cortex编程手册:需要注意的是其中的系统寄存器; STM32F10 xxx闪存编程手册:主要讲解了怎么对程序存储器进行操作; STM32芯片的芯片手册:所选芯片的管脚、功能、性能等。 其中,参考手册、编程手册注重功能和操作方式,而芯片手册更注重量化指标(如时序、允许的最大最小值等)。第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPI

6、O口输出口输出 2.2.1 2.2.1 基础基础 在stm32芯片中,每个通用输入输出口(GPIO口)都有16个口线,如GPIOA,包含了GPIOA0GPIOA15,一般简写为PA0PA15。但是,芯片并不一定包含所有的口线,比如在终端设备所使用的stm32f103RB芯片中,通用IO口有GPIOA,GPIOB,GPIOC和GPIOD的PD0PD2。共计51个管脚可以用作输入输出口通用通用IOIO和复用功能和复用功能 GPIO(General Purpose Input Output,通用输入输出接口)是MCU与外部电路和设备连接的基本外设。也就是常说的端口或管脚。 AFIO(Alternat

7、e Fuction IO,复用功能IO)是指某些GPIO除了通用功能外还可以设置为一些外设专用的功能 STM32F103RBT6有51个GPIO端口,其中的一些还可以把复用功能重新映射到其他引脚,以实现优化管脚数目和配置目的。 GPIO、AFIO和重映射,分别是一个端口的三个层次。 1.使能GPIO时钟 2.使能复用时钟和外设时钟 3.把GPIO模式设置为复用功能对应的模式(见STM32中文参考手册8.1.11节) 4.外设参数的初始化 5.初始化NVIC并开启中断(需使用外设中断功能时) 6.使能外设 7.编写中断处理函数(需使用外设中断功能时)IOIO复用步骤复用步骤注意:注意: STM3

8、2的外设的外设的初始化都是通过结构的初始化都是通过结构体来设置初始值的!体来设置初始值的!- 18 -通用通用IO工作模式工作模式输入浮空:用于不确定高低电平的输入。输入上拉:用于默认为上拉至高电平的输入。输入下拉:用于默认为下拉至低电平的输入。模拟输入:用于模拟量的输入。开漏输出:用于实现电平转换和线与功能的输出。推挽式输出:用于较大功率驱动的输出。推挽式复用功能:复用功能情况下的推挽输出。开漏复用功能:复用功能情况下的开漏输出。 注意:每个GPIO都可以作为外部中断/唤醒线。GPIO端口的每个位可以根据不同的功能,由软件分别配置成八种模式:第二章第二章 STM32STM32强化应用强化应用

9、2.2 GPIO2.2 GPIO口输出口输出 2.2.2 2.2.2 功能分析功能分析 在终端设备上,要实现GPIO的输出功能,可以利用stm32的几个通用IO口线实现输出高低电平来控制LED灯的亮灭和继电器的开关。如下图所示,终端设备上用来控制LED灯的有两个管脚,PB0和PB1。LED是发光二极管的缩写,当它两端电压压差达到指定值(1.6v或更高)时,就会导通发光。因此,让LED灯亮,只需要将PB0或PB1输出低电平(0)就可以了。下述内容以LED1为例进行代码编写。 第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPIO口输出口输出 2.2.3 2.2.3 函

10、数实现函数实现 首先创建一个gpio.c文件,用来实现输出的功能。每个.c文件都要对应一个.h头文件,所以再创建一个gpio.h文件,将这两个文件保存到bsp目录下。同时,添加到项目中的bsp组下。 不必为h文件添加路径(此路径已添加)。 头文件的一般格式如下所示:第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPIO口输出口输出 2.2.5 2.2.5 函数分析函数分析 要实现输出功能,先来分析下需要实现的函数。 1,初始化函数:用来对管脚进行配置,使它可以输出高低电平。 2,点亮LED灯和灭掉LED灯的函数。下面按照这个思路,添加几个空函数到gpio.c文件中如

11、下所示:开关第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPIO口输出口输出 2.2.5 2.2.5 函数分析函数分析 开关第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPIO口输出口输出 2.2.6 2.2.6 查电路图看管脚查电路图看管脚开关 LED1PB0, LED1PB0,低电平亮,高电平灭低电平亮,高电平灭第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPIO口输出口输出 2.2.7 2.2.7 函数实现函数实现 初始化: 打开IO口时钟; 配置口线模式(结构体); 用上述参数初始化IO口 控制:

12、 开灯:PB0置低,即PB0=0 关灯:PB0置高,即PB0=1第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPIO口输出口输出 2.2.8 2.2.8 管脚速度和模式管脚速度和模式 速度:在允许的情况下,越低越好 推挽输出:输出高低电平,适合于连接数字电路,读取时为最后一次的设置值. 开漏输出:输出高电平需要外接上拉电阻;可同时用作输入,用于需要双向IO的场合;吸收电流能力强,适合于做电流型的驱动。 复用推挽输出:使用管脚复用功能 复用开漏输出:使用管脚复用功能开关第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPIO口输出口输出 2

13、.2.9 2.2.9 声明函数声明函数开关第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPIO口输出口输出 2.2.10 2.2.10 在在main.cmain.c中调用中调用 在实践中,通常会让LED灯以每秒一次的频率闪烁,以便判断程序是否在正常运行。 在模板中提供了一个delay延时模块专门用来提供延时函数。其中,delay_ms可以用来提供毫秒级别的延时,delay_us可以提供微秒级别的延时。延时的具体参数可参考源代码。使用这两个函数,同样要包含对应的头文件delay.h。完成后的代码如下所示:第二章第二章 STM32STM32强化应用强化应用2.2 GP

14、IO2.2 GPIO口输出口输出 2.2.11 2.2.11 实践实践3 3 在模板程序上实现对蜂鸣器的控制,要求在gpio.c和gpio.h中实现。开关第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPIO口输出口输出 2.2.12 2.2.12 使用宏定义优化使用宏定义优化用宏定义替换常量,可以方便用户后期修改; 宏定义替换函数,节省函数调用时间,这点在需要频繁调用的函数时才有意义,比如模拟i2c时的管脚方向设置函数,比如液晶显示函数等。第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPIO口输出口输出 2.2.13 2.2.13 复

15、用代码复用代码 对功能相似的代码,没必要再去重复编写,相关代码可以进行复制修改,达到一段代码复用的效果。 继电器与LED的相似之处 都是输出模式 都是高低电平控制 都是低电平闭合高电平断开 继电器与LED的不同之处 管脚不同 继电器不能随便闭合,所以要确定初始状态继电器继电器PC10PC10,同样置低电平继电器,同样置低电平继电器闭合,置高电平继电器断开闭合,置高电平继电器断开第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPIO口输出口输出 2.2.13 2.2.13 复用代码复用代码 gpio.h 将LED部分宏定义和函数声明复制 将复制粘贴后部分的LED改为R

16、ELAY 修改继电器时钟 修改继电器的GPIO口 修改继电器的口线PC10第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPIO口输出口输出 2.2.13 2.2.13 复用代码复用代码 gpio.c 同样复制后修改。注意管脚开始状态,如下图。 在main函数中调用,编译后下载到教学板。第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPIO口输出口输出 2.2.14 2.2.14 获得输出脚当前状态获得输出脚当前状态 实现灯的翻转函数; 显示继电器状态。 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0);

17、获得输出管脚PA0当前状态(推挽输出模式下指的是上一次所设置的值) 第二章第二章 STM32STM32强化应用强化应用2.2 GPIO2.2 GPIO口输出口输出 2.2.15 2.2.15 实践实践4 4 用复制修改LED或蜂鸣器的代码的方法来实现继电器的控制代码,并实现以下功能: 每隔3s 控制继电器状态翻转; 当继电器处于闭合状态时,LED灯以200ms一次的频率闪烁; 当继电器处于断开状态时,LED灯以每秒一次的频率闪烁。提示: 继电器的初始状态要在断开状态(即在调用初始化函数前调用继电器断开函数); 注意继电器的闭合和断开分别应该对应管脚的高电平还是低电平。 注意延时函数delay_

18、ms参数最大不能超过1800(即1.8s,可参考函数源码)。第二章第二章 STM32STM32强化应用强化应用2.3 GPIO2.3 GPIO口输入口输入 2.3.1 2.3.1 功能分析功能分析 在stm32芯片中,输入管脚可以用来采集管脚状态,也可以用来测量管脚电平,还可以用来作为外部中断的输入脚。在终端设备中,可以利用GPIO口线实现按键的状态采集,并显示到串口调试工具中。 在终端设备上有四个按键,通过连接按键的四个管脚,可以采集到按键的输入状态,原理图如下:第二章第二章 STM32STM32强化应用强化应用2.3 GPIO2.3 GPIO口输入口输入 2.3.3 2.3.3 查看管脚查

19、看管脚 按键按下时KEY是低电平,否则是高电平。第二章第二章 STM32STM32强化应用强化应用2.3 GPIO2.3 GPIO口输入口输入 2.3.4 key.c2.3.4 key.c 首先创建一个key.c文件,用来实现输入的功能。每个.c文件都要对应一个.h头文件,所以再创建一个key.h文件,将这两个文件保存到bsp目录下。同时,添加到项目中的bsp组下。 要实现输入功能,先来分析下需要实现的函数。 1,初始化函数:用来对管脚进行配置,使它可以采集管脚高低电平状态。 2,按键扫描函数:用来实时扫描按键状态。 下面添加这两个函数到key.c文件中。第二章第二章 STM32STM32强化

20、应用强化应用2.3 GPIO2.3 GPIO口输入口输入 2.3.4 key.c 2.3.4 key.c 第二章第二章 STM32STM32强化应用强化应用2.3 GPIO2.3 GPIO口输入口输入 2.3.4 key.c 2.3.4 key.c 第二章第二章 STM32STM32强化应用强化应用2.3 GPIO2.3 GPIO口输入口输入 2.3.5 2.3.5 输入模式输入模式 浮空输入GPIO_IN_FLOATING 浮空输入,可以做KEY识别 带上拉输入GPIO_IPUIO内部上拉电阻输入 带下拉输入GPIO_IPDIO内部下拉电阻输入 模拟输入GPIO_AIN 应用ADC模拟输入,

21、或者低功耗下省电第二章第二章 STM32STM32强化应用强化应用2.3 GPIO2.3 GPIO口输入口输入 2.3.6 key.h2.3.6 key.h 为了更好的表明四个按键的状态,最好对这四个按键分别定义个名称。先查看终端设备按键下方的按键名称,然后与其在PC口的位置相对应,可以按照如下定义:第二章第二章 STM32STM32强化应用强化应用2.3 GPIO2.3 GPIO口输入口输入 2.3.6 key.h2.3.6 key.h第二章第二章 STM32STM32强化应用强化应用2.3 GPIO2.3 GPIO口输入口输入 2.3.7 main.c2.3.7 main.c 上述操作基本

22、实现了按键状态采集的函数。下述内容要在main函数里调用该函数。 在实践中通常需要每当按下一个按键,就可以在串口里打出对应的信息,如“您按下了某个按键”之类的调试信息。 在模板中提供了一个usart串口模块专门用来提供串口打印服务。只要包含对应的头文件usart.h,并调用了usart的初始化函数bsp_InitCOM1,就可以使用C语言中标准的输出函数printf了。完成后的代码如下所示:第二章第二章 STM32STM32强化应用强化应用2.3 GPIO2.3 GPIO口输入口输入 2.3.8 2.3.8 查看结果查看结果 工具:串口调试工具工具:串口调试工具SSCOM.exeSSCOM.e

23、xe第二章第二章 STM32STM32强化应用强化应用2.3 GPIO2.3 GPIO口输入口输入 2.3.9 2.3.9 实践实践5 5 结合上节中的内容,在模板程序上实现以下功能: 按键UP控制继电器,按下闭合,再次按下断开; 按键DOWN控制蜂鸣器,按下长响,再次按下消声; 按键ESC,按下后断开继电器和蜂鸣器; LED灯以1s的频率闪烁.第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.1 USART 2.4.1 USART 串口是芯片最基础的应用,也是调试程序较方便的手段。掌握串口的使用,最基本的就是掌握数据的接收和发送。 在终端设备

24、上,使用了STM32芯片的usart1的收发管脚,也就是PA9,PA10,经过电平转换芯片后作为串口的收发管脚。原理图如下图所示:第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.3 2.4.3 复用功能复用功能 stm32芯片的PA是通用输入输出口,它用作usart口时使用的是它的管脚复用功能。通过管脚复用,PA9、PA10就不能再作为普通的IO口使用,而只能作为usart口的收发脚来使用。第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.3 2.4.3 分析函数分析函数 在终端设备模板程序中

25、,由于提供了串口模块usart.h和usart.c。因此,可以在初始化函数后,直接使用printf函数打印调试信息。除了初始化函数外,如果要收发数据,还需要至少一个发送函数和一个接收函数。 接收数据方式有查询和中断两种,本例中采用查询方式。 第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.3 2.4.3 分析函数分析函数 在实践中,有时候要发送一串字符(字符末尾自带结束符0),有时候又要发送一串16进制数,因此,发送函数最好是两个,一个用来发送字符串,一个用来发送16进制数据。这两个函数大部分代码是一样的,只是对要发送数据的结尾的处理不同。

26、第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.4 16 2.4.4 16进制和进制和ASCIIASCII码码 本质上来说,16进制和ASCII码是一样,其存储都是二进制0和1的组合。ASCII码的表示方法也可以是16进制数。它是用特定的、指定的16进制数来表示字符的一种方法。比如字母A,它的ASCII就是65(十进制),其16进制值就是0 x41。比如数字0,它的ASCII码的16进制值就是0 x30。 第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.4 16 2.4.4 16进制和进制和

27、ASCIIASCII码码 以串口调试工具为例,如果选择了hex(16进制)显示,则会显示实际发出的数据。比如发送0 x16就会显示0 x16,发送0 x41就会显示0 x41。如果不选择hex显示,也就是默认了ASCII码显示。那么发送0 x41就会显示字符A,而发送0 x16则不会显示,因为0 x16在ASCII中是不可见字符。第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.4 ASCII 2.4.4 ASCII码与码与1616进制进制 以字符串”hello!”为例, char str=“Hello!”; u8 str2=0 x48,0 x

28、65,0 x6c,0 x6c,0 x6f,0 x21; 两个语句是等价的。 任意语句发送到串口调试工具其结果如下图所示:第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.5 2.4.5 初始化函数初始化函数 开启管脚时钟; 开启复用时钟; 开启复用模块时钟(stm32的几个串口除了串口1在APB2总线,其余都在APB1总线) 初始化管脚(复用模式下的GPIO端口模式设置); 初始化串口1(串口参数,如波特率、停止位等的设置) 使能串口1第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.6 2.4

29、.6 串口参数串口参数第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.7 2.4.7 接收数据接收数据 库函数中接收数据的函数: USART_ReceiveData(USART1); 查询方式 第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.8 2.4.8 发送数据函数发送数据函数 首先来看发送一个字符的函数。注意发送前要先检测是否尚有数据未完全发送,否则会丢失第一个字节,代码如下所示。第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.8 2

30、.4.8 发送数据函数发送数据函数 下面的函数可以实现发送16进制功能。也就是发送指定长度的数组中的数据;第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.9 2.4.9 函数分析函数分析 下面的函数可以实现发送字符串也就是ascii码的功能。/* 向指定串口写入字符串 */void ComPutCStr(USART_TypeDef* USARTx,const char *ptr) while(*ptr)!=0) ComPutChar(USARTx,*ptr); ptr+; 第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口

31、数据收发串口数据收发 2.4.10 2.4.10 数组和指针数组和指针 u8 a10,b; u8 a10,b; u8 u8 * *p;p; p=a; p=a; p=&a0; p=&a0; p+; p+; b= b=* *p p; 第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.10 2.4.10 实践实践6 6 使用串口模块的收发函数和串口调试工具,实现如下功能: 从串口调试工具发送数据,程序收到后回发接收到的数据; 自定义串口协议,控制继电器和蜂鸣器。如relayon代表继电器闭合或者更简单点1代表继电器闭合等。 能使用按键

32、改变继电器或蜂鸣器的状态;当继电器或蜂鸣器状态改变后主动通知向串口发送数据(可与第二项中内容相同)。第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.10 2.4.10 实践实践7 7 结合前几节的内容,实现一个小闹钟程序。要求实现如下功能: 按键OK按下向串口发送教学板当前时间(ASCII码或BCD码); 可通过串口设置当前时间,设置闹钟时间或取消闹钟; 闹钟时间到后蜂鸣器响3s后自动关闭; 可通过按键实现闹钟短时间定时。比如按下DOWN键开始闹钟计时(一分钟后闹钟响),然后每按一下增加一分钟,按下OK键表示设置完成。也可以以秒为单位。 可通

33、过按键ESC取消闹钟。第二章第二章 STM32STM32强化应用强化应用2.4 2.4 串口数据收发串口数据收发 2.4.11 2.4.11 实践实践( (扩展扩展) ) 结合实践5中按键功能,实现如下功能: 自定义串口协议,实现主机通过串口对继电器蜂鸣器的控制以及状态的读取; 按键改变继电器或蜂鸣器状态后主动通过串口向主机发送报警信息; 使用串口调试工具测试。 协议举例:发送#relayon*表示继电器闭合(Ascii)。第二章第二章 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.1 2.5.1 什么是中断什么是中断第二章第二章 STM32STM32强化应用强

34、化应用2.5 2.5 中断系统中断系统 2.5.2 stm32 2.5.2 stm32的中断的中断第二章第二章 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.3 2.5.3 优先级优先级第二章第二章 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.4 2.5.4 优先级处理优先级处理第二章第二章 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.5 2.5.5 优先级分组优先级分组 STM32中指定优先级的寄存器位有四位,即优先级有16级。这四位的组合方式决定了抢占优先级以及响应优先级的级别。第二章第二章

35、 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.6 2.5.6 中断嵌套中断嵌套 第0组抢占0,即不允许嵌套 第1组抢占0,1,即允许1层嵌套 第2组抢占0-3,即允许3层嵌套 第3组抢占0-7,即允许7层嵌套 第4组抢占0-15,即允许15层嵌套 2.5.7 2.5.7 中断总开关中断总开关 NVIC_SETPRIMASK(); /关闭总中断 NVIC_RESETPRIMASK();/开放总中断第二章第二章 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.8 2.5.8 使用步骤使用步骤 在使用中断之前设定分组函数:NVIC_Pr

36、iorityGroupConfig(NVIC_PriorityGroup_2);程序中只能设定一次 Group_2组,即抢占0-3,响应0-3。 如果给中断源分配了错误的抢占号不会报警,但运行会出错,因此要十分注意。第二章第二章 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.9 2.5.9 串口接收中断串口接收中断 初始化函数中:初始化函数中:第二章第二章 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.9 2.5.9 串口接收中断串口接收中断 中断处理函数:中断处理函数: 需要注意的是,需要注意的是,串口串口1 1通道中断并不只是

37、接收中断,通道中断并不只是接收中断,还有发送完成等等,所以每次都要判断是否是接收中断。还有发送完成等等,所以每次都要判断是否是接收中断。第二章第二章 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.10 2.5.10 接收数据处理接收数据处理 uart接口的wifi模块,gprs模块等。 工业场所485总线,Modbus协议等。 协议处理属于用户级,因此建立comm模块,添加到user组。第二章第二章 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.10 2.5.10 串口协议处理串口协议处理 假定串口收发的数据符合以下协议假定串口收

38、发的数据符合以下协议: : 帧头:帧头:0 x68 0 x68 帧尾:帧尾:0 x16 addr:0 (0 x16 addr:0 (串口串口1 1对对1)1) Len Len:总长度:总长度( (从帧头至帧尾从帧头至帧尾) CS:) CS:和校验和校验 以上每项除以上每项除DataData外均为外均为1 1字节,字节,DataData长度可变;长度可变; 数据格式除特别说明均为数据格式除特别说明均为1616进制。进制。 第二章第二章 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.10 2.5.10串口协议处理串口协议处理 思路: 帧头固定,故不符合的直接丢弃;

39、由长度确定帧尾来判断是否收完; 检测校验码判断是否是正确数据包。 帧头长度都不固定的协议,可以通过串口寂静时间来帧头长度都不固定的协议,可以通过串口寂静时间来判断一包数据是否收完。有的场合需要结合使用。判断一包数据是否收完。有的场合需要结合使用。第二章第二章 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.11 2.5.11 枚举枚举 限定变量取值范围 比如一周有七天 程序中: ErrCode err;第二章第二章 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.12 2.5.12 函数指针函数指针 Comm_ProcFrame();

40、处理收到的数据 用法一: 优点:直观,好理解 缺点:需要模块间交叉调用,或声明, 如有更改要修改多个文件。第二章第二章 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.12 2.5.12 函数指针函数指针 用法二:回调函数 usart.c 第二章第二章 STM32STM32强化应用强化应用2.5 2.5 中断系统中断系统 2.5.12 2.5.12 函数指针函数指针 优点:接口统一,支持多个协议,有利于封装自定义库。优点:接口统一,支持多个协议,有利于封装自定义库。 第二章第二章 STM32STM32强化应用强化应用2.6 2.6 外部中断外部中断EXTIEXTI

41、 2.6.1 2.6.1 定义定义 对CM3内核来说,片上外设如串口定时器等产生的中断都是外部中断; 对STM32芯片来说,外部中断特指的是GPIO中断。 STM32的每个IO都可以作为外部中断的中断输入口 每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 STM32 的EXTI 控制器支持19 个外部中断/事件请求(互联型为20个)。第二章第二章 STM32STM32强化应用强化应用2.6 2.6 外部中断外部中断EXTIEXTI 2.6.2 2.6.2 外部中断线外部中断线 STM32F103的19个外部中断为:线 015:对应外部 IO 口的输入中断。 线 16:连接到PVD

42、输出。 线 17:连接到RTC闹钟事件。 线 18:连接到USB唤醒事件。STM32供IO 口使用的中断线只有 16个,但是STM32的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一一对应起来的呢? GPIO 的管脚 GPIOx.0GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 150。这样每个中断线对应了最多7个IO 口,以线0为例:它对应了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。第二章第二章 STM32STM32强化应用强化应用2.6 2.6 外部中断外部中断

43、EXTIEXTI 2.6.3 2.6.3 线路映像线路映像第二章第二章 STM32STM32强化应用强化应用2.6 2.6 外部中断外部中断EXTIEXTI 2.6.4 2.6.4 要点要点 1.中断线每次只能连接到1个IO口上,需要通过配置来决定对应的中断线配置到哪个GPIO上。 在固件库函数中,配置GPIO与中断线的映射关系的函数是GPIO_EXTILineConfig()。例如:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2); 将中断线2与GPIOE 映射起来,就将GPIOE.2与EXTI2中断线连接了。第二章第二章 S

44、TM32STM32强化应用强化应用2.6 2.6 外部中断外部中断EXTIEXTI 2.6.4 2.6.4 要点要点 2.中断线上中断的相关参数初始化是通过函EXTI_Init() 实现的。例如: EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line=EXTI_Line4; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStruct

45、ure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);/根据EXTI_InitStruct中指定参数初 /始化外设EXTI寄存器 3.EXTI5-EXTI9共用一个中断通道。 4.EXTI10-EXTI15共用一个中断通道。 5.配置中断前要使能复用时钟。第二章第二章 STM32STM32强化应用强化应用2.6 2.6 外部中断外部中断EXTIEXTI 2.6.5 2.6.5 步骤步骤 打开管脚时钟、复用时钟; 初始化管脚为输入,设置IO口与中断线的映射关系; 初始化NVIC; 初始化EXTI; 实现中断服务程序。第二章第二

46、章 STM32STM32强化应用强化应用2.6 2.6 外部中断外部中断EXTIEXTI 第二章第二章 STM32STM32强化应用强化应用2.6 2.6 外部中断外部中断EXTIEXTI 2.6.6 2.6.6 中断服务程序中断服务程序 所有的中断服务程序都在stm32f10 x_it.c中,也可以放到相应的模块c文件中,注意不要与stm32f10 x_it.c 重复。常用的中断服务函数的格式为: 注意:在中断服务程序最后一定要清除中断标志位!注意:在中断服务程序最后一定要清除中断标志位!第二章第二章 STM32STM32强化应用强化应用2.6 2.6 外部中断外部中断EXTIEXTI 2.

47、6.6 2.6.6 实践实践8 8 将按键模块key.c、key.h改为中断方式触发。第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.1 ADC 2.7.1 ADC介绍介绍 将模拟量转换为数字量 12位分辨率,逐次逼近型 每个ADC模块有18个通道(可测量16个外部和2个内部信号) ADC时钟不得超过14Mhz 输入模拟量是0-3.6v的电压,其它模拟量需要先转换成电压信号。 可以自校准第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.2 2.7.2 逐次逼近型逐次逼近型ADCADC 逐次逼近型ADC

48、的转换过程类似用天枰称重。天枰称重的过程是,从最重的砝码开始放,若物体重则砝码保留,否则移去。再放次重的砝码,重复这个过程直到最小的玛法为止。所有的砝码相加即为物体的重量。 第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.2 2.7.2 逐次逼近型逐次逼近型ADCADC 与此类似,逐次逼近型ADC就是将输入模拟信号与不同的参考电压做多次比较,使转换所得的数字量逐次逼近模拟量对应值。 因此,信号量转换时间越长结果越精确。也因此,ADC时钟不能大于14M,如果大于14M,结果不准确(转换时间是固定的12.5个ADC时钟周期)第二章第二章 STM32S

49、TM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.3 ADC 2.7.3 ADC精度精度 stm32的ADC模块是12位ADC,取值范围0-4095,显然位数越多的ADC精度越高.12位ADC能满足一般需要。 影响精度还有一个因素,采样频率或者说采样点数,特别是在测量交流信号时,采样频率是至关重要的。 采样频率简单说就是每秒采样的次数。 采样点数指的是一个周期采样的次数。第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.4 ADC 2.7.4 ADC转换速率转换速率 以系统时钟72Mhz为例。 首先,ADC时钟不能大于14M,那

50、么它可以取的范围就只有PCLK2 6分频和8分频,即12M和9M(ADC有专门的分频器)。 总转换时间=采样时间+12.5个ADC时钟周期(信号量转换时间),而采样时间由寄存器设定,最低1.5ADC周期,最大239.5ADC周期。 第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.4 ADC 2.7.4 ADC转换速率转换速率 最小转换时间为1.5+12.5时钟周期=14*(1/12)=1.17微秒,也就是说理论上最快可达到854.7K的转换速率(连续转换模式) 最大转换时间为239.5+12.5时钟周期=252*(1/9)=28微秒(计算最低速率

51、故选择最低时钟9M)。 以上结论前提是单次转换单通道,多通道可类推。第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.5 ADC 2.7.5 ADC通道通道 STM32 将ADC 的转换分为2 个通道组:规则通道组和注入通道组。规则通道相当于你运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.6 ADC 2.7.6

52、 ADC转换模式转换模式 单次转换模式:只执行一次转换 连续转换模式:一次转换结束后马上开始第二次转换 扫描模式开启:一次转换以规则组为单位。否则以通道为单位。 间断模式:每次执行n个转换(n规则组通道数)。 双ADC模式:同时使用两个ADC模块采样一个信号量,可使采样频率翻倍。第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.6 ADC 2.7.6 ADC转换模式转换模式 第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.7 ADC 2.7.7 ADC模式应用模式应用 连续转换模式下采样频率固定,因此

53、在对采样点数有固定要求的场合下往往只能取约数,误差较大,更加适用于检测直流信号量或对精度要求不高的场合。 单次转换模式,可配合定时器设定采样间隔。采样频率和点数由定时器控制,误差更多取决于采样点数和算法,适用多数场合。 第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.8 FC28 2.7.8 FC28土壤湿度传感器土壤湿度传感器第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.8 FC28 2.7.8 FC28土壤湿度传感器土壤湿度传感器 使用板子右上方的扩展脚第二章第二章 STM32STM32强化应

54、用强化应用2.7 ADC2.7 ADC测量测量 2.7.8 FC28 2.7.8 FC28土壤湿度传感器土壤湿度传感器 查芯片手册查芯片手册 按说明连接:按说明连接: 第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.9 FC28 2.7.9 FC28模块模块 添加库函数文件 stm32f10 x_adc.c; 建立fc28.c和fc28.h; 添加fc28.c到bsp组; 添加初始化函数。第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.9 FC28 2.7.9 FC28模块模块 第二章第二章 STM

55、32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.10 2.7.10 实践实践9 9 每秒读取教学板上的光敏电阻的电压值,并显示到串口。由于光照越强,阻值越小,所以可以用电压值来表示光照强度。第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.11 2.7.11 实践实践1010 利用光敏电阻检测可见光的特性,实现一个简单路灯系统。要求实现如下功能: 系统有时钟,且误差较小,可用串口校准; 正常情况下以时间作为路灯开关的基准,如晚6点开灯,早七点关灯,此时间可设置; 当光度较差时(关灯时间),自动开启路灯。但要保证在正常的开

56、灯时间,路灯是开启的。第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.12 2.7.12 实践实践( (扩展扩展) ) 编写一个自动浇水器的代码,实现如下功能: 1,实时显示土壤湿度传感器FC28的湿度值。 2,当DO输出高电平时控制继电器闭合。 3,当湿度值低于设定值时控制继电器闭合。 DO的具体说明可查看FC28的芯片手册。第二章第二章 STM32STM32强化应用强化应用2.7 ADC2.7 ADC测量测量 2.7.13 2.7.13 实践实践( (扩展扩展) ) 读取stm32内部温度传感器的值,并以此为基础实现温控器的功能。 要求:1,

57、可将继电器看作空调开关,当温度超过设定值时开启;当温度低于设定值时关闭; 2,程序设计尽量考虑详细,具有可用性。第二章第二章 STM32STM32强化应用强化应用2.8 2.8 SPISPI接口接口 2.8.1 2.8.1 SPISPI的定义的定义 SPI,是一种高速的,全双工同步的通信总线,SPI 接口一般使用4 条线: MISO 主设备数据输入,从设备数据输出; MOSI 主设备数据输出,从设备数据输入; SCLK 时钟信号,由主设备产生; CS 从设备片选信号,由主设备控制,一般低有效。第二章第二章 STM32STM32强化应用强化应用2.8 SPI2.8 SPI接口接口 2.8.2 S

58、PI 2.8.2 SPI的时序的时序 SPI是一个环形总线结构,其时序其实很简单,在SCLK的控制下,两个双向移位寄存器进行数据交换,也就是说,数据的发送和接收是同时进行的. SPI是串行通讯协议,数据是一位一位的传输的。由SCLK提供时钟脉冲,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输第二章第二章 STM32STM32强化应用强化应用2.8 SPI2.8 SPI接口接口 2.8.2 SPI 2.8.2 SPI的模式的模式 SPI有四种工作模式, 由CPOL,CPHA决定。 CPOL: (Cloc

59、k Polarity),时钟极性当CPOL为0时,时钟空闲时候的电平是低电平;当CPOL为1时,时钟空闲时候的电平是高电平; CPHA:(Clock Phase),时钟相位当CPHA为0时,时钟周期的第一个跳变沿采集数据;当CPHA为1时,时钟周期的第二个跳变沿采集数据。第二章第二章 STM32STM32强化应用强化应用2.8 SPI2.8 SPI接口接口 2.8.2 SPI 2.8.2 SPI的模式的模式 CPOL和CPHA,分别都可以是0或时1,对应的四种组合就是SPI的四种模式:第二章第二章 STM32STM32强化应用强化应用2.8 SPI2.8 SPI接口接口 2.8.3 stm32

60、 2.8.3 stm32的的SPISPI stm32的SPI可以与外部设备以半/全双工、同步、串行方式通信; 支持主机或从机模式,支持多主机模式; 大容量和互联型芯片可将SPI接口配制成支持SPI协议或I2S协议; 第二章第二章 STM32STM32强化应用强化应用2.8 SPI2.8 SPI接口接口 2.8.3 stm32 2.8.3 stm32的的SPISPI 大容量和互联型芯片有3个SPI接口,其中SPI3的部分引脚与JTAG引脚共享,被默认为JTAG功能。若想使用SPI3功能,需要关闭JATG功能(可以开启SWD接口调试)。 受限于GPIO模块的翻转速率(18Mhz),SPI的最大速率为18Mhz。第二章第

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论