嵌入式系统原理与应用-课件 第4章 STM32 应用编程_第1页
嵌入式系统原理与应用-课件 第4章 STM32 应用编程_第2页
嵌入式系统原理与应用-课件 第4章 STM32 应用编程_第3页
嵌入式系统原理与应用-课件 第4章 STM32 应用编程_第4页
嵌入式系统原理与应用-课件 第4章 STM32 应用编程_第5页
已阅读5页,还剩121页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式系统应用开发教材教学内容STM32

微控制器..............................1

STM32

开发工具..............................18STM32

应用编程.............................119STM32

全面应用.............................233STM32

高级应用.............................258STM32基础入门..............................45STM32

巡线小车设计实训........................

324选学内容:必学内容:4.1 LCD显示和STM32的FSMC

大容量STM32F10xxx()才具有FSMC,不仅可以控制存储器,还可以控制LCD.参考资料:FSMCFlexiblestaticmemorycontroller,灵活的静态存储器控制器2.FSMC包含四个主要模块AHB接口(包含FSMC配置寄存器),NOR闪存和PSRAM控制器,NAND闪存和PC卡控制器,外部设备接口,FSMC的内部结构框图见图。3.FSMC包含2类存储器控制器:

(1)一个NOR闪存/PSRAM控制器,可以与NORFLASH、SRAM和PSRAM存储器接口。(2)一个NAND闪存/PC卡控制器,可以与NAND闪存、PC卡、CF卡和CF+存储器接口。

控制器产生所有驱动这些存储器的信号时序:(1)16个数据线,用于连接8位或16位存储器。(2)26个地址线,最多可连接64M字节的存储器。(3)4个独立的片选信号线。背景知识:常见的存储器1.SRAMSRAM(Static

Random

Access

Memory,静态随机存取存储器)是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以保持。2.DRAMDRAM(DynamicRandomAccessMemory,动态随机存取存储器),每隔一段时间,要刷新充电一次,否则内部的数据即会消失。由于这种需要定时刷新的特性,因此被称为“动态”存储器。相对来说,静态存储器(SRAM)只要存入数据后,纵使不刷新也不会丢失。IS61LV512163.SDRAMSDRAM(synchronousdynamicrandom-accessmemory,同步动态随机存储器),是电脑上最为广泛应用的一种内存类型,是有一个同步接口的动态随机存取內存(DRAM)。4.PSRAMPSRAM(PseudoStaticRandomAccessMemory,伪SRAM),内部与SDRAM相似,但外部接口跟SRAM相似,不需要SDRAM那样复杂的控制器和刷新机制,PSRAM的接口跟SRAM的接口是一样的。5.FLASH存储器FLASH存储器(FlashEEPROMMemory),也翻译为“闪存”,是一种非易失性存储器,在没有通电的情况下也能够长久地保持数据。闪存又分为NOR与NAND两类,NOR的读速度比NAND稍快一些,NAND的写入速度比NOR快很多。在NANDFLASH中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次。NORFLASH更像内存,有独立的地址线和数据线,但价格比较贵,容量比较小;而NANDFLASH更像硬盘,地址线和数据线是共用的I/O线,而且NANDFLASH与NORFLASH相比,成本要低一些,而容量大得多。因此,NORFLASH比较适合频繁随机读写的场合,通常用于存储程序代码并直接在NORFLASH内运行;NANDFLASH主要用来存储资料,常用的U盘、SD/TF卡都是用NANDFLASH。NORflash(M29W128FL)NANDflash一个典型的NOR闪存的读写时序4.从FSMC的角度看,外部存储器分为4个固定大小为256M字节的存储块(区)(Bank)。存储块(区)1(Bank1)NOR/PSRAM是4x64MB,地址是60000000h-6FFFFFFFh,划分4个64MB的子块(区),则:5.与NOR闪存存储器接口的典型应用以M29W128FL存储器作为参考,M29W128FL是一个16位、异步、非总线共享的NOR闪存存储器,因此FSMC选用存储块(区)1的2子块(区)驱动这个NOR闪存存储器。6.TFTLCD使用FSMC接口1.FSMC提供LCD控制器所需的所有信号,用于LCD接口的FSMC信号描述如下:(1)FSMC[D0:D15]:FSMC数据总线,16位宽度。(2)FSMCNEx:FSMC芯片选择(片选)。(3)FSMCNOE:FSMC输出允许。(4)FSMCNWE:FSMC写入允许。(5)FSMCAx:用于在LCD寄存器和LCD显示RAM选择的一条地址线,其中x可以是0-25。注意:信号名称中的前缀“N”指信号低电平有效。2.LCDIntel8080与FSMC的接口见图5-68,其中NEx的x=1-4;Ax的x=0-25。3.LCD地址取决于使用的FSMCBank1-NOR/PSRAM-1、2、3、4的选择(NEx)和用于驱动LCDRS引脚的选择(Ax)。例如:STM3210E-EVAL评估板

选择NOR/PSRAM的Bank1-NOR/PSRAM4即NE4,使用FSMC_A0即A0来控制LCD的RS引脚,则我们访问LCD寄存器REG的地址为6C000000h,此时A0为低电平;GRAM的基址为0x6C000000,此时A0为高电平。GRAM的基址计算:数据长度为16bit,FSMC_A[24:0]对应HADDR[25:1],GRAM的基址=0x6C000000+2^0*2-2=0x6C000000。STM3210E-EVAL评估板AS-07实验板AxA0(PE0)为RSAxA16(PD11)为RSNExNE4(PG12)为CSNExNE1(PD7)为CSAS-07实验板

选择NOR/PSRAM的Bank1-NOR/PSRAM1即NE1,使用FSMC_A16即A16来控制LCD的RS引脚,则我们访问LCD寄存器REG的地址为60000000h,此时A16为低电平;GRAM的基址为0x6001FFFE,此时A16为高电平。GRAM的基址计算:数据长度为16bit,FSMC_A[24:0]对应HADDR[25:1],GRAM的基址=0x60000000+2^16*2-2=0x6001FFFE。/**@defgroupSTM3210E_EVAL_LCD_Private_TypesDefinitions*@{*/typedefstruct{__IOuint16_tLCD_REG;__IOuint16_tLCD_RAM;}LCD_TypeDef;/***@}*//**@defgroupSTM3210E_EVAL_LCD_Private_Defines*@{*//*Note:LCD/CSisCE4-Bank4ofNOR/SRAMBank1~4*///NOR/SRAMBank1-NE4#defineLCD_BASE((uint32_t)(0x60000000|0x0C000000))#defineLCD((LCD_TypeDef*)LCD_BASE)#defineMAX_POLY_CORNERS200#definePOLY_Y(Z)((int32_t)((Points+Z)->X))#definePOLY_X(Z)((int32_t)((Points+Z)->Y))STM3210E-EVAL评估板

/**@defgroupSTM3210E_EVAL_LCD_Private_TypesDefinitions*@{*/typedefstruct{__IOuint16_tLCD_REG;__IOuint16_tLCD_RAM;}LCD_TypeDef;/***@}*//**@defgroupSTM3210E_EVAL_LCD_Private_Defines*@{*//*Note:LCD/CSisNE1-Bank1:ofNOR/SRAMBank1~4*/#defineLCD_BASE((uint32_t)(0x60000000|0x1FFFE))#defineLCD((LCD_TypeDef*)LCD_BASE)#defineMAX_POLY_CORNERS200#definePOLY_Y(Z)((int32_t)((Points+Z)->X))#definePOLY_X(Z)((int32_t)((Points+Z)->Y))AS-07实验板7.底层驱动程序(FSMC)使用FSMC接口LCD,STM32F103用FSMCi80-16bit驱动ILI9320(AS-07STM32实验板)底层程序如下。1.FSMC配置程序FSMC_NORSRAMInitStructure.FSMC_Bank=FSMC_Bank1_NORSRAM1;//

选用存储块1FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);//初始化

/*BANK1(ofNOR/SRAMBank1~4)isenabled*/FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1,ENABLE);//使能存储块14.1.2TFTLCDTFTLCD(thin-film-transistorliquidcrystaldisplay,薄膜晶体管液晶显示器),是常用的重要的嵌入式外围输出设备,也叫LCM(LCDModule,LCD模块)。

本节介绍LCM的外型、特性、引脚以及驱动,并给出ILI9320或ILI9325、ST7735等驱动的TFTLCD的FSMC、i8016bit、SPI等微处理器接口模式的编程应用。TFTLCD由4部分构成

触摸屏、LCD显示组件、背光灯组件和驱动电路,见图5-70,从左到右分别是TFTLCD正面、反面实物照片。2.2.8寸TFTLCD主要特性

显示颜色数是262K/65K、分辨率240x320、ILI9325驱动器、4个LED背光灯,典型工作电压3.3V等。3.带触摸屏的LCD常用的是37引脚

分为电源(VCC,GND)、数据(DB0-DB7,DB10-DB17)、控制(/CS,RS,/WR,/RD,/RESET)、背光灯(LEDA,LEDK)、触摸(X,Y)、MCU控制接口模式IM等几个类别。4.LCD常用的驱动器

ILITEK公司的ILI9320/9325,Himax公司的HX8347,SolomonSystech公司的SSD1289,Sitronix公司的ST7735等。ILI9320/9325款圖如下,重點是GRAM,即將數據寫入GRAM.5.i80/16-bit系统接口LCD与MCU间的16位接口见图5-73,此时IM[3:0]设置为0010,可以显示262K或65K色。显示65K色时,需要传输一次16bits(RGB565)。显示262K色时,需要传输第一次2bits、第二次16bits(RGB666);或者传输第一次16bits(RGB666)、第二次2bits,见图5-74。RGB5656.寄存器读写时序

FSMC自动产生、GPIO模拟产生7.ILI9320的寄存器ILI9320的一些重要寄存器如下:(1)开始振荡(StartOscillation,R00h)(2)进入模式(EntryMode,R03h)LCD_WriteReg(R3,0x1018);//0001000000011000 横屏显示,见图5-79。(3)显示控制1(DisplayControl1,R07h)编程应用举例:LCD_WriteReg(R7,0x0173);/*262KcoloranddisplayON*/(4)显示GRAM的水平/垂直地址初值(GRAMHorizontal/VerticalAddressSet,R20h,R21h)编程应用举例1:LCD_WriteReg(R32,0x0000);/*GRAMhorizontalAddress*/LCD_WriteReg(R33,0x0000);/*GRAMVerticalAddress*/编程应用举例2:FunctionName:LCD_SetCursorDescription:Setsthecursorposition.voidLCD_SetCursor(u8Xpos,u16Ypos){LCD_WriteReg(R32,Xpos);LCD_WriteReg(R33,Ypos);}(5)写数据到GRAM(WriteDatatoGRAM,R22h)编程应用举例:FunctionName:LCD_WriteRAM_PrepareDescription:PreparetowritetotheLCDRAM.voidLCD_WriteRAM_Prepare(void){ LCD_WriteRegIndex(R34);/*SelectGRAMReg*/}(6)从GRAM读数据(ReadDatafromGRAM,R22h)(7)水平和垂直RAM地址位置(HorizontalandVerticalRAMAddressPosition,R50h,R51h,R52h,R53h)编程应用举例:/*SetGRAMarea*/LCD_WriteReg(R80,0x0000);/*HorizontalGRAMStartAddress*/LCD_WriteReg(R81,0x00EF);/*HorizontalGRAMEndAddress*/LCD_WriteReg(R82,0x0000);/*VerticalGRAMStartAddress*/LCD_WriteReg(R83,0x013F);/*VerticalGRAMEndAddress*/8.LCD使用时重要的首先是初始化,不同的驱动器有相应的初始化程序STM3210E-EVAL的LCD(AM-240320L8TNQW00H(LCD_ILI9320))的初始化程序,主要包括:配置LCD控制引脚、开始初始化配置序列、上电配置序列、γ曲线调整(原因是人眼视觉是非线性的)、设置显示显存(GRAM)区域、局部显示控制、显示面板控制、显示进入(方向)控制、开关显示等。

例如:LCD_WriteReg(R3,0x1030);/*setGRAMwritedirectionandBGR=1.*///设置显示画面的显示正反、上下、左右等方向9.LCD显示实验FSMC_D0—>PD141.TFT-LCD2.触摸屏控制器3.LCD插座(LCD模块)4.LCD插座(底板)16条DB0–DB7,DB10-DB172.CS,RS,WR,RD,RST,LCD_BLSTM3210E-EVALAS-07AxA0(PE0)为RSAxA16(PD11)为RSNExNE4(PG12)为CSNExNE1(PD7)为CS2.软件设计(编程)(1)设计分析在main.c文件里的main函数,调用了在lcd.c文件里的LCD初始化函数STM32_SS_LCD_Init/STM3210E_LCD_Init,具体代码与5.5.6相同。(2)程序源码与分析STM3210E-EVAL引脚配置AS-07引脚配置AS-07FSMC配置AS-07LCDRAM地址设置AS-07增加复位AS-07增加复位AS-07修改显示姓名拼音和学号将STM3210E的LCD程序移植到AS-07。移植程序是一个中等难度的实验形式,因为要把程序搞懂了,才能移植,并且涉及到到硬件的设计。当然,更高级的实验形式,自己编写。程序,自己设计硬件

分析,点评/*SetPF.00(A0(RS))asalternatefunctionpushpull*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_Init(GPIOF,&GPIO_InitStructure);/*SetPG.12(NE4(LCD/CS))asalternatefunctionpushpull-CE3(LCD/CS)*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_Init(GPIOG,&GPIO_InitStructure);STM3210E-EVALPF0=FSMC_A0=LCD_RSPG12=FSMC_NE4=LCD_CS/*SetPF.00(A0(RS))asalternatefunctionpushpull*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_Init(GPIOF,&GPIO_InitStructure);/*SetPG.12(NE4(LCD/CS))asalternatefunctionpushpull-CE3(LCD/CS)*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_Init(GPIOG,&GPIO_InitStructure);STM3210E-EVAL/**@defgroupSTM3210E_EVAL_LCD_Private_TypesDefinitions*@{*/typedefstruct{__IOuint16_tLCD_REG;__IOuint16_tLCD_RAM;}LCD_TypeDef;/***@}*//**@defgroupSTM3210E_EVAL_LCD_Private_Defines*@{*//*Note:LCD/CSisCE4-Bank4ofNOR/SRAMBank1~4*/#defineLCD_BASE((uint32_t)(0x60000000|0x0C000000))#defineLCD((LCD_TypeDef*)LCD_BASE)#defineMAX_POLY_CORNERS200#definePOLY_Y(Z)((int32_t)((Points+Z)->X))#definePOLY_X(Z)((int32_t)((Points+Z)->Y))STM3210E-EVAL/*SetPD11(A16(RS))asalternatefunctionpushpull*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;GPIO_Init(GPIOD,&GPIO_InitStructure);/*SetPD7(NE1(LCD/CS))asalternatefunctionpushpull-CE3(LCD/CS)*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;GPIO_Init(GPIOD,&GPIO_InitStructure);

AS-07PD11=FSMC_A16=LCD_RSPD7=FSMC_NE1=LCD_CS/**@defgroupSTM3210E_EVAL_LCD_Private_TypesDefinitions*@{*/typedefstruct{__IOuint16_tLCD_REG;__IOuint16_tLCD_RAM;}LCD_TypeDef;/***@}*//**@defgroupSTM3210E_EVAL_LCD_Private_Defines*@{*//*Note:LCD/CSisCE4-Bank4ofNOR/SRAMBank1~4*/#defineLCD_BASE((uint32_t)(0x60000000|0x0001FFFE))#defineLCD((LCD_TypeDef*)LCD_BASE)#defineMAX_POLY_CORNERS200#definePOLY_Y(Z)((int32_t)((Points+Z)->X))#definePOLY_X(Z)((int32_t)((Points+Z)->Y))AS-07顯示H顯示H嵌入式系统应用开发教材教学内容STM32

微控制器..............................1

STM32

开发工具..............................18STM32

应用编程.............................119STM32

全面应用.............................233STM32

高级应用.............................258STM32基础入门..............................45STM32

巡线小车设计实训........................

324选学内容:必学内容:4.2 STM32的定时器

4.2.1 STM32定时器基本原理及常见问题4.2.2 基本定时器(TIM6和TIM7)基本定时器框图见图4-21

时基单元包含:计数器寄存器(CounterRegister,TIMx_CNT),预分频寄存器(PrescalerRegister,TIMx_PSC),自动重装载寄存器(Auto-ReloadRegister,TIMx_ARR)(1)时基单元(Time-baseunit)(2)计数模式(Countingmode)

计数器从0累加计数到自动重装载数值(TIMx_ARR寄存器),然后重新从0开始计数并产生一个计数器溢出事件。(3)时钟源(Clocksource)

计数器的时钟由内部时钟(Internalclock,CK_INT)提供。TIM6的時鐘72MHz【实验4-5】基本定时器TIM6定时1ms

本例说明如何使用STM32CubeMX和HAL库函数配置TIM6实现定时1ms,

通过LED1的亮灭来展示定时1000次。STM32CubeMX关键操作如下:①main主函数。intmain(void){HAL_Init(); //复位所有外设、初始化FLASH接口和SystickSystemClock_Config(); //调用SystemClock_Config函数,配置系统时钟,类似标准库的RCC配

置函数,不同之处是多了SysTick的配置函数

MX_GPIO_Init(); //初始化GPIOMX_TIM6_Init(); //初始化TIM6HAL_TIM_Base_Start_IT(&htim6);//开始启动TIM6中断

while(1){}}关键程序段②TIM6初始化函数MX_TIM6_InitTIM6时钟为72M,预分频系数72-1,定时周期1000-1,则计数周期为1ms,基本定时器TIM6初始化如下:staticvoidMX_TIM6_Init(void){TIM_MasterConfigTypeDefsMasterConfig;htim6.Instance=TIM6;htim6.Init.Prescaler=71; //预分频系数72-1htim6.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数

htim6.Init.Period=1000-1; //周期1000-1htim6.Init.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE; //自动重装禁止

if(HAL_TIM_Base_Init(&htim6)!=HAL_OK) //时基初始化

{_Error_Handler(__FILE__,__LINE__);}sMasterConfig.MasterOutputTrigger=TIM_TRGO_RESET; //TIM触发输出复位

sMasterConfig.MasterSlaveMode=TIM_MASTERSLAVEMODE_DISABLE; //TIM主从模式禁止

if(HAL_TIMEx_MasterConfigSynchronization(&htim6,&sMasterConfig)!=HAL_OK)//TIM主机配置同步

{_Error_Handler(__FILE__,__LINE__);}}③TIM6

中断函数TIM6_IRQHandler。voidTIM6_IRQHandler(void)//TIM6中断函数{HAL_TIM_IRQHandler(&htim6);//TIM6中断函数}④非阻塞模式下(Period

elapsed

callback

in

non

blocking

mode)定时器的回调函数HAL_TIM_PeriodElapsedCallbackvoidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){timer_count++; if(timer_count==1000) //定时1ms*1000=1s{ timer_count=0; HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_6); //PC6输出状态翻转 }}4.2.3 通用定时器(TIMx)TIMx简介通用定时器(general-purposetimers)是一个通过可编程预分频器驱动的16位自动装载计数器构成。TIMx主要功能通用TIMx(TIM2、TIM3、TIM4和TIM5)定时器功能包括:(1)16位向上、向下、向上/向下自动装载计数器。(2)16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值。(3)4个独立通道:输入捕获,输出比较,PWM生成(边缘或中间对齐模式),单脉冲模式输出。(4)使用外部信号控制定时器和定时器互连的同步电路。(5)如下事件发生时产生中断/DMA:更新,计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发);触发事件(计数器启动、停止、初始化或者由内部/外部触发计数);输入捕获;输出比较。(6)支持针对定位的增量(正交)编码器和霍尔传感器电路。3.TIMx功能介绍通用定时器原理框图如图4-22所示可编程通用定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计数。向上计数:计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件。向下计数:计数器从自动装入的值(TIMx_ARR

计数器的值),开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。在中央对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)−1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;然后再从0开始重新计数。时基单元包含计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动装载寄存器(TIMx_ARR)。实验4-6 Proteus仿真STM32:TIM3定时1ms(HAL库)本例说明如何使用HAL库函数配置普通定时器TIM3实现定时1ms,实现STM32F103RB-Nucleo实验板的LED2闪烁指示。1.硬件设计2.软件设计(编程)此示例在STM32F103RB上运行,没有外部8M晶振,系统时钟被设置为64MHz。TIM3时钟为64MHz,预分频系数6400-1,定时周期10000-1,则TIM3计数器时钟10kHz(周期为0.1秒)。实验4-7 TIM3产生PWM的呼吸灯(HAL库)

本例说明如何使用STM32CubeMX和HAL库函数配置TIM3产生可变占空比的PWM实现LED亮度变化的“呼吸灯”。(2) 程序源码与分析4.2.4高级控制定时器(TIM1和TIM8)

1.TIM1和TIM8简介

高级控制定时器(advanced-controltimers)(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。

它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM等)。

使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。

2.TIM1和TIM8主要特性

TIM1和TIM8定时器的功能包括:

(1)16位向上、向下、向上/下自动装载计数器。(2)16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值。(3)多达4个独立通道:输入捕获,

输出比较,PWM生成(边缘或中间对齐模式),单脉冲模式输出。高级控制定时器框图见图4-23。(1)时基单元可编程高级控制定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。

时基单元包含:计数器寄存器(CounterRegister,TIMx_CNT)预分频器寄存器(PrescalerRegister,TIMx_PSC)自动装载寄存器(Auto-ReloadRegister,TIMx_ARR)重复次数寄存器(Repetitioncounterregister,TIMx_RCR)(2)向上计数模式

在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件。

(3)向下计数模式

在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。(4)中央对齐模式(向上/向下计数)在中央对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)−1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;然后再从0开始重新计数。在此模式下,不能写入TIMx_CR1中的DIR方向位。它由硬件更新并指示当前的计数方向。(5)重复计数器“时基单元”解释了计数器上溢/下溢时更新事件(updateevent,UEV)是如何产生的,然而事实上它只能在重复计数达到0的时候产生。这个特性对产生PWM信号非常有用。(6)时钟选择

计数器时钟可由下列时钟源提供:内部时钟(internalclock,CK_INT),等等。实验4-4Proteus或MDK仿真TIM1输出7个PWM本例说明如何配置TIM1外围设备以产生7个具有4个不同占空比的PWM信号。1.硬件设计

使用示波器可以显示TIM1波形,见图5-128,将TIM1引脚连接到示波器上,以监测不同的波形,STM32F10x的TIM1引脚如下:

TIM1_CH1引脚PA.08,TIM1_CH1N引脚PB.13。

TIM1_CH2引脚PA.09,TIM1_CH2N引脚PB.14。

TIM1_CH3引脚PA.10,TIM1_CH3N引脚PB.15。

TIM1_CH4引脚PA.11。2.软件设计(编程)(1)设计分析TIM1CLK固定为72MHz,TIM1Prescaler预分频等于0,TIM1_Period(TIM1_周期)=4095,因此使用的TIM1定时时钟72MHz时,TIM1频率=TIM1CLK/(TIM1_周期+1)=72MHz/(4095+1)=17.57kHz。TIM1CCR1寄存器值等于0x7FF=2047,因此TIM1通道1和互补通道1N产生频率等于17.57kHz、占空比等于以下值的PWM信号:TIM1通道1占空比=TIM1CCR1/(TIM1_周期+1)=2047/(4095+1)=50%。其它类推:TIM1通道2占空比=TIM1CCR2/(TIM1_周期+1)=1535/(4095+1)=37.5%。TIM1通道3占空比=TIM1CCR3/(TIM1_周期+1)=1023/(4095+1)=25%。TIM1通道4占空比=TIM1CCR4/(TIM1_周期+1)=511/(4095+1)=12.5%。关键程序段

/*TimeBaseconfiguration*/ //定时器时基设置

TIM_TimeBaseStructure.TIM_Prescaler=0;//设置时钟分频系数:不分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseStructure.TIM_Period=4095; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值,为4096次:当定时器从0计数到4095为一个定时周期TIM_TimeBaseStructure.TIM_ClockDivision=0;//时钟分割,为0不分割TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//设置周期计数器值,为0不重复TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); //定时器TIM1时基初始化/*配置定时器通道1、2、3、4输出引脚模式:复用推挽输出模式*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);/*Channel1,2,3and4ConfigurationinPWMmode*///定时器输出通道1、2、3、4配置为PWM模式TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; //模式配置:PWM模式2TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//输出状态设置:使能输出比较状态TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;//互补通道输出状态设置:使能输出TIM_OCInitStructure.TIM_Pulse=CCR1_Val;//设置了待装入捕获比较寄存器的脉冲值(0x0000和0xFFFF之间),当计数器计数到这个值时,电平发生跳变TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//TIM输出比较极性低,当定时器计数值小于CCR1_Val时为低电平TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;//TIM互补通道输出比较极性高TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;//当MOE=0设置TIM输出比较空闲状态T

温馨提示

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

最新文档

评论

0/150

提交评论