版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、摘要方波是一种非正弦曲线的波形,理想方波只有“高和“低这两个值。电流或电压的波形为矩形的信号即为矩形波信号,高电平在一个波形周期内占有的时间比值称为占空比,占空比为50%的矩形波称之为方波。通过STM32通用定时器TM2输入捕获管脚PA2捕获从PA6管脚产生的PWM波,而PWM波由STM32通用定时器TM3通道CH1产生,然后再由1602输出显示频率和占空比。关键字:输入捕获,PWM频率,捕获算法,复用推挽输出ABSTRACTSquare wave is a kind of non sinusoidal waveforms, ideal square wave only "high&
2、quot; 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 t
3、imer TM2 input 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章引言1选题背景1目标和意
4、义1实现思路2输入键盘的选择2显示屏的选择2原理和算法31.3.5 完成预估4第2章系统硬件设计5 STM32F103ZET6最小系统板52.2 4x4矩阵键盘62.3 1602液晶显示屏7第3章系统软件设计9主程序流程9输入捕获103.2.2 STM32 PWM波11通用定时器TM2/TM3133.2.4 STM32F103ZE的GPIO14外部中断16 STM32库函数解析18 STM32时钟配置22第4章系统调试28硬件调试28硬件的锡焊28硬件的总体连接29软件调试30程序编写存在的问题304.2.2 程序的下载31用户操作34第5章总结35参考文献36致谢37附录38外文资料原文45
5、译文46第1章 引言1.1选题背景示波器、信号发生器、数控电源是电子类学习的必备工具,但这一类产品在市场上都价格不低,而我们学生只能依靠于学校实验室来学习,在一个纵观市场上信号发生器和示波器,一个产生一个捕获,于是便想到能否集于一身呢?可能有人会觉得在市场上这种设计没必要,但对于学生来说却是颇有些不方便之处,需要某些信号来驱动的时候就用于产生,而要观察某种信号时那么用于显示频率,而万事从根底做起,方波信号:就是指电路系统中信号的质量,如果在要求的时间内,信号能不失真地从源端传送到接收端,我们就称该信号是方波信号。方波最主要的用途就是为其他芯片提供时钟脉冲,特别是在数字电路中,在数字电路中都是以
6、上升沿和下降沿控制的,方波边沿很陡峭,在数字系统中传输的都是方波。所以想到了用STM32来设置更为踏实而容易实现又不失研究的课题基于STM32的方波信号测试仪设计。目标和意义在键盘上输入信号频率,并在1602上显示频率,接触这个课题时,以为要是键盘上直接输入数字然后再屏幕上显示不是作假吗?经过向老师和同学的求教,才得以明白,知道经过STM32上面产生,也同样在STM32S上显示,输入捕获显示输出会存在误差,是一个精度问题,实验意义在于测试STM32上产生方波信号,在1602显示屏上输出的精度,而从捕获端也可转接到我们需要的某种频率的方波信号,不仅是方波的产生端,而且更为精准确实定其频率,在芯片
7、选择上我选用了STM32F103ZE144管脚的,为以后扩展其他功能做预留。完本钱系统要到达的效果:掌握相关电子电路、STM32根本理论知识和设计方法;熟悉信号产生的原理;完成信号发生器的外围电路设计;利用STM32完成信号频率的可调以及相关信息数据的显示。实现思路而本系统用到的是PWM用当作捕获的信号,貌似自产自销的感觉,为什么不选择外部的例如函数发生器等产生的方波呢,事实上本系统可以测试函数发生器产生的方波信号,一端接PA2捕获端,另一端接地,就能测出从函数发生器端产生的方波信号源,但是STM32最小系统板的功能较多,不管是从实质方便上或者从资源节约上,还是此题目想要到达的测试要求效果,所
8、以选择用定时器产生PWM波,配置TM3的通道CH1,在PA6引脚输出,足以适用,在STM32 选择了GPIOD端口,每个GPIO端口有两个32位配置存放器GPIOx_CRL,GPIOx_CRH分别控制每个端口的低八位和高八位,两个32位数据存放器,GPIOx_IDR,GPIOxODR分别是输入数据存放器和输出存放器,本系统用到中断来,捕获信号的脉冲变化,并记录下时间,两次中断即为一次脉冲,在一个周期里的占有比为占空比,矩阵键盘连接的GPIOD8-D15,而GPIOD0-D7,接的1602显示屏。输入键盘的选择方案1:采用独立式按键。独立式按键硬件结构较为简单且电路配置也比较灵活,但是每个按键都
9、会用到一个IO口。如果在按键数量比较多的时候,IO口的利用率不是很高,有点浪费。虽然程序编写比较简单,但是不适合本次设计。方案1:采用4×4矩阵式键盘。4×4矩阵式键盘虽然电路连接复杂,但是很有效地提高了单片机I/O口的利用率。由于矩阵式的排列方式使得按键排列的整齐,美观又耐用。像这次设计要用到的数字键盘就是需要这样的矩阵键盘。根据以上分析,本系统的设计需要多个按键,需要减少单片机I/O口的使用,所以方案二4*4矩阵式键盘比较适合本设计。显示屏的选择方案1: 1602是一个字符型液晶显示模块,一般应用于显示字母、数字、字符等符号型的显示。1602液晶显示屏还分为有背光和没有
10、带背光两种。1602微功耗、体积小,越来越的到广泛的应用,像本次系统要求,实现的功能要求较低,只需要能够显示频率和占空比就可以,性价比高实用。方案2:虽然在最小系统板子上有TFT液晶显示屏的专门接口对应相应的驱动芯片,但是TFT价格相比要高些,相对会繁琐,性价比不高,唯一可能就是方便演示有视觉感好些罢了可视度及比照度,色彩复原能力比照,TFT传说中的三缺一屏,就是三个方向效果不错,一个方向效果比较差,反响慢,不过它的聚焦性能良好,不会产生几何过失,不会闪屏。广泛用于低端和比较旧款的 ,本系统设计比较低端,两者的性能都能够到达要求。综上所述,选择价格更低廉1602作为显示模块,而且是带背光的。1
11、.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振荡器而不使用外部晶振,请按照下面方法处理:对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。1.3.4系统框图图1-1系统框图系统流程概述:STM32是32位单片,相对于51单片机8位单
12、片机具有很强大的功能模块,速度更快,功能更强大,有usb控制器,废除了51的机器周期。系统的电源采用USB数据线连接供电为:5V,波动开关,电源指示灯亮灯以及显示屏显示发出蓝光,按动最下系统板上的黄色复位,在矩阵键盘上输入要设置的PWM波的频率,在PA6输出,PA2外部中断捕获。到达的效果是输入频率,显示捕获的到的频率和占空比,可能会存在一定的误差。由于STM32最小系统的功能较为强大,本系统用通用定时器TIM3来产生占空比为PWM波。用通用定时器TIM2作系统中断,捕获方波。最后通过PD管脚来在传输数据在1602液晶显示屏显示。1.3.5 完成预估材料准备,硬件来源,最小系统板,已经确定了型
13、号及大小,然后就是上某宝选购最实惠的开发板,本钱在60R币左右,同样在某宝上面淘两块1602的显示屏,本钱在4R的样子,为什么选两块呢,其主要因素是心理作用,因为邮费比它贵了,加了一块,算是防止意外吧,后面还真用上派头了,说到这里你们会以为出现问题了吗?其实不然,而是送给有需要它的同学了。买了一个JINK下载器,用于下载软件的,外加40根杜邦线。学习资料收集,学习STM32的固件库,以及安装调试软件,怎么使用Keil软件,阅读STM32F10x硬件文档和STM32 参考手册,从根源出发,方波怎么可以在最小系统板上产生,用到那些方面的管脚,定时器,中断等,网上查看具体例子。第2章 系统硬件设计S
14、TM32F103ZET6最小系统板微控制器STM32系列选择在芯片选择上我由于选题的要求,当然我们要把他的好处又是以及为甚要选择它的缘由在这里都意义说清楚第一:STM32,与51属于微控制器范畴,单片集成多种用于控制,通信,存储的外设。系统在程序的控制下执行。CPLD属于逻辑器件,按照程序,有一定智能程度。STm32运算速度、存储容量远高于51单片机。第二:对于少于100脚的产品,有2种接法:第1种:OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能;第2种:分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'
15、;。此方法可以减小功耗并相对上面节省2个外部电阻。第三:选择144管脚的系统板,第一,相对配置方便一点,512闪存的大一点,是为了今后有扩展的可能,管脚预留为以后实现功能更多,板子上有TFT液晶接口,本设计鉴于功能相对简单,所以没有用到TFT液晶显示屏,而是选了价格低实用的1602显示屏,足以满足实验设计要求,用到最小系统板上的GPIOA/GPIOB/GPIOD引脚;黄色复位键,USB接口电路。第四:虽然在学校本身就有开设51单片机这门课程,这方面有一定根底又是,但是单片是基于存放器操作的,所以在微机原理等方面要有很好的理解能力,为STM32 微控制器呢,纵观人类开展史,人类总是向着解放双交解
16、放劳动力的方向前行,在这互联网时代,人们在不听的升级升华自己的大脑,解放大脑,放开思维逐渐向着这一趋势开放自我。在这里引用网络上对STM32和对51单片机的调侃,把它们分别比作地主和农民,51是农民,资源少,能力小;stm32是地主,财大气粗,资源丰富,速度快,所以在这里选STM32F103ZET6。2.2 4x4矩阵键盘4x4矩阵键盘顾名思义他有16的按键,而本系统所涉及的频率输入只需要用到09数字,和一个清零/确认按键SET,连线是PD8-PD15引脚工作的原理是:用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上,设置一个按键。而这样的按键中按键的个数是4
17、 X 4个。这样的行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口那么作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,那么输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。图2-1按键原理按键的具体响应流程图初始化矩阵键盘要使用的GPIO口。GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; /定义PB8到PB11为上拉输入GPI
18、O_InitStructure.GPIO_Mode=GPIO_Mode_IPD;定义PB12到PB15为下拉输入。图2-3按键流程图。图2-2按键读取2.3 1602液晶显示屏标准的16口,第一引脚:VSS为电源地,第二引脚:VDD为正极5V,第三引脚:VO为液晶显示器比照度调整端,接正极比照度最弱,接地比照度最高,然而比照度过高会产生“鬼影,所以要加一个电位器来调整比照度,也就是用来改变电压的电阻,型号选用:ZOV 204-200k,第四引脚:RS为存放器选择,高电平为1时选择数据存放器,低电平0时选择指令存放器,第五引脚:RW为读写信号线,高电平1时进行读操作;低电平0时进行写操作,第六引
19、脚:E端为使能端,第七至第十四引脚为8位双向数据端,连接最小板的PD0PD7 IO,第1516:背光电源,15引脚背光正极,16引脚背光负极。模块最正确工作电压为,作电流为、示容量为16×2个字符。基于STM32F103方波信号测试仪系统开机时就对LCD初始化,然后读取单片机送出的freq:10K。第二行F:10K,D:50然后显示在显示屏上,完成对PWM的捕获并显示频率和占空比。如下列图:23图2-3 1602功能显示图2-4,上面一排输入的是PWM波的频率,输入函数接收形参55,进入if语句进行计算,得出其周期,以及预分频数,也就是前面一直提到的主频除以周期再除以预分频值,得到的
20、PWM的频率,最后在定时器3的通道CH1输出。本系统虽然都是调用的库函数,包括本节所提到的1602的程序也好,输入函数,中断库等,但是在这里还是要简单的贴上1602显示屏的指令集原理介绍:1602通过D0D7的8位数据端传输数据和指令:1.显示模式设置: (初始化)2.0011 0000 0x38 设置16×2显示,5×7点阵,8位数据接口;3.显示开关及光标设置: (初始化)4.0000 1DCB D显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)5.0000 01NS N=1(读或写一个字符后地址指针加1 &光标加1),6.N=0(读或写一个字符后地址
21、指针减1 &光标减1),7.S=1 且 N=1 (当写入一个字符后,整屏显示左移)8.s=0 当写入一个字符后,整屏显示不移动数据指针设置:数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)。第3章 系统软件设计主程序流程图3-1 主流程图系统的程序执行从该流程图开始,第一步主要是配置系统时钟和管脚初始化,输入捕获都是实现在定时器上的,这里选用TIM2定时器中断捕获,初始化管脚,一般带两个参数,初值和分频数都是为了初始化通用存放器,得到定时器的频率按键设置输出用于设置PWM的频率,在PA6引脚输出,在矩阵键盘上输入在设置的频率范围内由PA2引脚捕获在1602显
22、示屏上输出。1602的使能端、RS存放器选择、读写端RW分别由最小系统板子上的PB7/PB6/PB5控制。按键的输入,频率的捕获也好都是通过这3个端口来控制的。输入捕获表3-1程序模块划分函数名函数功能参数GPIO端口无CLOCK时钟无TIM定时器无PWMPWM波无EXTI外部中断无NVIC中断函数无main主函数模块无输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。STM32的输入捕获,简单的说就是通过检测“TIMx_CHx上的边沿信号,在边沿信号发生跳变比方上升沿/下降沿的时候,将当前定时器的值TIMx_CNT存放到对应
23、的通道的捕获/比较存放“TIMx_CCRx里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA等.本次实验用到的是TIM2。TIM2捕获的原理是根据收到PWM波进入外部中断,例如:定时器开始计时第一次上升沿触发中断清零,假设第二次下降沿触发中断记为t1第三次的时候记为t2根据占空比的概念得出算法,也就是两次中断即为一个脉冲,第二次中断除以周期就可以得到占空比。图3-2捕获的流程图我们用到TIM2_CH1来捕获高电平脉宽,也就是要先设置输入捕获为上升沿检测,记录发生上升沿的时候TIM2_CNT的值。然后配置捕获信号为下降沿捕获,当下降沿到来时,发生捕获,并记录此时的TIM2_CNT值。这
24、样,前后两次TIM5_之差,就是高电平的脉宽,同时TIM2的计数频率我们是知道的,从而可以计算出高电平脉宽的准确时间。第一次捕获是上升沿,第二次捕获时下降沿,必须在捕获上升沿之后,设置捕获边沿为下降沿,同时,如果脉宽比较长,那么定时器就会溢出,对溢出必须做处理,否那么结果就不准了。这两件事,我们都在中断里面做,所以必须开启捕获中断和更新中断。3.2.2 STM32 PWM波脉冲宽度调制(PWM),是英文“Pulse Width Modulation的缩写,简称脉宽调制,由于STM32没有专门的PWM引脚,所以使用IO的复用模式,通用定时器TM2-TM5每个可以产生4路PWMCH1-CH4,除了
25、根本定时器6和定时器7,不能产生外,TM1和TM8高级定时器可产生多达7路PWM波, STM32最多可以同时产生30路PWM输出,这里我们仅利用TIM3的CH1产生一路PWM在PA6输出。图3-3 STM32的时钟分配此项功能:用来控制一个输出波形指示一段给定的的时间已经到时。脉冲宽度调制模式产生的PWM信号由TIMx_ARR存放器确定频率TIMx_CCRx存放器确定占空比。要使STM32的通用定时器TIMx产生PWM输出,系统会用到3个存放器,来控制PWM的。这三个存放器分别是:捕获/比较模式存放器TIMx_CCMR1/2捕获/比较使能存放器TIMx_CCER、捕获/比较存放器TIMx_CC
26、R14。注意,还有个TIMx的ARR存放器是用来控制PWM的输出频率首先是捕获/比较模式存放器TIMx_CCMR1/2,该存放器总共有2个,TIMx _CCMR1和TIMx _CCMR2。TIMx_CCMR1控制CH1和CH2,而TIMx_CCMR2控制CH3和CH4。其次是捕获/比较使能存放器TIMx_CCER,该存放器控制着各个输入输出通道的开关。最后是捕获/比较存放器TIMx_CCR14,该存放器总共有4个,对应4个输通道CH14。4个存放器都差不多,说的简单一点,这个存放器就是用来设置PWM的占空比的。具体的各个存放器的各个位,详见STM芯片手册。TIM3频率=TIM3CLK/(TIM
27、3_Period+1),由于通道输出占空比等于:TIM3_CCRx/(TIM3_Period+1);本系统只选择了TM3的CH1通道在PA6管脚输出,而且根据输入算法,只做到了频率范围是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; /
28、设置在下一个更新事件。装入活动的自动重装载存放器周期的值 /此处是重点,设定重的时间长度/TIM_Period设置了在下一个更新事件装入活动的自动重装载存放器周期的值。它的取值必须在0x0000和0xFFFF之间TIM_TimeBaseStructure.TIM_Prescaler =fr-1; /设置用来作为TIMx时钟频率除数的预分频值/TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。它的取值必须在0x0000和0xFFFF之间TIM_TimeBaseStructure.TIM_ClockDivision = 0; /设置时钟分割:TDTS = Tck_timeTI
29、M_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /TIM向上计数模式,TIM_CounterMode_DownTIM向下计数模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位。/* Output Compare Active Mode configuration: Channel1 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; /选
30、择定时器模式:TIM脉冲宽度调制模式2TIM_OC3Init(TIM3,&TIM_OCInitStructure); /根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); /使能TIMx在CCR1上的预装载存放器TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; /PWM功能使能。通用定时器TM2/TM3STM32 的通用定时器是一个通过可编程预分频器 PSC 驱动的 16 位自动装载计数器 CNT 构成。
31、 STM32 的通用定时器可以被用于:测量输入信号的脉冲长度 ( 输入捕获 ) 或者产生输出波形 ( 输出比较和 PWM) 等。 STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。STM32F103ZE的GPIOGPIO的简介:多达112多功能的双向IO口:80%的IO口利用率标准的I/O口可承受5V;IO口可以吸收25mA(总共可吸收150mA);18MHz翻转速度;可设置输出速度到达50MHz;多达21路模拟输入;可改变功能引脚如:USARTx、TIMx、I2Cx、SPIx、CAN、USB等;多达112个IO口可以设置为外部中断(同时可最多可有16个);可用于将MCU从待
32、机模式唤醒(PA.0);可用作防入侵引脚(PC.13);所有的IO被分成7个端口(GPIOA.GPIOG);可对IO口的位进行位设置或去除;锁定机制可以防止对IO口的存放器的误写操:当对一个IO口的某一位进行锁定序列操作,该位的配置不再可能被修改,直到下一次复位。STM32每个引脚都有8种配置模式:浮空输入上拉输入下拉输入模拟输入推挽输出开漏输出复用推挽输出复用开漏输出本系统用到复用功能的推挽输出 AF_PP片内外设功能,因为是串口不在时普通的IO口所以复用,因为没接上拉电阻所以推挽。因为TX为发送数据端口所以输出。定时器的时钟来源有 4个:(1)内部时钟CK_INT(2)外部时钟模式 1 :
33、外部输入脚TIx(3)外部时钟模式 2 :外部触发输入ETR(4)内部触发输入ITRx:使用A定时器作为B定时器的预分频器A为B提供时钟。这些时钟,具体选择哪个可以通过“TIMx_SMCR存放器的相关位来设置。这里的“CK_INT时钟是从“APB1倍频的来的,除非“APB1的时钟分频数设置为1,否那么通用定时器“TIMx的时钟是“APB1时钟的2倍,当APB1的时钟不分频的时候,通用定时器“TIMx的时钟就等于“APB1的时钟。定时器的时钟来源有 4个:(1)内部时钟CK_INT(2)外部时钟模式 1 :外部输入脚TIx(3)外部时钟模式 2 :外部触发输入ETR(4)内部触发输入ITRx:使
34、用A定时器作为B定时器的预分频器A为B提供时钟。这些时钟,具体选择哪个可以通过“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| R
35、CC_APB2Periph_AFIO, ENABLE); /使能GPIO外设和AFIO复用功能模块时钟使能TIMx_CNT 存放器,该存放器是定时器的计数器,该存放器存储了当前定时器的计数值。自动重装载存放器 TIMx_ARR ,该存放器在物理上实际对应着2个存放器。TIMx_CNT 存放器,该存放器是定时器的计数器,该存放器存储了当前定时器的计数值。一个是程序员可以直接操作的,另外一个是程序员看不到的,这个看不到的存放器在? STM32 参考手册?里面被叫做影子存放器。事实上真正起作用的是影子存放器。根据 TIMx_CR1 存放器中 APRE 位的设置:APRE=0 时,预装载存放器的内容可
36、以随时传送到影子存放器,此时 2 者是连通的;而 APRE=1 时,在每一次更新事件 UEV 时,才把预装在存放器的内容传送到影子存放器。外部中断中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大大增加,而且中断的设置也更加复杂。根本概念:ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个16个内部+68个外部,还有16级可编程的中断优先级的设置,仅使用中断优先级设置8b
37、it中的高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位用于指定响应优先级;
38、第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;第4组:所有4位用于指定抢占式优先级。所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,那么中断控制器根据他们的响应优先级上下来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,那么根据他们在中断表中的排位顺序决定先处理哪一个。每一个中断源都必须定义2个优先级
39、。使用外部中断的根本步骤如下:1.设置好相应的时钟;2.设置相应的中断;口初始化;4.把相应的IO口设置为中断线路要在设置外部中断之前并初始化;5.在选择的中断通道的响应函数中中断函数。说说本系统中的中断,中断用来捕获方波的电平变化,一个脉冲相当于有两次中断。图3-4外部中断对于中断的控制,STM32有一个专用的管理机构:NVICSTM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)存放器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32
40、的固件库中定义如下#define NVIC_PriorityGroup_0 (u32)0x700)#define NVIC_PriorityGroup_1 (u32)0x600)#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上升沿触发选择存放器FTSR下降沿触发选择存放器SWIR软件中断事件存放器
41、PR挂起存放器STM32库函数解析意法半导体在推出STM32微控制器之初的同时提供了一套完整细致的固件开发包,里面包含了STM32开发过程中所涉及到的所有底层操作,通过在C语言程序中引入这样的固件开发包,可以使开发人员或者学习工作者等从复杂底层寄存器操作中解放出来,将精力专注应用程序的开发上,在过失漏方面可以缩小范围,做到专一,这便是ST推出这样一个开发包的初衷,我想,正是因为开发商的这种为使用学习的这一用户群体的细致考虑,所以它会在微控制器业内占有重要地位。对于大多数人,相比和我一样,当然在51单片机我学的并不是很深入,学习STM32都会有一个不适应的过程,那就是程序开发不在从存放器层次开始
42、,那些什么堆栈操作物理地址等,那问题来了我们从什么角度出发呢,也就是起始点在哪。咨询过很多人,有老师有学习过同学,首先要先去熟悉STM32所提供的固件库,那还是否一定使用固件库呢?必然没有绝对之事,但STM32微控制器的存放器规模不是常见8位单片机可以比较的,假设花大把时间仔细琢磨众多存放器的意义,先不说顺利与否,这里的顺利是指学习者在存放器方面有不错的理解根底与经验,时间都浪费在这方面上了,那还谈何存在开发商所说的优势与初衷呢!在这里引用EEPW的用户名为Albertgreenabc网友,库函数解析局部资源。以最常见的本系统也用到GPIO设备的初始化函数为例,如下程序:GPIO_InitTy
43、peDef GPIO_InitStructure; GPIO_InitStructure.GPIO_GPIO_pin=GPIO_pin_6; peed=GPIO_Speed_50Mhz ; ode=GPIO_Mode_Out_PP; GPIO_Init(GPIOA,&GPIO_InitStructure); 首先是该语句显然定义了一个 GPIO_InitTypeDef 类型的变量名为 GPIO_InitStructure GPIO_InitTypeDef 的原型位于“文件,原型如下:typedef struct u16 GPIO_Pin; GPIOSpeed_TypeDef GPIO_
44、Speed;GPIOMode_TypeDef GPIO_Mode;GPIO_InitTypeDef;可知 GPIO_InitTypeDef 是一个结构体类型同义字,其功能是定义一个结构体,该结构体有三个成员分别是 u16 类型的GPIO_Pin、GPIOSpeed_TypeDef 类型的 GPIO_SpeedGPIOMode_TypeDef 类型的 GPIO_Mode 。继续探查GPIOSpeed_TypeDef 和 GPIOMode_TypeDef 类型,在“文件中找到对 GPIOSpeed_TypeDef 的定义:typedefenum GPIO_Speed_10MHz = 1, GPIO
45、_Speed_2MHz, GPIO_Speed_50MHzGPIOSpeed_TypeDef; 那么可知 GPIOSpeed_TypeDef 枚举类型同一只,其功能是定义一个枚举类型变量,该变量可表示 GPIO_Speed_10MHz、GPIO_Speed_2MHz 和 GPIO_Speed_50MHz 三个含义其中 GPIO_Speed_10MHz 已经定义为 1,读者必须知道 GPIO_Speed_2MHz 那么依次被编译器赋予 2,而 GPIO_Speed_50MHz 为 3。同样也在“文件中找到对 GPIOMode_TypeDef 的定义:Typedef enumGPIO_Mode_A
46、IN=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;这个一样是个枚举类型同义字,其成员有GPIO_Mode_AIN、GPIO_Mode_AF_PP等也可以很容易判断出表示GPIO设备的工作模式。对解析可以做一个总结:该定义一个结构体类型的变量GPIO_InitStrucure,并且该结构体有三个必备的
47、成员,分别为:GPIO_Pin、GPIO_Speed和GPIO_Mode,并且_Pin表示GPIO设备引脚_Speed表示GPIO设备速率和_Mode表示GPIO设备工作模式。紧接着是,此语句是一个赋值语句,把GPIO_Pin_4赋值给GPIO_InitStructure结构体的成员GPIO_Pin,可以在“stm32f103x_gpio.h文件中找到GPIO_Pin_6做的宏定义:#define GPIO_Pin_6 (u16)0x0010)因此的本质是将16位数0x0010赋给GPIO结构成员GPIO_Pin。语句和相似,将GPIO_Speed_50MHZ赋值结构体中的成员GPIO_Spe
48、ed,但是注意到此处GPIO_Speed_50MHZ只是一个枚举变量,并非某个值。和亦相似,不再陈述,是一个函数调用,即调用GPIO_Init函数,并提供应该函数2个参数,分别为GPIOA和&GPIO_InitStructure,可以理解为形参;其中&GPIO_InitStructure表示结构体变量GPIO_InitStructure的地址,而GPIOA那么在“文件中找到定义:#ifdef_GPIOA #define GPIOA (GPIO_TypeDef*)GPIOA_BASE)#endif此三行代码是一个预编译结构,首先判断是否认义了宏_GPIOA。可以在“中发现对_GP
49、IO的定义为: #define_GPIOA这表示编译器会将代码中出现的GPIOA全部替换为GPIO_TypeDef*GPIOA_BASE。这就有点类似像接口一样的定义,统一标准。通过对这段时间库函数的了解,我发现它似乎与JAVA语言的接口定义有点像,统一标准,接口中的方法只有定义而没有被实现。而库函数是在函数开始的头部就被包含了,也就是我们的常说的头文件,既然说到C语言,从该句的C语言语法可以判断出GPIO_TypeDef*GPIOA_BASE的功能为将GPIOA_BASE类型转换为指向GPIO_TypeDef类型的结构体变量。如此一来只需要找到GPIOA_BASE的含义,依次在“文件中找到:
50、#define GPIOA_BASE (APB2PERIPH_BASE+0X800)和#define APB2PERIPH_BASE PERIPH_BASE+0x10000还有:#define PERIPH_BASE (u32)0x40000000)格式看出GPIOA_BASE表示一个地址,通过将以上3个宏展开可以得到:GPIOA_BASE=0x40000000+0x10000+0X800此处关键便在于0X800、0x100000、0x40000000这三个值得来历。我们可以根据宏名大概猜想一下,是设备地址?这是STM32微控制器的GPIOA的设备地址。通过查阅STM32微控制器开发手册可得知
51、,STM32外设起始地址为0x40000000,而APB2总线设备起始地址相对于外设地址的偏移量为0x10000,在精确点就是GPIOA设备相对于APB2总线设备起始地址偏移量为0x800。对局代码进行一个总结:调用GPIO_Init函数,并将STM32微控制器的GPIOA设备地址和所定义的结构体变量GPIO_InitStructure的地址传入。STM32时钟配置一、在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。HSI是高速内部时钟,RC振荡器,频率为8MHz。HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz16MHz。LSI是低速内
52、部时钟,RC振荡器,频率为40kHz。LSE是低速外部时钟,接频率为的石英晶体。PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为216倍,但是其输出频率最大不得超过72MHz。二、在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法:如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。对于少于100脚的产品,有2种接法:第1种:OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能;第2种:分别重映射OSC_IN和OSC_OUT至PD0和
53、PD1,再配置PD0和PD1为推挽输出并输出'0'。此方法可以减小功耗并相对上面节省2个外部电阻。三、用HSE时钟,程序设置时钟参数流程:01、将RCC存放器重新设置为默认值 RCC_DeInit;02、翻开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);03、等待外部高速时钟晶HSEStartUpStatus = RCC_WaitForHSEStartUp();04、设置AHB时钟 RCC_HCLKConfig;05、设置高速AHB时钟 RCC_PCLK2Config;06、设置低速AHB时钟 RCC_PCLK1Config;07、设置PLL RC
54、C_PLLConfig;08、翻开PLL RCC_PLLCmd(ENABLE);09、等待PLL工作while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET)10、设置系统时钟RCC_SYSCLKConfig;11、判断是否PLL是系统时钟while(RCC_GetSYSCLKSource() != 0x08)12翻开要使用外设时钟RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()四、下面是STM32软件固件库的程序中对RCC的配置函数(使用外部8MHz晶振)/* Function Name : RCC_C
55、onfiguration * Description : RCC配置(使用外部8MHz晶振)* Input : 无* Output : 无* Return : 无*/void RCC_Configuration(void) /*将外设RCC存放器重设为缺省值*/ RCC_DeInit(); /*设置外部高速晶振HSE*/ RCC_HSEConfig(RCC_HSE_ON); /RCC_HSE_ONHSE晶振翻开(ON) /*等待HSE起振*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus = SUCCESS) /SUCCESS:HSE晶振稳定且就绪 /*设置AHB时钟HCLK*/ RCC_HCLKConfig(RCC_SYSCLK_Div1); /RCC_SYSCLK_Div1AHB时钟= 系统时钟。 /* 设置高速AHB时钟PCLK2*/ RCC_PCLK2Config(RCC_HCLK_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全知识接龙讲解
- 深圳海洋经济现状
- 2022年安徽农商银行考试真题及答案
- 2025年电子商务设计师资格考试真题解析及答案详解
- 英语2025年辽宁高三5月联考答案
- 2025年晚春考试题及答案
- 2025年药店药物培训试题及答案
- 国内生物医药产业链现状与挑战
- 2025年江西工业工程职业技术学院单招职业技能考试题库附参考答案详解
- 2025年河北省高碑店市辅警招聘考试试题题库及答案详解(新)
- 高三一轮复习课件-新航路的开辟
- 淤地坝防汛预案
- 2023年北京市基础设施投资有限公司校园招聘考试题库及答案解析
- 2022北京房山区初一期末(下)英语试卷及答案
- 系列厂拌站说明书xc使用
- GB/T 10095.1-2022圆柱齿轮ISO齿面公差分级制第1部分:齿面偏差的定义和允许值
- GB 16869-2005鲜、冻禽产品
- 电子皮肤上课讲义课件
- 260吨转炉扭力杆更换方案
- 北京市总工会职工互助保障课件
- 禁毒知识应知应会题库
评论
0/150
提交评论