基于stm32的智能小车设计
月11日由ST公司率先推出的基于Cortex-M3内核的STM32系列微控处理器研发而出。此中,A系列是面向复杂的尖端应用程序,用于运行开放式的复杂操作系统;R是Real的首字母缩写,是面向实时系统开发的;M是Mirco的首字母缩写,专门面向低成本的微控制领域开发研究。因此,Cortex-M3处理器是由ARM公司设计的首款基于ARMv7-M体系结构的32位标准处理器,它不仅具有低功耗、少门数等优点,而且还具有短中断延迟、低调试成本等众多优点,使它在众多的处理器中脱颖而出。目前为止,STM32系列处理器暂分为2个系列。其中,STM32F101系列是标准型系列,工作频率设定在36MHZ;STM32F103系列是增强型系列,工作频率设定在72MHZ,其带有更多片内RAM和更丰富的外设资源。这两个系列的产品在软件和引脚封装方面具有兼容性,并且拥有相同的片内Flash资源,使软件的开发和升级更加方便。本次试验,我们使用的是stm32f103处理器。 2.1.1 stm32f103内部结构
STM32F103系列微处理器是首款基于ARMv7-M体系结构的32位标准RISC (精简指令集)处理器,具有执行代码效率高,外设资源丰富等众多优点。该系列微处理器工作频率设定在72MHz,高达128K 字节的内置Flash存储器和20K 字节的SRAM,方便程序编写,而且具有丰富的通用I/O 端口。其内部结构图如图2.2所示:
图2.2内部结构图
- 6 -
基于stm32的智能小车设计
Stm32处理器主系统主要由4个被动单元和4个驱动单元构成。4个驱动单元是:通用DMA1,通用DMA2,内核DCode总线和系统总线。4个被动单元由APB桥,APB设备,内部Flash闪存,内部SRAM、FSMC。我们实验所采用的芯片具有64KBSRAM、512KBFLASH、2个基本定时器,4个通用定时器,2个高级定时器,3个SPI,2个IIC,5个串口,1个USB,1个CAN,3个12位的ADC,1个12位DAC、1个SDIO接口,1个FSMC接口以及112个通用I/O口。 2.1.2 stm32最小系统电路设计
Stm32的最小系统电路主要由系统时钟电路、实时时钟电路、JTAG调试接口电路,复位电路和启动模式选择电路组成。最小系统电路原理图如图2-1-3所示:
图2.3 最小系统电路原理图
主要电路原理图的设计及功能如下所示: 1.系统时钟电路
系统时钟电路主要作用是提供节拍,就相当于人类的心脏跳动,随着心脏的跳动,血液就会到达全身部位,所以系统时钟的重要性就不言而喻啦。系统时钟的电路设计如图2.4所示:
- 7 -
基于stm32的智能小车设计
图2.4 系统时钟电路图
在时钟电路中,我们选用8M的晶振。 2.复位电路
复位电路的设计如图2.5所示:
图2.5 复位电路图
本次试验所采用的开发板为低电平复位。如图所示,当按键悬空时RST输入为高电平,当按键按下时,RST脚输入为低电平,从而电路复位。 3.JTAG电路
JTAG电路原理图如图2.6所示:
图2.6 JAG电路原理图 JTAG的主要功能是使目标文件烧到核处理器中。 4.启动模式电路
启动模式电路原理图如图2.7所示:
- 8 -
基于stm32的智能小车设计
图2.7 启动模式电路原理图
通过设置BOOT[1:0]引脚可以选择三种不同启动模式,启动模式如表2-1所示:
表2-1 启动模式表
启动模式选择引脚 BOOT1 X 0 1
BOOT0 0 1 1
启动模式
说明
主闪存存储器 主闪存存储器被选为启动区域 系统存储器 内置SRAM
系统存储器被选为启动区域 内置SRAM被选为启动区域
2.1.3 stm32软件设计的基本思路
在对其他模块设计之前,我们必须了解stm32的编程规则。任何处理器,包括stm32处理器,想要处理器完成某项相应的动作,就必须对处理器的寄存器进行操作。比如,我们在单片机C51中,同样,我们在stmM32的开发中过程中,我们同样可以对寄存器直接操作:
GPIOx->BRR=0x0011。 (x可以是A,B,C,D,E…比如GPIOA就是端口A) 但是,对于stm32这种级别的处理器,几百个寄存器记起来谈何容易。所以,ST(意法半导体)提出了固件库的概念,利用固件库进行编程。固件库的本质就是函数的集合,固件库将那些寄存器的底层操作都封装起来,提供一整套API供开发者使用。比如,上面通过控制BRR寄存器来控制电平的变化,官方库封装了一个函数:
Void GPIO_ResetBits(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin) {GPIOx->BRR = GPIO_Pin;} (x可以是A,B,C,D,E…比如GPIO_A就是端口A)
通过使用GPIO_ResetBits()函数就可以直接对寄存器进行操作啦。 2.1.4 stm32中断介绍
- 9 -
基于stm32的智能小车设计
本方案中,我们要使用stm32的中断,在程序设计中,我们要开启各个管道的中断,打开各个中断通道,配置中断方式,我们先来讲述下stm32单片机的中断机制。结构图如下所示:
图2.32 stm32外部中断/事件控制器结构图
图中的实线箭头,为外部中断信号的传输路径。 首先外部信号从编号为1的输入线进入。
其次这个外部信号通过编号2的边沿检测电路,这个边沿检测电路受到“上升沿选择寄存器”、“下降沿选择寄存器”的控制,我们可以控制这两个寄存器来选择中断的触发方式。我们可以在程序中进行设置,比如
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;设置为上升沿触发中断
然后该外部信号进入编号为3或门,或门另一端是软件中断寄存器,如果,软件中断/事件寄存器的对应位置1,编号3的输出总是为有效信号1。之后进入“中断挂起请求寄存器”,该寄存器记录了外部信号的电平变化。
最后经过编号为4的与门进入NVIC中断控制器,如果 “中断屏蔽寄存器”的对应位置0,外部的中断请求信号不能传输到NVIC中断控制器,从而实现中断的屏蔽。由于我们采用的是外部信号触发中断,所以我们只需了解外部中断的请求机制,对于事件的中断请求机制,我们在这里不做介绍。 我们以PE1为例,介绍下外部中断的一般步骤。步骤如下: ? 开启I/O的复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO
- 10 -