




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章嵌入式系统导论嵌入式系统的概念:是以现代计算机技术为基础,以应用为中心,可以根据系统或用户需求(功能、可靠性、成本、体积、功耗、环境等),灵活裁剪软硬件模块的专用计算机系统。嵌入式系统的分类及分类依据:嵌入式系统由硬件和软件两大部分组成,用于实现对其他设备的控制、监视或管理等功能。前者是整个系统的物理基础,它提供软件运行平台和通信接口;后者实际控制系统的运行。硬件:嵌入式微处理器、外围电路、外围硬件设备。软件:BootLoader、嵌入式操作系统、用户的应用程序等。几种典型嵌入式操作系统:(1)uC/OSII(2)uCLinux(3)WindowsCE(4)嵌入式Linux等任务调度:任务的调度有三种方式:可抢占式、不可抢占式和时间片轮转。【不可抢占式调度是指一个任务一旦获得CPU就独占其运行,除非由于某种原因使它决定放弃CPU的使用权;可抢占式调度是基于任务优先级的,当前正在运行的任务可以随时让位给优先级更高的处于就绪态的其他任务;当两个或两个以上任务有同样的优先级时,不同任务轮转使用CPU,直到系统分配的CPU时间片用完,这就是时间片轮转调度。】目前,大多数嵌入式操作系统对不同优先级的任务采用基于优先级的可抢占式调度法,对相同优先级的任务则米用时间片轮转调度法。针对有内存管理单元(MMU,MemoryManagementUnit)的处理器而设计的一些桌面操作系统,如Windows.Linux,使用了虚拟存储器的概念。计算机的发展:冯诺依曼架构:将指令和数据存放在同一存储空间中,统一编址,指令和数据通过同一总线访问。哈佛结构(冯诺依曼架构的扩展):主要特点是程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个相互独立的存储器,每个存储器独立编制、独立访问。CortexM3Cortex系列按嵌入式系统的典型应用分类:Cortex-A:高性能(HighPerformance),[针对日益增长的运行Linux、WinCE、Symbian等操作系统在内的消费者娱乐和无线产品设计与实现。】Cortex-M:微控制器类(Microcontroller),【针对应用系统对功耗、成本敏感,同时对微处理器性能要求较高的工业领域(汽车、家电、医疗器械等)。】Cortex-R:【实时类(RealTime),针对实时性要求较高的领域,可以运行RTOS。】Cortex-W:【Wireless】Cortex指令完全采用Thumb-2体系架构。第2章Cortex-M3内核原理Cortex-M3是ARM公司推出的新一代32位低成本、高性能通用微控制器内核。Cortex-M3体系结构:Cortex-M3处理器主要由两大部分组成:Cortex-M3内核:中央处理器核心(Cortex-M3Core嵌套向量中断控制器(NVIC)系统时钟(SYSTICK)存储器保护单元(MPU)总线调试系统AMBA总线:(1)AHB:AdvancedHighPerformanceBus,用于高性能系统模块的连接,支持突发模式数据传输和事务(ACID:原子性、一致性、隔离性和持久性)分割;(2)ASB:AdvancedSystemBus,也用于高性能系统模块的连接,支持突发模式数据传输,这是较老的系统总线格式,后来由AHB总线替代;(3)APB:AdvancedPeriPheralBus,用于较低性能外设的简单连接,一般是接在AHB或ASB系统总线上的第二级总线。(4)Cortex-M3内核是典型的32位处理器内核:内部数据路径宽度为32位,寄存器宽度为32位,存储器接口宽度也是32位,-Cortex-M3内核拥有独立的指令总线和数据总线,其寻址能力均为4G,且共享同一个存储器空间,取指与数据访问可同时进行。Cortex-M3寄存器:(1).低组寄存器(R0〜R7)【所有指令均能访问,字长为32位,复位后的初始值是随机的。绝大多数16位Thumb指令只能访问R0~R7。】(2).高组寄存器(R8~R12)【只有很少的16位Thumb指令能访问,32位指令则不受限制,复位后的初始值是随机的。】(3).堆栈寄存器(R13)又称“堆栈指针SP”【Cortex-M3处理器内核有两个堆栈,但这两个寄存器不会同时生效,根据系统运行状态进行堆栈切换,以保证程序运行的快速性、安全性等要求。】主堆栈指针(MSP),或写作SP_main。【缺省堆栈指针,它由OS内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。】进程堆栈指针(PSP),或写作SP_process。【用于常规的应用程序代码(不处于异常服务例程中时)。】在系统连接结构中,通常借助AHB-APB桥实现内核内部高速总线到外部低速总线的数据缓冲和转换。Cortex-M3是一个32位处理器,支持4GB存储空间,与ARM架构相比,有很多优点:预定义存储器映射和总线配置;支持"位带(bit-band)”操作;支持非对齐访问和互斥访问;支持小端和大端两种存储格位带操作:概念:位带操作,只适用于数据访问,不适用于取指。通过位带的功能,可以把多个布尔型数据打包在单一的字中,却依然可以从位带别名区中,像访问普通内存一样地使用它们。位带别名区中的访问操作是原子的,消灭了传统的“读一改一写”三步曲以及由此产生的被中断的可能。为什么采用位带操作?可以显著提高位操作的效率和安全性,对许多底层软件开发特别是操作系统和驱动程序具有重要意义。片内外设区(Peripheral,0x40000000~0x5FFFFFFF,512MB)外部RAM区(ExternalRam,0x60000000~0x9FFFFFFF,256KB)外部设备区(ExternalDevice,0xA0000000~0xDFFFFFFF,768KB)(4)映射公式:bit_word_addr=bit_band_alias_base+(byte_offsetX32)+(bit_numberX4)-bit_word_addr是别名存储器区中字的地址,它映射到某个目标位。-bit_band_alias_base是别名区的基址,即起始地址。-byte_offset是包含目标位的字节在位带区里的序号。-bit_number是位带区目标位所在字节中的位置(0-7)。(5)例题:例1:位带区SRAM地址为0x20000300的字节中的位2,其位带别名区的映射地?【答案】?=0x22000000+(0x300*32)+(2*4).0x22006008=0x22000000+(0x300*32)+(2*4).・对0x22006008地址的写操作和对SRAM中地址0x20000300字节的位2执行“读一改一写”操作有着相同的效果。例2:地址?的别名字映射为0x200FFFFF的bit-band字节的位0:地址?的别名字映射为0x200FFFFF的bit-band字节的位7:地址?的别名字映射为0x20000000的bit-band字节的位0:地址?的别名字映射为0x20000000的bit-band字节的位7:【答案】地址0x23FFFFE0的别名字映射为0x200FFFFF的bit-band字节的位0:0x23FFFFE0=0x22000000+(0xFFFFF*32)+0*4地址0x23FFFFEC的别名字映射为0x200FFFFF的bit-band字节的位7:0x23FFFFEC=0x22000000+(0xFFFFF*32)+7*4地址0x22000000的别名字映射为0x20000000的bit-band字节的位0:0x22000000=0x22000000+(0*32)+0*4地址0x220001C的别名字映射为0x20000000的bit-band字节的位7:0x2200001C=0x22000000+(0*32)+7*4例2图示:S2MBaliasregion|血二;卜卜卜卜卜相心.;卜11卜7〔心阡卜卜卜口(心泗心4心FFF心iy:"FFW
-怎样利用“位带操作”进行位带区的“读一改一写”呢?例3:欲设置地址0x20000000中的比特2。不使用位带功能读取皈MODOOOO处前值到寄停箸中>16善存者的d写回到OxWOOJJg。使用位带功就读取脆0。0_016善存者的d写回到OxWOOJJg。使用位带功就读取脆0。0_0。0。处的值到内亩缱冲区位苏Bit?后.再把值与回睥。。。_。0。0【答案】WithoutBit-BandWithBit-BandLDRR0,=0x20000000;SetupaddressLDRR1,[R0];ReadORR.WR1,#0x4;ModifybitSTRR1,[R0];WritebackresultLDRR0,=0x22000008;SetupaddressMOVR1,#1;SetupdataSTRR1,[R0];Write假如在(位带区)地址0x20000000处的字为0x3355AACC,要求对bit2清零。【答案】-无位带LDRR0,=0x20000000;建立地址LDRR1,[R0];ReadAND.WR1,#0xFFFFFFFB;bit2清零STRR1,[R0];writebackresult-有位带LDRR0,=0x22000008;建立地址MoveR1,0;SetupDataSTRR1,[R0];writebackresult【解答】①读取地址0x22000008。本次读访问将读取0x20000000,并提取比特2,值为1。往地址0x22000008处写0。本次操作将被映射成对地址0x20000000的“读一改一写”操作(原子操作),把比特2清0。现在再读取0x20000000,将返回0x3355AAC8(bit[2]已清零)。
工作模式-Cortex-M3支持两种模式和两个特权等级。异常handler代码主应用程序代码异常handler代码主应用程序代码处理模式(handlermode)用法错误线程模式(threadmode)线程模式(threadmode)特权级用户级RESETCortex-M3处理器的工作模式和特权等级共有三种配合。线程模式+用户级线程模式+特权级Handler模式+特权级中断:中断的概念:所谓中断,是指CPU对系统内、外发生的某个事件的一种响应过程,或者说“一种机制”,即CPU暂时停止现行程序的执行,自动转去执行预先安排好的处理该事件的服务子程序;当处理结束后,再返回到被暂停的程序的断点处,继续执行原来的程序。什么是中断向量表?Cortex-M3拥有一张向量表,用于在发生中断并作出响应时,从表中查询与中断对应的处理例程的入口地址向量。Cortex-M3内核集成了中断控制器——嵌套向量中断控制器NVIC(NestedVectoredInterruptController)o中断优先级:Cortex-M3除配置优先级外,还通过把256级优先级分为抢占优先级和亚优先级支持最多128个抢占级。优先级分组规定:亚优先级至少是1位,因此抢占优先级最多是7位,128级抢占优先级。第3章STM32固件库介绍CMSIS-外设访问层的文件独立于编译器的文件:•Cortex-M3内核及其设备文件(core_cm3.h+core_cm3.c)-访问Cortex-M3内核及其设备:NVIC,SysTick等-访问Cortex-M3的CPU寄存器和内核外设的函数•微控制器专用头文件(device.h)-指定中断号码(与启动文件一致)-外设寄存器定义(寄存器的基地址和布局)-控制微控制器其他特有的功能的函数(可选)•微控制器专用系统文件(system_device.c)-函数SystemInit,用来初始化微控制器-函数Sysem_ExtMemCtl,用来配置外部存储器控制器。它位于文件startup_stm32f10x_xx.s/.c,在跳转到main前调用-SystemFrequncy,该值代表系统时钟频率-微控制器的其他功能(可选)编译器供应商+微控制器专用启动文件-编译器启动代码(汇编或者C)(startup_device.s)-微控制器专用的中断处理程序列表(与头文件一致)-弱定义(Weak)的中断处理程序默认函数(可以被用户代码覆盖)CMSIS文件名的定义标准core_cm3.hCortex-M3globaldeclarationsanddefinitions,staticfunctiondefinitionscore_cm3.cCortex-M3globaldefinitions-<device>.hTop-levelheaderfile(devicespecific).Tobeincludedbyapplicationcode.Includescore_cm3.handsystem_<device>.h-system_<device>.hDevicespecificdeclarations-system_<device>.cDevicespecificdefinitions,e.g.SystemInit()【我也不知道上面到底哪个是要考的-_-|||】第4章基于Cortex-M3的STM32F10X“最小系统”最小系统:(1)“最小系统”的概念:在尽可能减少上层应用的情况下,能够使系统运行的最小化模块配置。对于当前的大多数微控制器而言,“最小系统”称为“嵌入式核心控制模块”似乎更贴切一些。(2)最小系统的组成:电源、②时钟、③复位电路、④存储系统、⑤调试系统•时钟模块一一通常经ARM内部锁相环进行相应的倍频,以提供系统各模块运行所需的时钟频率输入Flash存储模块——存放启动代码、操作系统和用户应用程序代码SDRAM模块一一为系统运行提供动态存储空间,是系统代码运行的主要区域JTAG模块一一实现对程序代码的下载和调试UART模块一一实现对调试信息的终端显示•复位模块一一实现对系统的复位(3)嵌入式最小系统的核心部分:Cortex-M3微处理器、FLASH和SDRAM模块STM32F103处理器系统频率为72MHz,处理器性能可达到90DMIPS,此时Cortex-M3功耗约14W左右。系统复位:系统复位将清除时钟控制器CSR中的复位标志和备用域寄存器之外的所有寄存器。STM32内含复位电路支持,当任意一个下列事件发生时都将引起系统自动复位:NRST引脚出现低电平(外部复位);看门狗计时器计时终止(WWDG复位);独立看门狗计数终止(IWDG复位);软件复位(SW复位);低功耗管理复位。可通过查询控制/状态寄存器RCC_CSR中的复位标志来识别复位源。电压调压器电压调压器的三种操作模式:主模式(MR):又称“运行模式(RunMode)”或“调节模式”,用于CPU正常的运行操作,以正常功耗模式,向内核、内存、外设供给1.8V电源。低功耗模式(LPR):又称“停止(机)模式(StopMode)?”,当CPU无任务需要处理时,以低功耗模式供1.8V电源,以保持SRAM、寄存器等的内容。一般可以根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定最佳低功耗模式。掉电(关断)模式:用于CPU"待机模式(StandbyMode)”,调压器的输出为高阻状态,停止内核电路供电,调压器处于零消耗状态,除待机电路和备份域外,寄存器和SRAM的内容将丢失。有时,该模式被归为“低功耗模式”的一种。GPIO模块(1)GPIO(GeneralPurposeInputOutput,通用I/O)接口模块,可以为CPU提供数字输入输出功能。(2)可以对通过软件对GPIO接口进行灵活配置和操纵,包括:①输入输出的方向配置②引脚功能复用引脚的重新映射④是否可以申请中断⑤PWM输出等(3)STM32F10X系列产品的GPIO模块,可以进行输入输出等功能的配置。共8种模式:①入浮空输入:In_Floating②上拉入输入:IPU(InPush_Up)下拉入输入:IPD(InPush_Down)④入模拟输入:AIN(AnalogIn)开漏出输出:OUT_OD(OD:Open-Drain)推挽出输出:OUT_PP(PP:Push-Pull)复用功能推挽出输出:AF_PP⑧复用功能开漏出输出:AF_OD(4)通过I/O端口配置方式降低功耗•:•如果需要减小I/O端曰的电流消耗,可以根据具体情况配置I/。端曰的状态:>输入端11今配置为浮空输入>带外部上拉的输出端II9配置为推挽输出并输出T>带外部下拉的输出端II今配置为推挽输出并输出O>未用的悬空端II今配置为推挽输出并输出T•:•未用的内部外设:>保持为关闭和默认的复位状态:ON=、人□不要进行重映射IpiLp□复位寄存器|UrRV?RCC_APB1RSTR和RCC_APB2RSTR|||\1>关闭对应的时钟OFF□时钟使能寄存器:RCC_AHBENR、RCC_APB2ENRfnRCC_APB1ENRGPIO复用功能为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些引脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。GPIO的配置•先看GPIO.h文件typedefenum(GPIO_Speed_10MHz=1,GPIO_Speed_2MHz,GPIO_Speed_50MHz}GPIOSpeed_TypeDef;#defineIS_GPIO_SPEED(SPEED)(((SPEED)==GPIO_Speed_10MHz)||((SPEED)==GPIO_Speed_2MHz)||\((SPEED)==GPIO_Speed_50MHz))typedefenum(GPIO_Mode_AIN=0x0,GPIO_Mode_IN_FLOATING=0x04,GPIO_Mode_IPD=0x28,GPIO_Mode_IPU=0x48,GPIO_Mode_Out_OD=0x14,GPIO_Mode_Out_PP=0x10,GPIO_Mode_AF_OD=0x1C,GPIO_Mode_AF_PP=0x18}GPIOMode_TypeDef;#defineIS_GPIO_MODE(MODE)(((MODE)==GPIO_Mode_AIN)||((MODE)==GPIO_Mode_IN_FLOATING)||\((MODE)==GPIO_Mode_IPD)||((MODE)==GPIO_Mode_IPU)||\((MODE)==GPIO_Mode_Out_OD)||((MODE)==GPIO_Mode_Out_PP)||\((MODE)==GPIO_Mode_AF_OD)||((MODE)==GPIO_Mode_AF_PP))typedefstruct(uint16_tGPIO_Pin;/*!<SpecifiestheGPIOpinstobeconfigured.Thisparametercanbeanyvalueof@refGPIO_pins_define*/GPIOSpeed_TypeDefGPIO_Speed;/*!<Specifiesthespeedfortheselectedpins.Thisparametercanbeavalueof@refGPIOSpeed_TypeDef*/GPIOMode_TypeDefGPIO_Mode;/*!<Specifiestheoperatingmodefortheselectedpins.Thisparametercanbeavalueof@refGPIOMode_TypeDef*/}GPIO_InitTypeDef;typedefenum(Bit_RESET=0,Bit_SET}BitAction;voidGPIO_DeInit(GPIO_TypeDef*GPIOx);voidGPIO_AFIODeInit(void);voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);voidGPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct);uint8_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);uint16_tGPIO_ReadInputData(GPIO_TypeDef*GPIOx);uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);uint16_tGPIO_ReadOutputData(GPIO_TypeDef*GPIOx);voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitActionBitVal);voidGPIO_Write(GPIO_TypeDef*GPIOx,uint16_tPortVal);voidGPIO_PinLockConfig(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);voidGPIO_EventOutputConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);voidGPIO_EventOutputCmd(FunctionalStateNewState);voidGPIO_PinRemapConfig(uint32_tGPIO_Remap,FunctionalStateNewState);voidGPIO_EXTILineConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);voidGPIO_ETH_MediaInterfaceConfig(uint32_tGPIO_ETH_MediaInterface);•再看GPIO.C文件voidGPIO_DeInit(GPIO_TypeDef*GPIOx)(/*Checktheparameters*/assert_param(IS_GPIO_ALL_PERIPH(GPIOx));if(GPIOx==GPIOA)(RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,DISABLE);}elseif(GPIOx==GPIOB)(RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB,DISABLE);}elseif(GPIOx==GPIOC)(RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC,DISABLE);}elseif(GPIOx==GPIOD)(RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD,DISABLE);}elseif(GPIOx==GPIOE)(RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE,DISABLE);}elseif(GPIOx==GPIOF)(RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF,DISABLE);}else(if(GPIOx==GPIOG)(RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG,DISABLE);}}}•最后看GPIO_test工程的main.c文件#include"stm32f10xlib.h"GPIO_InitTypeDefGPIO_InitStructure;ADC_InitTypeDefADC_InitStructure;DMA_InitTypeDefDMA_InitStructure;EXTI_InitTypeDefEXTI_InitStructure;ErrorStatusHSEStartUpStatus;externvu32TimingDelay;/*Privatefunctionprototypes*/voidRCC_Configuration(void);voidNVIC_Configuration(void);voidGPIO_Configuration(void);voidDelay(vu32nTime);voidSysTick_Configuration(void);voidSetupLED(void);externvoidSetupADC(void);intmain(void)(/*ConfiguretheGPIOports*/GPIO_Configuration();for(;;)(GPIOC->ODR=0xfffffc4f;Delay(800);GPIOC->ODR=0xfffffc8f;Delay(800);GPIOC->ODR=0xfffffd0f;Delay(800);GPIOC->ODR=0xfffffe0f;Delay(800);}}voidGPIO_Configuration(void)(GPIO_InitTypeDefGPIO_InitStructure;/*ConfigurePC.asOutputpush-pull*/GPIO_InitStructure.GPIO_PinGPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOC,&GPIO_InitStructure);/*ConfigurePB9asinputfloating(EXTILine9)*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB,&GPIO_InitStructure);}NVIC中断程序配置-硬件中断选择:通过下面的过程来配置19个线路做为中断源:(1)配置19个中断线的屏蔽位((EXTI_IMR));(2)配置所选中断线的触发选择位((EXTI_RTSR和EXTI_FTSR));(3)配置那些控制映像到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得19个中断线中的请求可以被正确地响应。-硬件事件选择:通过下面的过程,可以配置19个线路为事件源(1)配置19个事件线的屏蔽位((EXTI_EMR)(2)配置事件线的触发选择位((EXTI_RTSRandEXTI_FTSR)-软件中断/事件的选择:19个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程:配置19个中断/事件线屏蔽位((EXTI_IMR,EXTI_EMR)设置软件中断寄存器的请求位((EXTI_SWIER)总中断控制函数.身在STM32固件库中(stm32flOx_nvic.cfustm32flOx_nvic.h)定义了四个函数操作PRIMASKR和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。皆下面两个函数等效于关闭总中断:voidNVIC_SETPRIMASK(void):voidNVIC_SETFAULTMASK(void);宙下面两个函数等效于开放总中断:voidNVIC_RESETPRIMASK(void);voidNVIC_RESETFAULTMASK(void):宙注意事项国上面两组函数要成对使用,不能交又伯管STM32中的中断源很多,最好能够安排好分头控制,不建议这样控制.在STM32F103中,三个不同的时钟源可以用来驱动系统时钟(SYSCLK):HSI晶振时钟(高速内部时钟信号);HSE晶振时钟(高速外部时钟信号);PLL时钟。内部8个定时器,分三类:通用定时器(GeneralPurposeTimers):TIM2-TIM5基本定时器(BasicTimers):TIM6、TIM7高级定时器(AdvancedControlTimers)TIM1、TIM8(大容量STM32F103/107独有)定时器可以作为计数器使用,区别在于:定时器使用微控制器的时钟来计数计数器使用的是外部信号计数【从功能上来看:基本定时器是通用定时器的子集,通用定时器又是高级定时器的子集。】定时器的计数模式:向上计数模式:从0递增,计到TIMx_ARR计数器的自动装载值,并产生计数溢出脉冲;向下计数模式:从TIMx_ARR计数器的自动装载值递减,计到0,并产生计数溢出脉冲;中心对称计数模式:从0递增,计到TIMx_ARR计数器的自动装载值,并产生计数溢出脉冲;然后,从TIMx_ARR计数器的自动装载值递减,计到0,又产生计数溢出脉冲;之后又从0开始循环计数。定时器的设置:#include"stm32f10x_heads.h"#include"HelloRobot.h"voidTimx_Init(void);intmain(void)(BSP_Init();Timx_Init();//定时器初始化函数while(1);}voidTimx_Init(void)(TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_DeInit(TIM2);//复位TIM2定时器TIM_TimeBaseStructure.TIM_Period=35999;TIM_TimeBaseStructure.TIM_Prescaler=1999;TIM_TimeBaseStructure.TIM_ClockDivision=0x0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);TIM_ClearFlag(TIM2,TIM_FLAG_Update);/*ClearTIM2updatependingflag[清除TIM2溢出中断标志]*/TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);/*EnableTIM2Updateinterrupt[TIM2溢出中断允许]*/TIM_Cmd(TIM2,ENABLE);/*TIM2enablecounter[允许tim2计数]*/在stm32f10x_it.c文件里,添加TIM2_IRQHandler(void)中断函数即可实现中断计时响应。voidTIM2_IRQHandler(void)(if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==0)GPIO_SetBits(GPIOC,GPIO_Pin_13);elseGPIO_ResetBits(GPIOC,GPIO_Pin_13);TIM_ClearFlag(TIM2,TIM_FLAG_Update);/*ClearTIM2updatependingflag[清除TIM2溢出中断标志]*/}第5章STM32F10X主要模块ADC:模拟/数字转换(A/D变换)负责将连续的模拟信号变为对应的离散数值表示,以方便CPU的处理,完成这一功能的部件因此也就被称为模拟/数字转换器ADC(AnalogtoDigitalConvertor)。ADC的A/D转换方式:查询式AD中断式AD外部触发式AD【查询式AD:在查询方式下,软件可通过读取ADC模块转换完毕引脚EOC的状态或状态寄存器中的转换完成标志位判断本次A/D是否结束;若结束则从数据总线或数据寄存器中读取A/D结
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论