1、摘要摘要方波是一种非正弦曲线的波形,理想方波只有“高”和“低”这两个值。电流或电压的波形为矩形的信号即为矩形波信号,高电平在一个波形周期内占有的时间比值称为占空比,占空比为50%的矩形波称之为方波。通过STM32通用定时器TM2输入捕获管脚PA2捕获从PA6管脚产生的PWM波,而PWM波由STM32通用定时器TM3通道CH1产生,然后再由1602输出显示频率和占空比。关键字:输入捕获,PWM频率,捕获算法,复用推挽输出ABSTRACTABSTRACTSquare wave is a kind of non sinusoidal waveforms, ideal square wave only
2、 high and low these two values. Current or voltage waveform for rectangular signal is the rectangular wave signal, high level ratio in possession of a waveform cycle time is called duty cycle, duty ratio for 50% of the rectangular wave is called a square wave. Through the STM32 general timer TM2 inp
3、ut capture pin PA2 capture from PA6 tube feet to produce PWM wave, and PWM wave generated by the STM32 general timer TM3 channel CH1, then by 1602 output shows the frequency and duty ratio.Keywords: input capture,The PWM frequency,Capture algorithm,Reuse push-pull output目录目录第1章引言11.1选题背景11.2目标和意义11.
4、3实现思路21.3.1输入键盘的选择21.3.2显示屏的选择21.3.3原理和算法31.3.5 完成预估4第2章系统硬件设计52.1 STM32F103ZET6最小系统板52.2 4x4矩阵键盘62.3 1602液晶显示屏7第3章系统软件设计93.1主程序流程93.2.1输入捕获103.2.2 STM32 PWM波113.2.3通用定时器TM2/TM3133.2.4 STM32F103ZE的GPIO143.2.5外部中断163.3 STM32库函数解析183.4 STM32时钟配置22第4章系统调试284.1硬件调试284.1.1硬件的锡焊284.1.2硬件的总体连接294.2软件调试304.
5、2.1程序编写存在的问题304.2.2 程序的下载314.3用户操作34第5章总结35参考文献36致谢37附录38外文资料原文45译文46第1章引言第1章 引言1.1选题背景示波器、信号发生器、数控电源是电子类学习的必备工具,但这一类产品在市场上都价格不低,而我们学生只能依靠于学校实验室来学习,在一个纵观市场上信号发生器和示波器,一个产生一个捕获,于是便想到能否集于一身呢?可能有人会觉得在市场上这种设计没必要,但对于学生来说却是颇有些不方便之处,需要某些信号来驱动的时候就用于产生,而要观察某种信号时则用于显示频率,而万事从基础做起,方波信号:就是指电路系统中信号的质量,如果在要求的时间内,信号
6、能不失真地从源端传送到接收端,我们就称该信号是方波信号。方波最主要的用途就是为其他芯片提供时钟脉冲,特别是在数字电路中,在数字电路中都是以上升沿和下降沿控制的,方波边沿很陡峭,在数字系统中传输的都是方波。所以想到了用STM32来设置更为踏实而容易实现又不失研究的课题基于STM32的方波信号测试仪设计。1.2目标和意义在键盘上输入信号频率,并在1602上显示频率,接触这个课题时,以为要是键盘上直接输入数字然后再屏幕上显示不是作假吗?经过向老师和同学的求教,才得以明白,知道经过STM32上面产生,也同样在STM32S上显示,输入捕获显示输出会存在误差,是一个精度问题,实验意义在于测试STM32上产
7、生方波信号,在1602显示屏上输出的精度,而从捕获端也可转接到我们需要的某种频率的方波信号,不仅是方波的产生端,而且更为精准的确定其频率,在芯片选择上我选用了STM32F103ZE144管脚的,为以后扩展其他功能做预留。完成本系统要达到的效果:掌握相关电子电路、STM32基本理论知识和设计方法;熟悉信号产生的原理;完成信号发生器的外围电路设计;利用STM32完成信号频率的可调以及相关信息数据的显示。1电子科技大学成都学院本科毕业设计论文1.3实现思路而本系统用到的是PWM用当作捕获的信号,貌似自产自销的感觉,为什么不选择外部的例如函数发生器等产生的方波呢,事实上本系统可以测试函数发生器产生的方
8、波信号,一端接PA2捕获端,另一端接地,就能测出从函数发生器端产生的方波信号源,但是STM32最小系统板的功能较多,不管是从实质方便上或者从资源节约上,还是本题目想要达到的测试要求效果,所以选择用定时器产生PWM波,配置TM3的通道CH1,在PA6引脚输出,足以适用,在STM32 选择了GPIOD端口,每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分别控制每个端口的低八位和高八位,两个32位数据寄存器,(GPIOx_IDR,GPIOxODR)分别是输入数据寄存器和输出寄存器,本系统用到中断来,捕获信号的脉冲变化,并记录下时间,两次中断即为一次脉冲,在一个周期里
9、的占有比为占空比,矩阵键盘连接的GPIOD8-D15,而GPIOD0-D7,接的1602显示屏。1.3.1输入键盘的选择方案1:采用独立式按键。独立式按键硬件结构较为简单且电路配置也比较灵活,但是每个按键都会用到一个IO口。如果在按键数量比较多的时候,IO口的利用率不是很高,有点浪费。虽然程序编写比较简单,但是不适合本次设计。方案1:采用44矩阵式键盘。44矩阵式键盘虽然电路连接复杂,但是很有效地提高了单片机I/O口的利用率。由于矩阵式的排列方式使得按键排列的整齐,美观又耐用。像这次设计要用到的数字键盘就是需要这样的矩阵键盘。根据以上分析,本系统的设计需要多个按键,需要减少单片机I/O口的使用
10、,所以方案二4*4矩阵式键盘比较适合本设计。1.3.2显示屏的选择方案1: 1602是一个字符型液晶显示模块,一般应用于显示字母、数字、字符等符号型的显示。1602液晶显示屏还分为有背光和没有带背光两种。1602微功耗、体积小,越来越的到广泛的应用,像本次系统要求,实现的功能要求较低,只需要能够显示频率和占空比就可以,性价比高实用。2第1章引言方案2:虽然在最小系统板子上有TFT液晶显示屏的专门接口对应相应的驱动芯片,但是TFT价格相比要高些,相对会繁琐,性价比不高,唯一可能就是方便演示有视觉感好些罢了可视度及对比度,色彩还原能力对比,TFT传说中的三缺一屏,就是三个方向效果不错,一个方向效果
11、比较差,反应慢,不过它的聚焦性能良好,不会产生几何差错,不会闪屏。广泛用于低端和比较旧款的手机,本系统设计比较低端,两者的性能都能够到达要求。综上所述,选择价格更低廉1602作为显示模块,而且是带背光的。1.3.3原理和算法STM32最小板上利用定时器计数,TIM_Period计数值,比如键盘输入1MHZ,分频参数TIM_prescaler=3TIM_Period=17,APB1时钟是72MHZ,在本参数下,72MHZ/(17+1)/(3+1)=1MHZ。程序编写的就是键盘输入周期和预分频器的算法研究思路在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法:如果使用内部RC振荡
12、器而不使用外部晶振,请按照下面方法处理:对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。1.3.4系统框图图1-1系统框图3电子科技大学成都学院本科毕业设计论文系统流程概述:STM32是32位单片,相对于51单片机8位单片机具有很强大的功能模块,速度更快,功能更强大,有usb控制器,废除了51的机器周期。系统的电源采用USB数据线连接供电为:5V,波动开关,电源指示灯亮灯以及显示屏显示发出蓝光,按动最下系统板上的黄色复位,在矩阵键盘上输入要设置的PWM波的频率,在PA6输出,PA2外部中断捕获。达到的效果是输入频率,显示捕获的到的频率和占空比,可能会存在一定的误差。由于
13、STM32最小系统的功能较为强大,本系统用通用定时器TIM3来产生占空比为PWM波。用通用定时器TIM2作系统中断,捕获方波。最后通过PD管脚来在传输数据在1602液晶显示屏显示。1.3.5 完成预估材料准备,硬件来源,最小系统板,已经确定了型号及大小,然后就是上某宝选购最实惠的开发板,成本在60R币左右,同样在某宝上面淘两块1602的显示屏,成本在4R的样子,为什么选两块呢,其主要因素是心理作用,因为邮费比它贵了,加了一块,算是防止意外吧,后面还真用上派头了,说到这里你们会以为出现问题了吗?其实不然,而是送给有需要它的同学了。买了一个JINK下载器,用于下载软件的,外加40根杜邦线。学习资料
14、收集,学习STM32的固件库,以及安装调试软件,怎么使用Keil软件,阅读STM32F10x硬件文档和STM32 参考手册,从本源出发,方波怎么可以在最小系统板上产生,用到那些方面的管脚,定时器,中断等,网上查看具体例子。4第2章系统硬件设计第2章 系统硬件设计2.1STM32F103ZET6最小系统板微控制器STM32系列选择在芯片选择上我由于选题的要求,当然我们要把他的好处又是以及为甚要选择它的缘由在这里都意义说清楚第一:STM32,与51属于微控制器范畴,单片集成多种用于控制,通信,存储的外设。系统在程序的控制下执行。CPLD属于逻辑器件,按照程序,有一定智能程度。STm32运算速度、存
15、储容量远高于51单片机。第二:对于少于100脚的产品,有2种接法:第1种:OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能;第2种:分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出0。此方法可以减小功耗并(相对上面)节省2个外部电阻。第三:选择144管脚的系统板,第一,相对配置方便一点,512闪存的大一点,是为了今后有扩展的可能,管脚预留为以后实现功能更多,板子上有TFT液晶接口,本设计鉴于功能相对简单,所以没有用到TFT液晶显示屏,而是选了价格低实用的1602显示屏,足以满足实验设计要求,用到最小系统板上的GPIOA/GP
16、IOB/GPIOD引脚;黄色复位键,USB接口电路。第四:虽然在学校本身就有开设51单片机这门课程,这方面有一定基础又是,但是单片是基于寄存器操作的,所以在微机原理等方面要有很好的理解能力,为STM32 微控制器呢,纵观人类发展史,人类总是向着解放双交解放劳动力的方向前行,在这互联网时代,人们在不听的升级升华自己的大脑,解放大脑,放开思维逐渐向着这一趋势开放自我。在这里引用网络上对STM32和对51单片机的调侃,把它们分别比作地主和农民,51是农民,资源少,能力小;stm32是地主,财大气粗,资源丰富,速度快,所以在这里选STM32F103ZET6。5电子科技大学成都学院本科毕业设计论文2.2
17、 4x4矩阵键盘4x4矩阵键盘顾名思义他有16的按键,而本系统所涉及的频率输入只需要用到09数字,和一个清零/确认按键(SET),连线是PD8-PD15引脚工作的原理是:用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上,设置一个按键。而这样的按键中按键的个数是4 X 4个。这样的行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低
18、电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。图2-1按键原理按键的具体响应流程图初始化矩阵键盘要使用的GPIO口。GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; /定义PB8到PB11为上拉输入GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;定义PB12到PB15为下拉输入。图2-3按键流程图。6第2章系统硬件设计图2-2按键读取2.3 1602液晶显示屏标准的16口,第一引脚:VSS为电源地,第二引脚:VDD为正极5V,第三引脚:VO为液晶显示器对比度调整端,接正
19、极对比度最弱,接地对比度最高,然而对比度过高会产生“鬼影”,所以要加一个电位器来调整对比度,也就是用来改变电压的电阻,型号选用:ZOV 204-200k,第四引脚:RS为寄存器选择,高电平为1时选择数据寄存器,低电平0时选择指令寄存器,第五引脚:RW为读写信号线,高电平1时进行读操作;低电平0时进行写操作,第六引脚:E端为使能端,第七至第十四引脚为8位双向数据端,连接最小板的PD0PD7 IO,第1516:背光电源,15引脚背光正极,16引脚背光负极。模块最佳工作电压为5.0V,作电流为2.0mA(5.0V)、示容量为162个字符。基于STM32F103方波信号测试仪系统开机时就对LCD初始化
20、,然后读取单片机送出的freq:10K。第二行F:10K,D:50然后显示在显示屏上,完成对PWM的捕获并显示频率和占空比。如下图:237图2-3 1602功能显示图2-4,上面一排输入的是PWM波的频率,输入函数接收形参55,进入if语句进行计算,得出其周期,以及预分频数,也就是前面一直提到的主频除以周期再除以预分频值,得到的PWM的频率,最后在定时器3的通道CH1输出。本系统虽然都是调用的库函数,包括本节所提到的1602的程序也好,输入函数,中断库等,但是在这里还是要简单的贴上1602显示屏的指令集原理介绍:1602通过D0D7的8位数据端传输数据和指令:1.显示模式设置: (初始化)2.
21、0011 0000 0x38 设置162显示,57点阵,8位数据接口;3.显示开关及光标设置: (初始化)4.0000 1DCB D显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)5.0000 01NS N=1(读或写一个字符后地址指针加1 &光标加1),6.N=0(读或写一个字符后地址指针减1 &光标减1),7.S=1 且 N=1 (当写入一个字符后,整屏显示左移)8.s=0 当写入一个字符后,整屏显示不移动数据指针设置:数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)。第3章系统软件设计第3章 系统软件设计3.1主程序流程图3-1 主流程图系统的程序执
22、行从该流程图开始,第一步主要是配置系统时钟和管脚初始化,输入捕获都是实现在定时器上的,这里选用TIM2定时器中断捕获,初始化管脚,一般带两个参数,初值和分频数都是为了初始化通用寄存器,得到定时器的频率按键设置输出用于设置PWM的频率,在PA6引脚输出,在矩阵键盘上输入在设置的频率范围内由PA2引脚捕获在1602显示屏上输出。1602的使能端、RS寄存器选择、读写端RW分别由最小系统板子上的PB7/PB6/PB5控制。按键的输入,频率的捕获也好都是通过这3个端口来控制的。9第3章系统软件设计3.2.1输入捕获表3-1程序模块划分函数名函数功能参数GPIO端口无CLOCK时钟无TIM定时器无PWM
23、PWM波无EXTI外部中断无NVIC中断函数无main主函数模块无输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。STM32的输入捕获,简单的说就是通过检测“TIMx_CHx”上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值TIMx_CNT存放到对应的通道的捕获/比较寄存“TIMx_CCRx”里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA等.本次实验用到的是TIM2。TIM2捕获的原理是根据收到PWM波进入外部中断,例如:定时器开始计时第一次上升沿触发中断清零,假如第二次下降沿触发
24、中断记为t1第三次的时候记为t2根据占空比的概念得出算法,也就是两次中断即为一个脉冲,第二次中断除以周期就可以得到占空比。图3-2捕获的流程图11我们用到TIM2_CH1来捕获高电平脉宽,也就是要先设置输入捕获为上升沿检测,记录发生上升沿的时候TIM2_CNT的值。然后配置捕获信号为下降沿捕获,当下降沿到来时,发生捕获,并记录此时的TIM2_CNT值。这样,前后两次TIM5_之差,就是高电平的脉宽,同时TIM2的计数频率我们是知道的,从而可以计算出高电平脉宽的准确时间。第一次捕获是上升沿,第二次捕获时下降沿,必须在捕获上升沿之后,设置捕获边沿为下降沿,同时,如果脉宽比较长,那么定时器就会溢出,
25、对溢出必须做处理,否则结果就不准了。这两件事,我们都在中断里面做,所以必须开启捕获中断和更新中断。3.2.2 STM32 PWM波脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,由于STM32没有专门的PWM引脚,所以使用IO的复用模式,通用定时器TM2-TM5每个可以产生4路PWM(CH1-CH4),除了基本定时器6和定时器7,不能产生外,TM1和TM8高级定时器可产生多达7路PWM波, STM32最多可以同时产生30路PWM输出,这里我们仅利用TIM3的CH1产生一路PWM在PA6输出。图3-3 STM32的时钟分配此项功能:用来控制一个
26、输出波形指示一段给定的的时间已经到时。脉冲宽度调制模式产生的PWM信号由TIMx_ARR寄存器确定频率TIMx_CCRx寄存器确定占空比。11电子科技大学成都学院本科毕业设计论文要使STM32的通用定时器TIMx产生PWM输出,系统会用到3个寄存器,来控制PWM的。这三个寄存器分别是:捕获/比较模式寄存器(TIMx_CCMR1/2)捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR14)。(注意,还有个TIMx的ARR寄存器是用来控制PWM的输出频率)首先是捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有2个,TIMx _CCMR1和TIMx _CC
27、MR2。TIMx_CCMR1控制CH1和CH2,而TIMx_CCMR2控制CH3和CH4。其次是捕获/比较使能寄存器(TIMx_CCER),该寄存器控制着各个输入输出通道的开关。最后是捕获/比较寄存器(TIMx_CCR14),该寄存器总共有4个,对应4个输通道CH14。4个寄存器都差不多,说的简单一点,这个寄存器就是用来设置PWM的占空比的。(具体的各个寄存器的各个位,详见STM芯片手册。)TIM3频率=TIM3CLK/(TIM3_Period+1),由于通道输出占空比等于:TIM3_CCRx/(TIM3_Period+1);本系统只选择了TM3的CH1通道在PA6管脚输出,而且根据输入算法,
28、只做到了频率范围是110kHZ,自动重装载寄存器周期和预分频的算法duty=10000;fr=7200/freq;elseduty=10;fr=7200000/freq;/* Time base configuration 周期算法72M/2000=0.036M 0.036M=36000HZ 36000/720=50HZ 周期等于50HZ*/TIM_TimeBaseStructure.TIM_Period = duty-1; /设置在下一个更新事件。12第3章系统软件设计装入活动的自动重装载寄存器周期的值 /此处是重点,设定重的时间长度/TIM_Period设置了在下一个更新事件装入活动的自动
29、重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间TIM_TimeBaseStructure.TIM_Prescaler =fr-1; /设置用来作为TIMx时钟频率除数的预分频值/TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。它的取值必须在0x0000和0xFFFF之间TIM_TimeBaseStructure.TIM_ClockDivision = 0; /设置时钟分割:TDTS = Tck_timeTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /TIM向上计数模式,TIM_
30、CounterMode_DownTIM向下计数模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位。/* Output Compare Active Mode configuration: Channel1 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; /选择定时器模式:TIM脉冲宽度调制模式2TIM_OC3Init(TIM3,&TIM_OCInitStructure); /根据TIM_OCInitStruc
31、t中指定的参数初始化外设TIMxTIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); /使能TIMx在CCR1上的预装载寄存器TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; /PWM功能使能。3.2.3通用定时器TM2/TM3STM32 的通用定时器是一个通过可编程预分频器( PSC )驱动的 16 位自动装载计数器( CNT )构成。 STM32 的通用定时器可以被用于:测量输入信号的脉冲长度 ( 输入捕获 ) 或者产生输出波形 ( 输出比较和 PWM) 等。 STM32 的
32、每个通用定时器都是完全独立的,没有互相共享的任何资源。133.2.4STM32F103ZE的GPIOGPIO的简介:多达112多功能的双向IO口:80%的IO口利用率标准的I/O口可承受5V;IO口可以吸收25mA(总共可吸收150mA);18MHz翻转速度;可设置输出速度达到50MHz;多达21路模拟输入;可改变功能引脚如:USARTx、TIMx、I2Cx、SPIx、CAN、USB等;多达112个IO口可以设置为外部中断(同时可最多可有16个);可用于将MCU从待机模式唤醒(PA.0);可用作防入侵引脚(PC.13);所有的IO被分成7个端口(GPIOA.GPIOG);可对IO口的位进行位设
33、置或清除;锁定机制可以避免对IO口的寄存器的误写操:当对一个IO口的某一位进行锁定序列操作,该位的配置不再可能被修改,直到下一次复位。STM32每个引脚都有8种配置模式:浮空输入上拉输入下拉输入模拟输入推挽输出开漏输出复用推挽输出复用开漏输出本系统用到复用功能的推挽输出 AF_PP片内外设功能,因为是串口不在时普通的IO口所以复用,因为没接上拉电阻所以推挽。因为TX为发送数据端口所以输出。定时器的时钟来源有 4个:(1)内部时钟(CK_INT)(2)外部时钟模式 1 :外部输入脚(TIx)(3)外部时钟模式 2 :外部触发输入(ETR)(4)内部触发输入(ITRx):使用A定时器作为B定时器的
34、预分频器(A为B提供时钟)。这些时钟,具体选择哪个可以通过“TIMx_SMCR”寄存器的相关位来设置。这里的“CK_INT”时钟是从“APB1”倍频的来的,除非“APB1”的时钟分频数设置为1,否则通用定时器“TIMx”的时钟是“APB1”时钟的2倍,当APB1的时钟不分频的时候,通用定时器“TIMx”的时钟就等于“APB1”的时钟。第3章系统软件设计定时器的时钟来源有 4个:(1)内部时钟(CK_INT)(2)外部时钟模式 1 :外部输入脚(TIx)(3)外部时钟模式 2 :外部触发输入(ETR)(4)内部触发输入(ITRx):使用A定时器作为B定时器的预分频器(A为B提供时钟)。这些时钟,
35、具体选择哪个可以通过“TIMx_SMCR”寄存器的相关位来设置。这里的“CK_INT”时钟是从“APB1”倍频的来的,除非“APB1”的时钟分频数设置为1,否则通用定时器“TIMx”的时钟是“APB1”时钟的2倍,当APB1的时钟不分频的时候,通用定时器“TIMx”的时钟就等于“APB1”的时钟。void RCC_Configuration(void)SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE| RCC_APB2Periph_AFIO, EN
36、ABLE); /使能GPIO外设和AFIO复用功能模块时钟使能TIMx_CNT 寄存器,该寄存器是定时器的计数器,该寄存器存储了当前定时器的计数值。自动重装载寄存器( TIMx_ARR ),该寄存器在物理上实际对应着2个寄存器。TIMx_CNT 寄存器,该寄存器是定时器的计数器,该寄存器存储了当前定时器的计数值。一个是程序员可以直接操作的,另外一个是程序员看不到的,这个看不到的寄存器在 STM32 参考手册里面被叫做影子寄存器。事实上真正起作用的是影子寄存器。根据 TIMx_CR1 寄存器中 APRE 位的设置:APRE=0 时,预装载寄存器的内容可以随时传送到影子寄存器,此时 2 者是连通的
37、;而 APRE=1 时,在每一次更新事件( UEV )时,才把预装在寄存器的内容传送到影子寄存器。15第3章系统软件设计3.2.5外部中断中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大大增加,而且中断的设置也更加复杂。基本概念:ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit
38、中的高4位。STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器。4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。按照这种分组,4bit一共可以分成5组第0组:所有4bit用于指定响应优先级;第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;第3
39、组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;第4组:所有4位用于指定抢占式优先级。所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。每一个中断源都必须定义2个优先级。17第
40、3章系统软件设计使用外部中断的基本步骤如下:1.设置好相应的时钟;2.设置相应的中断;3.IO口初始化;4.把相应的IO口设置为中断线路(要在设置外部中断之前)并初始化;5.在选择的中断通道的响应函数中中断函数。说说本系统中的中断,中断用来捕获方波的电平变化,一个脉冲相当于有两次中断。图3-4外部中断对于中断的控制,STM32有一个专用的管理机构:NVICSTM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和
41、sub优先级,在STM32的固件库中定义如下#define NVIC_PriorityGroup_0 (u32)0x700)#define NVIC_PriorityGroup_1 (u32)0x600)17第3章系统软件设计#define NVIC_PriorityGroup_2 (u32)0x500)#define NVIC_PriorityGroup_3 (u32)0x400)#define NVIC_PriorityGroup_4 (u32)0x300)图3-5 外部中断/架构框图表3-2外部中断寄存器寄存器描述IMR中断屏蔽寄存器EMR事件屏蔽寄存器RTSR上升沿触发选择寄存器FTS
42、R下降沿触发选择寄存器SWIR软件中断事件寄存器PR挂起寄存器3.3STM32库函数解析意法半导体在推出STM32微控制器之初的同时提供了一套完整细致的固件开发包,里面包含了STM32开发过程中所涉及到的所有底层操作,通过在C语言程序中引入这样的固件开发包,可以使开发人员或者学习工作者等从复杂底层寄19存器操作中解放出来,将精力专注应用程序的开发上,在差错漏方面可以缩小范围,做到专一,这便是ST推出这样一个开发包的初衷,我想,正是因为开发商的这种为使用学习的这一用户群体的细致考虑,所以它会在微控制器业内占有重要地位。对于大多数人,相比和我一样,当然在51单片机我学的并不是很深入,学习STM32
43、都会有一个不适应的过程,那就是程序开发不在从寄存器层次开始,那些什么堆栈操作物理地址等,那问题来了我们从什么角度出发呢,也就是起始点在哪。咨询过很多人,有老师有学习过同学,首先要先去熟悉STM32所提供的固件库,那还是否一定使用固件库呢?必然没有绝对之事,但STM32微控制器的寄存器规模不是常见8位单片机可以比拟的,假如花大把时间仔细琢磨众多寄存器的意义,先不说顺利与否,这里的顺利是指学习者在寄存器方面有不错的理解基础与经验,时间都浪费在这方面上了,那还谈何存在开发商所说的优势与初衷呢!在这里引用EEPW的用户名为Albertgreenabc网友,库函数解析部分资源。以最常见的本系统也用到GP
44、IO设备的初始化函数为例,如下程序:GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_GPIO_pin=GPIO_pin_6; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50Mhz ; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOA,&GPIO_InitStructure); 首先是该语句显然定义了一个 GPIO_InitTypeDef 类型的变量名为 GPIO_InitStructure GPIO_Ini
45、tTypeDef 的原型位于“stm32f10x_gpio.h”文件,原型如下:typedef struct u16 GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed;GPIOMode_TypeDef GPIO_Mode;GPIO_InitTypeDef;19电子科技大学成都学院本科毕业设计论文可知 GPIO_InitTypeDef 是一个结构体类型同义字,其功能是定义一个结构体,该结构体有三个成员分别是 u16 类型的GPIO_Pin、GPIOSpeed_TypeDef 类型的 GPIO_SpeedGPIOMode_TypeDef 类型的 GPIO_Mode 。继
46、续探查GPIOSpeed_TypeDef 和 GPIOMode_TypeDef 类型,在“stm32f10x_gpio.h”文件中找到对 GPIOSpeed_TypeDef 的定义:typedefenum GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHzGPIOSpeed_TypeDef; 则可知 GPIOSpeed_TypeDef 枚举类型同一只,其功能是定义一个枚举类型变量,该变量可表示 GPIO_Speed_10MHz、GPIO_Speed_2MHz 和 GPIO_Speed_50MHz 三个含义(其中 GPIO_Speed_
47、10MHz 已经定义为 1,读者必须知道 GPIO_Speed_2MHz 则依次被编译器赋予 2,而 GPIO_Speed_50MHz 为 3)。同样也在“stm32f10x_gpio.h”文件中找到对 GPIOMode_TypeDef 的定义:Typedef enumGPIO_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=0