嵌入式系统设计(STM32)第2讲ppt课件.ppt

上传人:牧羊曲112 文档编号:1891257 上传时间:2022-12-24 格式:PPT 页数:100 大小:3.70MB
返回 下载 相关 举报
嵌入式系统设计(STM32)第2讲ppt课件.ppt_第1页
第1页 / 共100页
嵌入式系统设计(STM32)第2讲ppt课件.ppt_第2页
第2页 / 共100页
嵌入式系统设计(STM32)第2讲ppt课件.ppt_第3页
第3页 / 共100页
嵌入式系统设计(STM32)第2讲ppt课件.ppt_第4页
第4页 / 共100页
嵌入式系统设计(STM32)第2讲ppt课件.ppt_第5页
第5页 / 共100页
点击查看更多>>
资源描述

《嵌入式系统设计(STM32)第2讲ppt课件.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统设计(STM32)第2讲ppt课件.ppt(100页珍藏版)》请在三一办公上搜索。

1、第2讲 STM32最小系统,下周一下午实验,带上笔记本电脑,熟悉软件开发环境笔记本需要安装的软件有:MDK4.70aSTM32固件库V3.5JLINK驱动PL2303驱动(USB转串口驱动)mcuisp.exe(STM ISP下载器)串口调试助手固件库使用手册STM32中文参考手册_V10,目录,2.1 STM32程序设计2.1.1 嵌入式C语言知识精编2.1.2 嵌入式软件层次结构2.1.3 FWlib(firmware library)固件库2.2 STM32最小系统2.2.1 电源2.2.2 复位电路2.2.3 时钟2.2.4 下载电路2.3 STM32时钟配置2.4 ARM Corte

2、x-M3处理器编程环境(RealView MDK),2.1 STM32程序设计,2.1.1 嵌入式C语言知识精编关键字Typedef: 给一个已经存在的数据类型取一个别名Const: 常数Volatile:变量,随时可能发生变化的。 符号 参见表3-2。预处理 参见表3-3。,2.1.2 嵌入式软件层次结构,PC体系结构(图3-2 ) 嵌入式系统体系结构(图3-3 )改进的嵌入式系统体系结构(图3-4)虚拟BIOS虚拟DOS高端用户程序中的子程序,2.1.3 FWlib(firmware library)固件库,该函数库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能

3、特征。该函数库还包括每一个外设的驱动描述和应用实例。通过使用本固件函数库,无需深入掌握细节,用户也可以轻松应用每一个外设。因此,使用本固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用API (application programming interface 应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。现在用的固件库版本是stm32固件库V3.5,可以网上下载。,文档和库规范,一、缩写缩写 外设/单元GPIO 通用输入/输出NVIC 嵌套中断向量列表控制器EXTI

4、外部中断事件控制器RCC 复位与时钟控制器SysTick 系统嘀嗒定时器TIM 通用定时器USART 通用同步异步接收发射端,二、命名规则,固态函数库遵从以下命名规则:PPP表示任一外设缩写,例如:ADC。源程序文件和头文件命名都以“stm32f10 x_”作为开头,例如:stm32f10 x_conf.h。常量仅被应用于一个文件的,定义于该文件中;被应用于多个文件的,在对应头文件中定义。所有常量都由英文字母大写书写。寄存器作为常量处理。他们的命名都由英文字母大写书写。 外设函数的命名以该外设的缩写加下划线为开头。每个单词的第一个字母都由英文字母大写书写,例如:SPI_SendData。在函数

5、名中,只允许存在一个下划线,用以分隔外设缩写和函数名的其它部分。,名为PPP_Init的函数,其功能是根据PPP_InitTypeDef中指定的参数,初始化外设PPP名为PPP_DeInit的函数,其功能为复位外设PPP的所有寄存器至缺省值,例如TIM_DeInit. 名为PPP_StructInit的函数,其功能为通过设置PPP_InitTypeDef 结构中的各种参数来定义外设的功能,例如:USART_StructInit 名为PPP_Cmd的函数,其功能为使能或者失能外设PPP,例如: SPI_Cmd. 名为PPP_ITConfig的函数,其功能为使能或者失能来自外设PPP某中断源,例如

6、: RCC_ITConfig.,名为PPP_DMAConfig的函数,其功能为使能或者失能外设PPP的DMA接口,例如:TIM1_DMAConfig. 用以配置外设功能的函数,总是以字符串“Config”结尾,例如GPIO_PinRemapConfig. 名为PPP_GetFlagStatus的函数,其功能为检查外设PPP某标志位被设置与否,例如:I2C_GetFlagStatus. 名为PPP_ClearFlag的函数,其功能为清除外设PPP标志位,例如:I2C_ClearFlag. 名为PPP_GetITStatus的函数,其功能为判断来自外设PPP的中断发生与否,例如:I2C_GetIT

7、Status. 名为PPP_ClearITPendingBit的函数,其功能为清除外设PPP中断待处理标志位,例如: I2C_ClearITPendingBit.,三、编码规则,变量固态函数库定义了24个变量类型,他们的类型和大小是固定的。在文件stm32f10 x_type.h中我们定义了这些变量: typedef signed long s32; typedef signed short s16; typedef signed char s8; typedef unsigned long u32; typedef unsigned short u16; typedef unsigned c

8、har u8; 。 。,布尔型在文件stm32f10 x_type.h中,布尔形变量被定义如下: typedef enum FALSE = 0, TRUE = !FALSE bool;,标志位状态类型在文件stm32f10 x_type.h中,定义标志位类型(FlagStatus type)的2个可能值为“设置”与“重置”(SET or RESET)。typedef enum RESET = 0, SET = !RESET FlagStatus;,功能状态类型在文件stm32f10 x_type.h中,我们定义功能状态类型(FunctionalState type)的2个可能值为“使能”与“失

9、能”(ENABLE or DISABLE)。typedef enum DISABLE = 0, ENABLE = !DISABLE FunctionalState;,错误状态类型在文件stm32f10 x_type.h中,定义错误状态类型(ErrorStatus type)的2个可能值为“成功”与“出错”(SUCCESS or ERROR)。typedef enum ERROR = 0, SUCCESS = !ERROR ErrorStatus;,外设用户可以通过指向各个外设的指针访问各外设的控制寄存器。这些指针所指向的数据结构与各个外设的控制寄存器布局一一对应。外设控制寄存器结构 文件stm

10、32f10 x_map.h包含了所有外设控制寄存器的结构。例如SPI寄存器结构的声明:,2.2 STM32最小系统,能让单片机工作的最小单元,即是最小系统。2.2.1 电源,STM32F103VB,开发板上,可以DC5V,或者USB5V, 一般用电脑USB口供电。R1:保险电阻C1、C2:滤波电容AMS1117-3.3: 把5V转换成3.3V三端可调或固定电压3.3V,输出电流为1A,线路调整率:0.2%(最大)负载调整率:0.4%(最大),2.2.2 复位电路,STM32支持3种复位:系统复位、上电复位、备份区域复位。当以下事件中的一件发生时,产生系统复位:1. NRST管脚上的低电平(外部

11、复位)2.窗口看门狗计数终止(WWDG复位)3.独立看门狗计数终止(IWDG复位)4.软件复位(SW复位)5.低功耗管理复位,NRST,当以下事件中之一发生时,产生电源复位:1.上电/掉电复位(POR/PDR复位)2.从待机模式中返回当以下事件中之一发生时,产生备份区域复位。1.软件复位,备份区域复位可由设置备份区域控制寄存器RCC_BDCR中的BDRST位产生。2.在VDD和VBAT两者掉电的前提下,VDD或VBAT上电将引发备份区域复位。,2.2.3 时钟树,P83 图4-3系统时钟(SYSCLK)的产生来源有3个:HSI, PLLCLK, HSE由SW(时钟配置寄存器RCC_BDCR的D

12、0位和D1位)控制选择。SW1:0= 00, HSI,内部 01, HSE,外部 10, PLLCLK,锁相环,倍频锁相环输入来自HSI/2或者HSE, 由PLLSRC控制选择。锁相环倍频系数由PLLMUL( RCC_BDCR 的D21D18位)控制。外部时钟接4-18MHz, 开发板接8MHz,开发板上的外接时钟电路,2.2.4 下载电路,开发板支持JTAG下载和串口下载JTAG下载。JLINK一端接电脑,另一端接开发板,串口下载 PL2303:USB转串口,2.3 STM32时钟配置,在STM32中,有五个时钟源: HSI、HSE、LSI、LSE、PLL。HSI是高速内部时钟,RC振荡器,

13、频率为8MHz。HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz16MHz。LSI是低速内部时钟,RC振荡器,频率为40kHz。LSE是低速外部时钟,接频率为32.768kHz的石英晶体。PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为216倍,但是其输出频率最大不得超过72MHz。,AHB (HCLK) 时钟 = SYSCLK = 72MHzAPB2(PCLK2)时钟 = AHB时钟 = 36MHzAPB1(PCLK1)时钟 = AHB 1/2时钟 = 72MHzADC时钟 = PCLK2 1/4 = 9MHzPLL时

14、钟 = HSE*9 = 72MHz,在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法,如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。2)对于少于100脚的产品,有2种接法: 2.1)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC(电磁兼容 )性能。 2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出0。,时钟配置是与RCC寄存器密切联系的。RCC寄存器(10个),RCC寄存器结构,在文件“stm32f10 x_m

15、ap.h”中,RCC_TypeDef定义如下: typedef struct vu32 CR; vu32 CFGR; vu32 CIR; vu32 APB2RSTR; vu32 APB1RSTR; vu32 AHBENR; vu32 APB2ENR; vu32 APB1ENR; vu32 BDCR; vu32 CSR; RCC_TypeDef;,使用HSE时钟,程序设置时钟参数流程:RCC:,1)将RCC寄存器重新设置为默认值 RCC_DeInit;2)打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);3)等待外部高速时钟晶振工作 HSEStartUpStatus

16、 = RCC_WaitForHSEStartUp();4 )设置AHB时钟 RCC_HCLKConfig;5 )设置高速AHB时钟 RCC_PCLK2Config;6 )设置低速AHB时钟 RCC_PCLK1Config;7 )设置PLL RCC_PLLConfig;8 )打开PLL RCC_PLLCmd(ENABLE);9 )等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET)10 )设置系统时钟 RCC_SYSCLKConfig;11 )判断是否PLL是系统时钟 while(RCC_GetSYSCLKSource() != 0

17、x08)12 )打开要使用的外设时钟 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd(),系统时钟初始化函数的实现,下面是STM32软件固件库的程序中对RCC的配置函数(使用外部8MHz晶振):void RCC_Configuration (void) /*将外设RCC寄存器重设为缺省值 */ RCC_DeInit(); /*设置外部高速晶振(HSE)*/ RCC_HSEConfig(RCC_HSE_ON); /RCC_HSE_ON, HSE晶振打开(ON) /*等待HSE起振*/ HSEStartUpStatus = RCC_WaitForHS

18、EStartUp(); if (HSEStartUpStatus = SUCCESS) /SUCCESS:HSE晶振稳定且就绪 /*设置AHB时钟(HCLK)*/ RCC_HCLKConfig(RCC_SYSCLK_Div1); /RCC_SYSCLK_Div1AHB时钟 = 系统时钟 /* 设置高速AHB时钟(PCLK2)*/ RCC_PCLK2Config(RCC_HCLK_Div1); /RCC_HCLK_Div1APB2时钟 = HCLK,/*设置低速AHB时钟(PCLK1)*/ RCC_PCLK1Config(RCC_HCLK_Div2); /RCC_HCLK_Div2APB1时钟

19、= HCLK / 2 /*设置FLASH存储器延时时钟周期数*/ FLASH_SetLatency(FLASH_Latency_2); /FLASH_Latency_2, 2延时周期 /*选择FLASH预取指缓存的模式*/ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); / 预取指缓存使能 /*设置PLL时钟源及倍频系数*/ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); / PLL的输入时钟 = HSE时钟频率RCC_PLLMul_9,PLL输入时钟x9 /*使能PLL */

20、 RCC_PLLCmd(ENABLE); /*检查指定的RCC标志位(PLL准备好标志)设置与否*/ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET) /*设置系统时钟(SYSCLK) */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);,/RCC_SYSCLKSource_PLLCLK选择PLL作为系统时钟 /* PLL返回用作系统时钟的时钟源*/ while(RCC_GetSYSCLKSource() != 0 x08) /0 x08:PLL作为系统时钟 /*使能或者失能APB2外设时钟*/ RCC_A

21、PB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC , ENABLE); /RCC_APB2Periph_GPIOA GPIOA时钟 /RCC_APB2Periph_GPIOB GPIOB时钟 /RCC_APB2Periph_GPIOC GPIOC时钟 /RCC_APB2Periph_GPIOD GPIOD时钟 ,32位基于ARM微控制器STM32F101xx与STM32F103xx 固件函数库,函数RCC_DeInit,函数RCC_HSEConfig,函数RCC_WaitFo

22、rHSEStartUp,函数RCC_HCLKConfig,RCC_HCLK值,函数RCC_PCLK2Config,RCC_PCLK2值,函数RCC_PCLK1Config,RCC_PCLK1值,函数FLASH_SetLatency,FLASH_Latency值,函数FLASH_PrefetchBufferCmd,例: /* Enable The Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);,函数RCC_PLLConfig,RCC_PLLSource值,RCC_PLLMul值(216倍),警告:必

23、须正确设置软件,使PLL输出时钟频率不超过72 MHz,函数RCC_PLLCmd,函数RCC_GetFlagStatus,RCC_FLAG值,函数RCC_SYSCLKConfig,RCC_SYSCLKSource,函数RCC_GetSYSCLKSource,函数RCC_APB2PeriphClockCmd,RCC_AHB2Periph值,例如:,/* Enable GPIOA, GPIOB and SPI1 clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_

24、SPI1, ENABLE);,2.4 工程模板的建立,2.4.1 ARM Cortex-M3处理器编程环境需要准备的资料: 1. STM32F10 x_StdPeriph_Lib_V3.5.0 (这是ST官网下载的固件库完整版) 2. 安装MDK4.70a (Keil)3. 注册License(破解,如果不破解只能支持32K的代码) 安装成功后,桌面上Keil4显示图标,固件库是压缩文件,解压缩后,准备编程时用。,2.4.2 新建工程,输入工程名,保存,选择CPU,STM32F103VB,弹出对话框“Copy STM32 Startup Code to project .”,询问是否添加启动代

25、码到我们的工程中,这里我们选择“否”,因为我们使用的ST固件库文件已经包含了启动文件。,接下来,在Template工程目录下面,新建3个文件夹 CORE, USER, STM32F10 x_FWLib。USER用来放我们主函数文件main.c,以及其他包括system_stm32f10 x.c 等等,CORE用来存放启动文件等,STM32F10 x_FWLib文件夹顾名思义用来存放ST官方提供的库函数源码文件。还可以新建一个OUTPUT文件夹,用来放。HEX等编译输出的文件。,下面要将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面。,我们只用到arm目录下面的startup_stm3

26、2f10 x_md.s文件,这个文件是针对中等容量芯片的启动文件。其他两个主要的为startup_stm32f10 x_ld.s为小容量,startup_stm32f10 x_hs.c为大容量芯片的启动文件。这里copy进来是方便其他开发者使用小容量或者大容量芯片的用户。,将目录下面的src、inc文件夹copy到STM32F10 x_FWLib文件夹下面。src存放的是固件库的.c文件,inc存放的是对应的.h文件,每个外设对应一个.c文件和一个.h头文件。,下面将这些文件加入我们的工程中去。右键点击Target1,选择Manage Components,Project Targets一栏,

27、将Target名字修改为Template,然后在Groups一栏删掉一个,建立三个Groups:USER, CORE, FWLIB. 点击OK.,下面我们往Group里面添加我们需要的文件。右键点击点击Tempate,选择选择Manage Components. 然后选择需要添加文件的Group,这里第一步我们选择FWLIB,然后点击右边的Add Files,定位到我们刚才建立的目录STM32F10 x_FWLib/src下面,将里面所有的文件选中(Ctrl+A),然后点击Add,然后Close.可以看到Files列表下面包含我们添加的文件,下面我们点击编译按钮 编译工程,可以看到很多报错,因

28、为找不到库文件。,下面要告诉MDK,在哪些路径之下搜索相应的文件。回到工程主菜单,点击魔术棒,出来一个菜单,然后点击 c/c+选项.然后点击Include Paths右边的按钮。弹出一个添加path的对话框,然后我们将图上面的3个目录添加进去。记住,keil只会在一级目录查找,所以如果你的目录下面还有子目录,记得path一定要定位到最后一级子目录。然后点击OK.,重新定位到c/c+界面,然后copy “STM32F10X_MD,USE_STDPERIPH_DRIVER”到 Define里面。,在编译之前,我们记得打开工程USUR下面的main.c,复制下面代码到main.c覆盖已有代码,然后进

29、行编译。(记得在代码的最后面加上一个回车,否则会有警告),#include stm32f10 x.h GPIO_InitTypeDef GPIO_InitStructure; int main(void) SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;,GPIO_InitStructure.GPIO_

30、Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOD, ,这次编译可以看出,已经成功了。这样一个工程模版建立完毕。下面还需要配置,让编译之后能够生成hex文件。同样点击魔术棒,进入配置菜单,选择Output。然后勾上下三个选项。其中Create HEX file是编译生成hex文件,练习题二,1. STM32F103VBT6中,V的含义是(),B含义是()。2.数据类型 uv32定义的是()类型数据。3.STM32F103VBT6工作电压是()。4. STM32F103VBT6最高工作频率是()。5. STM32的系统时钟有3个来源:()、()、()。由()来控制选

31、择。6.HSE时钟频率范围是()7.LSE时钟频率是()。8.STM32时钟系统很复杂,原因在于()。,9. APB2最高工作频率是()。10. APB1最高工作频率是()。11. PLL的作用是实现()。12. STM32的复位采用()电平复位。13. 一般一个工程中包含3个组(group): CORE、USER和LIB。分别用来()、()和()14. STM32系列产品,根据存储器容量大小分成三类()、()、()。在下载程序时,要在环境中进行设置。15. STM32支持两种下载方式:()下载和()下载。,16. RCC的英文全称是()。17. RCC寄存器一共包括()个寄存器。18. 时钟配置主要包括两个部分:配置()时钟和开启()时钟。19. RCC_DeInit 函数的功能是()。20. RCC_PLLCmd(ENABLE)的功能是()。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号