




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
注:ahb主要负责外部存储器时钟。pb2负责ad,i/o,高级tim,串口1。apb1负责da,usb,spi,i2c,can,串口2345,普通tim。使用mdk keiluvision4进行学习,照着前面几个历程进行学习,看懂几个历程后想自己也照着搞搞,开始有些错误经调试后都解决了,但是在其他问题都解决后,编译就出现了more more than one section matches selector - cannot all be first/last这个错误,还提示啥包涵了一个错误的路径,本人各种检查路径,和历程的都一样了,可这个问题还没解决,当然后来发现这个不是路径的问题,上网找了好久,终于发现了,在历程中rvmdk以及stm32_eval中的几个初始汇编文件前有三个红点,而自己的工程中没有,再找资料才发现了如何设置,在此分享下,希望对大家有帮助:对需要设置的文件(就是文件上有三个红点的文件,几个历程基本都一样),点右键options for file*,勾去灰化的include in target build和always build,然后才重新编译,就能顺利通过了。类型说明-60脚s - 电源i - 输入o - 输出i/o - 输入输出ft - 5v 兼容vdd - 单片机3.3v 电源正vss - 单片机3.3v 电源负vdda - 单片机a/d 转换器电源正vssa - 单片机a/d 转换器电源负由于stm32f103 系列单片机的内部高速rc 振荡器(hsi)由vdda、vssa 供电,故即使不使用单片机自带的a/d 转换器,也必须保证vdda、vssa 的供电,否则stm32f103单片机不能正常启动。在ec30-ekstm32 核心板的背面,vdda 和vssa 分别通过电感连接到vdd 和vss。如果外部有vdda、vssa 的处理电路,需要将背面这两个电感拆除。类型说明-100脚s - 电源i - 输入o - 输出i/o - 输入输出ft - 5v 兼容vdd - 单片机3.3v 电源正vss - 单片机3.3v 电源负vdda - 单片机a/d 转换器电源正vssa - 单片机a/d 转换器电源负vref+ - 单片机a/d 转换器参考电压正vref- - 单片机a/d 转换器参考电压负由于stm32f103 系列单片机的内部高速rc 振荡器(hsi)由vdda、vssa 供电,故即使不使用单片机自带的a/d 转换器,也必须保证vdda、vssa 的供电,否则stm32f103单片机不能正常启动。在ec30-ekstm32 核心板的背面,vdda 和vssa 分别通过电感连接到vdd 和vss。如果外部有vdda、vssa 的处理电路,需要将背面这两个电感拆除。stm32f103 有两个独立的12 位a/d 转换器,16 个a/d 转换通道。ec30-ekstm32 只使用第1 个a/d 转换器adc1。16 个a/d 转换通道分布在pa0 pa7、pb0、pb1、pc0 pc5这16 个管脚上,其中任何一个管脚都可以配置为模拟量输入管脚aiwx。设置nvic优先级分组,方式。注:一共16个优先级,分为抢占式和响应式。两种优先级所占的数量由此代码确定,nvic_prioritygroup_x可以是0、1、2、3、4,分别代表抢占优先级有1、2、4、8、16个和响应优先级有16、8、4、2、1个。规定两种优先级的数量后,所有的中断级别必须在其中选择,抢占级别高的会打断其他中断优先执行,而响应级别高的会在其他中断执行完优先执行。stm32中有些硬件功能可以由用户自己配置,选择字节用于这些配置。这些通过用户选择字节配置的功能不能简单地通过软件配置,相应的功能必须在芯片上电时存在。如内部的独立看门狗,可以通过用户选择字节配置为做看门狗用,也可以通过用户选择字节配置为做普通计数器用;做看门狗使用时,软件是无法停止它的,所以芯片上电时这个功能就必须有效。stm32三种启动模式中存储器的存储介质 stm32三种启动模式对应的存储介质均是芯片内置的,它们是:1)用户闪存 = 芯片内置的flash。2)sram = 芯片内置的ram区,就是内存啦。3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段bootloader,就是通常说的isp程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个rom区。在每个stm32的芯片上都有两个管脚boot0和boot1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表:boot1=x boot0=0 从用户闪存启动,这是正常的工作模boot1=0 boot0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。boot1=1 boot0=1 从内置sram启动,这种模式可以用于调试。stm32 gpio端口的输出速度设置当stm32的gpio端口设置为输出模式时,有三种速度可以选择:2mhz、10mhz和50mhz,这个速度是指i/o口驱动电路的速度,是用来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当你不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的emi性能。当然如果你要输出较高频率的信号,但却选用了较低频率的驱动模块,你很可能会得到失真的输出信号。实际上芯片内部在i/o口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路。注意:gpio的引脚速度是指i/o口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与你的程序有关。 关键是,gpio的引脚速度跟应用匹配。比如对于串口,假如最大波特率只需115.2k,那么用2m的gpio的引脚速度就够了,既省电也噪声小。对于i2c接口,假如使用400k波特率,若想把余量留大些,那么用2m的gpio的引脚速度或许不够,这时可以选用10m的gpio引脚速度。对于spi接口,假如使用18m或9m波特率,用10m的gpio的引脚速度显然不够了,需要选用50m的gpio的引脚速度。stm32f10xx时钟系统框图:时钟是整个系统的脉搏下图是stm32f10xx时钟系统的框图,通过这个图可以一目了然地看到各个部件时钟产生的路径,还可以很方便地计算出各部分的时钟频率。stm32的四个时钟源(hsi、hse、lsi和lse)也在图中标出;图中间的时钟监视系统(css)是在很多st7的单片机中就出现的安全设置。特别注意:图的右边,输出定时器时钟之前有一个乘法器,它的操作不是由程序控制的,是由硬件根据前一级的apb预分频器的输出自动选择,当apb预分频器的分频因子为1时,这个乘法器无作用;当apb预分频器的分频因子大于1时,这个乘法器做倍频操作,即将apb预分频器输出的频率乘2,这样可以保证定时器可以得到最高的72mhz时钟脉冲。stm32上很多管脚功能可以重新映射stm32上有很多i/o口,也有很多的内置外设,为了节省引出管脚,这些内置外设都是与i/o口共用引出管脚,st称其为i/o管脚的复用功能,相信这点大家都很清楚,因为基本上所有单片机都是这么做的。但不知有多少人知道,很多复用功能的引出脚可以通过重映射,从不同的i/o管脚引出,即复用功能的引出脚位是可通过程序改变的。这一功能的直接好处是,pcb电路板的设计人员可以在需要的情况下,不必把某些信号在板上绕一大圈完成联接,方便了pcb的设计同时潜在地减少了信号的交叉干扰。复用功能引出脚的重映射功能所带来的潜在好处是,在你不需要同时使用多个复用功能时,虚拟地增加复用功能的数量。例如,stm32上最多有3个usart接口,当你需要更多uart接口而又不需要同时使用它们时,可以通过这个重映射功能实现更多的uart接口。下述复用功能的引出脚具有重映射功能: - 晶体振荡器的引脚在不接晶体时,可以作为普通i/o口 - can模块 - jtag调试接口 - 大部分定时器的引出接口 - 大部分usart的引出接口 - i2c1的引出接口 - spi1的引出接口详细内容请看stm32的技术参考手册。请务必记住:如果使用了任意一种重映射功能,在初始化和使用之前,一定要打开afio时钟。下图示出了部分复用功能引出脚的重映射结果:【演示实例】一个在ek-stm32f板子上的rtc作为calender的例子硬件连接:串口线连至板子的uart-0端口。超级终端设置为:bits per seconds: 115200data bits: 8parity: nonestop bits: 1flow control hardware板子第一次跑这个程序时,进入时间配置。根据超级终端上的提示,一次输入年,月,日,时,分,秒(1月就输入01,10月直接输入10;同理3号就输入03)随后当前的时间就显示到了超级终端上,并且每秒刷新。没有断电的情况下再跑这个程序,由于看到bake up区域有被设置过时间的标志,不再进入时间设置阶段,而是直接到时间显示间断,在超级终端上,每秒刷新。当然如果在ek-stm32f板子上将vbat和电池相接,具体就是:将红色的电源跳线帽中的从下往上数的第5个取下,从原来的水平放置改成竖直放置(和上面的vbat相连)。就算断电,只要再上电,看到back up区域中的记号,一样直接进入时间显示。因为断电后,back up区域由电池供电,其中记录的记号不会由于系统掉电而消失。【演示实例】使用ek-stm32f板测量stm32的功耗这个例子演示了如何使用ek-stm32f开发评估板测量stm32f103vbt6在各种模式下的功耗。例子中演示了如何进入stm32的各种模式(run、sleep、stop、standby),使用这个例子您可以通过ek-stm32f板上的红色跳线(vdd、vref+和vdda)测量功耗。本实例首先通过uart与windows的hyperterminal通信,用户可以选择需要进入的功耗模式,然后这个例程把用户选好的配置存到后备寄存器,再次复位后stm32将进入之前选定的模式。附件包中包含了一个说明文件,详细说明了如何设置板上的跳线和操作的过程。stm32 gpio的十大优越功能综述前几天hotpower邀请大家讨论一下gpio的功能、性能和优缺点(stm32的gpio很强大),等了几天没见太多人发言,但综合来看提到了3点:1)真双向io,2)速度快,3)寄存器功能重复。关于第3点有说好,有说多余的,见仁见智。下面我就在做个抛砖引玉,根据st手册上的内容,简单地综述一下gpio的功能:一、共有8种模式,可以通过编程选择:1. 浮空输入2. 带上拉输入3. 带下拉输入4. 模拟输入5. 开漏输出(此模式可实现hotpower说的真双向io)6. 推挽输出7. 复用功能的推挽输出8. 复用功能的开漏输出模式7和模式8需根据具体的复用功能决定。二、专门的寄存器(gpiox_bsrr和gpiox_brr)实现对gpio口的原子操作,即回避了设置或清除i/o端口时的“读-修改-写”操作,使得设置或清除i/o端口的操作不会被中断处理打断而造成误动作。三、每个gpio口都可以作为外部中断的输入,便于系统灵活设计。四、i/o口的输出模式下,有3种输出速度可选(2mhz、10mhz和50mhz),这有利于噪声控制。五、所有i/o口兼容cmos和ttl,多数i/o口兼容5v电平。六、大电流驱动能力:gpio口在高低电平分别为0.4v和vdd-0.4v时,可以提供或吸收8ma电流;如果把输入输出电平分别放宽到1.3v和vdd-1.3v时,可以提供或吸收20ma电流。七、具有独立的唤醒i/o口。八、很多i/o口的复用功能可以重新映射,见:你知道吗?stm32上很多管脚功能可以重新映射。九、gpio口的配置具有上锁功能,当配置好gpio口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。此功能非常有利于在程序跑飞的情况下保护系统中其他的设备,不会因为某些i/o口的配置被改变而损坏如一个输入口变成输出口并输出电流。十、输出模式下输入寄存器依然有效,在开漏配置模式下实现真正的双向i/o功能。stm32内置参照电压的使用每个stm32芯片都有一个内部的参照电压,相当于一个标准电压测量点,在芯片内部连接到adc1的通道17。根据数据手册中的数据,这个参照电压的典型值是1.20v,最小值是1.16v,最大值是1.24v。这个电压基本不随外部供电电压的变化而变化。不少人把这个参照电压与adc的参考电压混淆。adc的参考电压都是通过vref+提供的。100脚以上的型号,vref+引到了片外,引脚名称为vref+;64脚和小于64脚的型号,vref+在芯片内部与vcc信号线相连,没有引到片外,这样ad的参考电压就是vcc上的电压。在adc的外部参考电压波动,或因为vref+在芯片内部与vcc相连而vcc变化的情况下,如果对于adc测量的准确性要求不高时,可以使用这个内部参照电压得到adc测量的电压值。具体方法是在测量某个通道的电压值之前,先读出参照电压的adc测量数值,记为adrefint;再读出要测量通道的adc转换数值,记为adchx;则要测量的电压为:vchx = vrefint * (adchx/adrefint)其中vrefint为参照电压=1.20v。上述方法在使用内置温度传感器对因为温度变化,对系统参数进行补偿时就十分有效。stm32的adc输入通道配置stm32中最多有3个adc模块,每个模块对应的通道不完全重叠。下图是stm32f103cde数据手册中的总框图的左下角,图中可以看出有8个外部adc管脚分别接到了3个adc模块,有8个外部adc管脚只分别接到了2个adc模块,还有5个外部adc管脚只接到了adc3模块,这样总共是21个通道。下表是这些adc管脚与每个adc模块的对应关系,表中可以看出adc1还有2个内部通道,分别接到内部的温度传感器和内部的参照电压: 关于stm32 adc速度的问题stm32f103xx系列称为增强型产品,增强型产品的最高时钟频率可以达到72mhz。增强型产品的英文名称为performance line。stm32f101xx系列称为基本型产品,基本型产品的最高时钟频率可以达到36mhz。基本型产品的英文名称为access line。根据设计,当adc模块的频率为14mhz时,可以达到adc的最快采样转换速度。要得到14mhz的adc频率,就要求sysclk的频率是14mhz的倍数,即14mhz、28mhz、42mhz、56mhz、70mhz、84mhz等;对于基本型产品14mhz和28mhz处于它的最大允许频率范围内;对于增强型产品,14mhz、28mhz、42mhz、56mhz和70mhz几种频率都在它的最大允许频率范围内,但因为adc预分频器的分频系数只有2、4、6、8这几个,使用70mhz不能得到最大的14mhz,所以要想得到最快的adc转换速度,在增强型产品上能用的最快sysclk频率是56mhz。adc的速度由2个参数决定,它是采样时间和转换时间之和: 即:tconv = 采样时间 + 12.5个adc时钟周期在stm32中,adc的采样时间是由用户程序在一组预定的数值中选择,按照adc的时钟周期计算,共有8种选择: 1.5、7.5、13.5、28.5、41.5、55.5、71.5和239.5按最小的1.5个时钟周期的采样时间计算,最短的tconv等于14个时钟周期,如果adc的时钟频率是14mhz,则adc的速度为每秒100万次。注意:当adc的时钟频率超过14mhz时,adc的精度将会显著下降。stm32内置crc模块的使用所有的stm32芯片都内置了一个硬件的crc计算模块,可以很方便地应用到需要进行通信的程序中,这个crc计算模块使用常见的、在以太网中使用的计算多项式: x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 +x8 + x7 + x5 + x4 + x2 + x + 1写成16进制就是:0x04c11db7使用这个内置crc模块的方法非常简单,既首先复位crc模块(设置crc_cr=0x01),这个操作把crc计算的余数初始化为0xffffffff;然后把要计算的数据按每32位分割为一组数据字,并逐个地把这组数据字写入crc_dr寄存器(既下图中的绿色框),写完所有的数据字后,就可以从crc_dr寄存器(既下图中的兰色框)读出计算的结果。注意:虽然读写操作都是针对crc_dr寄存器,但实际上是访问的不同物理寄存器。下面是用c语言描述的这个计算模块的算法,大家可以把它放在通信的另一端,对通信的正确性进行验证:dword dwpolynomial = 0x04c11db7;dword cal_crc(dword *ptr, int len)dwordxbit;dworddata;dwordcrc = 0xffffffff;/ initwhile (len-) xbit = 1 31;data = *ptr+;for (int bits = 0; bits 32; bits+) if (crc & 0x80000000) crc = 1;crc = dwpolynomial;elsecrc = 1;return crc;有几点需要说明:1)上述算法中变量crc,在每次循环结束包含了计算的余数,它始终是向左移位(既从最低位向最高位移动),溢出的数据位被丢弃。2)输入的数据始终是以32位为单位,如果原始数据少于32位,需要在低位补0,当然也可以高位补0。3)假定输入的dword数组中每个分量是按小端存储。4)输入数据是按照最高位最先计算,最低位最后计算的顺序进行。例如:如果输入0x44434241,内存中按字节存放的顺序是:0x41, 0x42, 0x43, 0x44。计算的结果是:0xcf534ae1如果输入0x41424344,内存中按字节存放的顺序是:0x44, 0x43, 0x42, 0x41。计算的结果是:0xabcf9a63stm32中定时器的时钟源stm32中有多达8个定时器,其中tim1和tim8是能够产生三对pwm互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由apb2的输出产生。其它6个为普通定时器,时钟由apb1的输出产生。下图是stm32参考手册上时钟分配图中,有关定时器时钟部分的截图:从图中可以看出,定时器的时钟不是直接来自apb1或apb2,而是来自于输入为apb1或apb2的一个倍频器,图中的蓝色部分。下面以定时器27的时钟说明这个倍频器的作用:当apb1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于apb1的频率;当apb1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于apb1的频率两倍。假定ahb=36mhz,因为apb1允许的最大频率为36mhz,所以apb1的预分频系数可以取任意数值;当预分频系数=1时,apb1=36mhz,tim27的时钟频率=36mhz(倍频器不起作用);当预分频系数=2时,apb1=18mhz,在倍频器的作用下,tim27的时钟频率=36mhz。有人会问,既然需要tim27的时钟频率=36mhz,为什么不直接取apb1的预分频系数=1?答案是:apb1不但要为tim27提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,tim27仍能得到较高的时钟频率。再举个例子:当ahb=72mhz时,apb1的预分频系数必须大于2,因为apb1的最大频率只能为36mhz。如果apb1的预分频系数=2,则因为这个倍频器,tim27仍然能够得到72mhz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。stm32中外部中断与外部事件这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套。图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断“挂起请求寄存器”,最后经过编号4的与门输出到nvic中断控制器;在这个通道上有4个控制选项,外部的信号首先经过边沿检测电路,这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了。接下来是编号3的或门,这个或门的另一个输入是“软件中断/事件寄存器”,从这里可以看出,软件可以优先于外部信号请求一个中断或事件,既当“软件中断/事件寄存器”的对应位为“1”时,不管外部信号如何,编号3的或门都会输出有效信号。一个中断或事件请求信号经过编号3的或门后,进入挂起请求寄存器,到此之前,中断和事件的信号传输通路都是一致的,也就是说,挂起请求寄存器中记录了外部信号的电平变化。外部请求信号最后经过编号4的与门,向nvic中断控制器发出一个中断请求,如果中断屏蔽寄存器的对应位为“0”,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽。明白了外部中断的请求机制,就很容易理解事件的请求机制了。图中红色虚线箭头,标出了外部事件信号的传输路径,外部请求信号经过编号3的或门后,进入编号5的与门,这个与门的作用与编号4的与门类似,用于引入事件屏蔽寄存器的控制;最后脉冲发生器把一个跳变的信号转变为一个单脉冲,输出到芯片中的其它功能模块。在这张图上我们也可以知道,从外部激励信号来看,中断和事件是没有分别的,只是在芯片内部分开,一路信号会向cpu产生中断请求,另一路信号会向其它功能模块发送脉冲触发信号,其它功能模块如何相应这个触发信号,则由对应的模块自己决定。在图上部的apb总线和外设模块接口,是每一个功能模块都有的部分,cpu通过这样的接口访问各个功能模块,这里就不再赘述了。stm32的usart发送数据时如何使用txe和tc标志在usart的发送端有2个寄存器,一个是程序可以看到的usart_dr寄存器(下图中阴影部分的tdr),另一个是程序看不到的移位寄存器(下图中阴影部分transmit shift register)。对应usart数据发送有两个标志,一个是txe=发送数据寄存器空,另一个是tc=发送结束;对照下图,当tdr中的数据传送到移位寄存器后,txe被设置,此时移位寄存器开始向tx信号线按位传输数据,但因为tdr已经变空,程序可以把下一个要发送的字节(操作usart_dr)写入tdr中,而不必等到移位寄存器中所有位发送结束,所有位发送结束时(送出停止位后)硬件会设置tc标志。另一方面,在刚刚初始化好usart还没有发送任何数据时,也会有txe标志,因为这时发送数据寄存器是空的。txeie和tcie的意义很简单,txeie允许在txe标志为1时产生中断,而tcie允许在tc标志为1时产生中断。至于什么时候使用哪个标志,需要根据你的需要自己决定。但我认为txe允许程序有更充裕的时间填写tdr寄存器,保证发送的数据流不间断。tc可以让程序知道发送结束的确切时间,有利于程序控制外部数据流的时序。stm32设置了很多非常有用和灵活的控制和状态位,只要你很好地掌握了它们的用法,可以让你的应用更加精确和高效。这是stm32技术参考手册中的一页:在stm32中如何配置片内外设使用的io端口首先,一个外设经过配置输入的时钟和初始化后即被激活(开启)。如果需要使用该外设的输入输出管脚,则需要配置相应的gpio端口;否则该外设对应的输入输出管脚可以做普通gpio管脚使用。stm32的输入输出管脚有下面8种可能的配置:1. 浮空输入2. 带上拉输入3. 带下拉输入4. 模拟输入5. 开漏输出6. 推挽输出7. 复用功能的推挽输出8. 复用功能的开漏输出对应到外设的输入输出功能有下述三种情况:一、外设对应的管脚为输出:需要根据外围电路的配置选择对应的管脚为复用功能的推挽输出或复用功能的开漏输出。二、外设对应的管脚为输入:则根据外围电路的配置可以选择浮空输入、带上拉输入或带下拉输入。三、adc对应的管脚:配置管脚为模拟输入。stm32 gpio端口的输入电平说明stm32的i/o管脚有两种:ttl和cmos,所有管脚都兼容ttl和cmos电平。也就是说,从输入识别电压上看,所有管脚(不管是ttl管脚还是cmos管脚)都可以识别ttl或cmos电平。下面是摘自stm32数据手册的有关数据:symbolparameterconditionsmintypmaxunitvilinput low level voltagettl ports-0.50.8vvihstandard io input high level voltage2vdd+0.5io ft input high level voltage25.5vvilinput low level voltagecmos ports-0.50.35vddvvihinput high level voltage0.65vddvdd+0.5stm32中如何使用pc14和pc15在stm32的数据手册的管脚分配图中可以看到:pc14与osc32_in公用一个引脚,pc15与osc32_out公用一个引脚,它们的使用方法如下:当lse(低速外部时钟信号)开启时,这两个公用管脚的功能是osc32_in和osc32_out。当lse(低速外部时钟信号)关闭时这两个公用管脚的功能是pc14和pc15。备用区域控制寄存器(rcc_bdcr)的lseon用于控制lse的开启或关闭。关于这个寄存器的用法请参看stm3210x技术参考手册。作为gpio输出的配置过程:(1).使能gpioc时钟 rcc_apb2periphclockcmd(rcc_apb2periph_gpioc, enable);(2).配置gpioc gpio_initstructure.gpio_pin = gpio_pin_14 | gpio_pin_15; gpio_initstructure.gpio_speed = gpio_speed_2mhz; gpio_initstructure.gpio_mode = gpio_mode_out_pp; gpio_init(gpioc, &gpio_initstructure);(3).然后写高写低 gpio_writebit(gpioc, gpio_pin_14, bit_set); gpio_writebit(gpioc, gpio_pin_15, bit_set); gpio_writebit(gpioc, gpio_pin_14, bit_reset); gpio_writebit(gpioc, gpio_pin_15, bit_reset); 以上代码跑在两个板子上,一个是backup区域里的rcc_dbcr的lseon为0,即lse关闭,以上(3)的操作从示波器上看到了电平相应变换;另外一个板子,backup区域里的rcc_dbcr的lseon为1,即lse打开,则以上(3)的操作从示波器上看到无效。作为gpio输入的配置过程:只是把以上的(2)稍微改一下,(3)就不用了gpio_initstructure.gpio_pin = gpio_pin_14 | gpio_pin_15;gpio_initstructure.gpio_mode = gpio_mode_in_floating;gpio_init(gpioc, &gpio_initstructure);外部连接为:在pc14引脚焊了一个电阻,电阻另一端通过跳线在上拉到3.3v和下拉到地的两种情况下,读出gpioc_idr.14分别为1和0。作为外部中断输入的配置过程:1.时钟使能/ + osc32_in/out - pc14/15rcc_apb2periphclockcmd(rcc_apb2periph_gpioc |rcc_apb2periph_afio, enable);注意要使能afio的时钟哦2.中断配置 / + for exti on pc.14 at falling edge/* configure one bit for preemption priority */nvic_prioritygroupconfig(nvic_prioritygroup_1);nvic_initstructure.nvic_irqchannel = exti15_10_irqchannel;nvic_initstructure.nvic_irqchannelpreemptionpriority = 0;nvic_initstructure.nvic_irqchannelsubpriority = 0;nvic_initstructure.nvic_irqchannelcmd = enable;nvic_init(&nvic_initstructure);3. gpio配置同上4. exti配置/ + for pc14 exti falling edgegpio_extilineconfig(gpio_portsourcegpioc, gpio_pinsource14);exti_initstructure.exti_line = exti_line14;exti_initstructure.exti_mode = exti_mode_interrupt;exti_initstructure.exti_trigger = exti_trigger_falling;exti_initstructure.exti_linecmd = enable;exti_init(&exti_initstructure);5. 中断处理isrvoid exti15_10_irqhandler(void)if(exti_getitstatus(exti_line14) != reset)/* clear the exti line 9 pending bit */exti_clearitpendingbit(exti_line14);在中断处设置断点,只要按下key,就进入中断,跑出中断,再按key,再次进入,屡试不爽,试验完成st32(cortex-m3)中的优先级概念stm32(cortex-m3)中有两个优先级的概念抢占式优先级和响应优先级,有人把响应优先级称作亚优先级或副优先级,每个中断源都需要被指定这两种优先级。具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在cortex-m3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:所有8位用于指定响应优先级最高1位用于指定抢占式优先级,最低7位用于指定响应优先级最高2位用于指定抢占式优先级,最低6位用于指定响应优先级最高3位用于指定抢占式优先级,最低5位用于指定响应优先级最高4位用于指定抢占式优先级,最低4位用于指定响应优先级最高5位用于指定抢占式优先级,最低3位用于指定响应优先级最高6位用于指定抢占式优先级,最低2位用于指定响应优先级最高7位用于指定抢占式优先级,最低1位用于指定响应优先级这就是优先级分组的概念。cortex-m3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此stm32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下: 第0组:所有4位用于指定响应优先级第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级第4组:所有4位用于指定抢占式优先级可以通过调用stm32的固件库中的函数nvic_prioritygroupconfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:nvic_prioritygroup_0 = 选择第0组nvic_prioritygroup_1 = 选择第1组nvic_prioritygroup_2 = 选择第2组nvic_prioritygroup_3 = 选择第3组nvic_prioritygroup_4 = 选择第4组 接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:/ 选择使用优先级分组第1组nvic_prioritygroupconfig(nvic_prioritygroup_1); / 使能exti0中断nvic_initstructure.nvic_irqchannel = exti0_irqchannel;nvic_initstructure.nvic_irqchannelpreemptionpriority = 1; / 指定抢占式优先级别1nvic_initstructure.nvic_irqchannelsubpriority = 0; / 指定响应优先级别0nvic_initstructure.nvic_irqchannelcmd = enable;nvic_init(&nvic_initstructure); / 使能exti9_5中断nvic_initstructure.nvic_irqchannel = exti9_5_irqchannel;nvic_initstructure.nvic_irqchannelpreemptionpriority = 0; / 指定抢占式优先级别0nvic_initstructure.nvic_irqchannelsubpriority = 1; / 指定响应优先级别1nvic_initstructure.nvic_irqchannelcmd = enable;nvic_init(&nvic_initstructure);要注意的几点是:1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;2)抢占式优先级别相同的中断源之间没有嵌套关系;3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。如何使用stm32的窗口看门狗stm32f的窗口看门狗中有一个7位的递减计数器,它会在出现下述2种情况之一时产生看门狗复位:1)当计数器的数值从0x40减到0x3f时2)当刷新看门狗时计数器的数值大于某一设定数值时,此设定数值在wwdg_cfr寄存器定义对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看门狗就检测不出来了;如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,这样可以检测出程序没有按照正常的路径运行非正常地跳过了某些程序段的情况。wwdg与iwdg的主要区别是有一个窗口控制,wwdg的中断是给你最后一次喂狗的机会,通常这个中断不是让你执行喂狗操作的;一般进到这个中断时表示你在其它地方安排的喂狗操作不能奏效,而发生这种现象时,肯定是系统有问题了,或者是程序有bug,或者是碰到了干扰,在这种情况下,这个中断是为了让你的程序在发生真正的看门狗复位前,有一个紧急处理的机会,如保存重要的数据,或做系统刹车等操作。由此看出,简单地在wwdg中断喂狗,既没有发挥wwdg相对于iwdg的优势,又因为在中断中喂狗而为以后的产品留下了隐患。如何使用stm32的pvd对电源的电压进行监控用户在使用stm32时,可以利用其内部的pvd对vdd的电压进行监控,通过电源控制寄存器(pwr_cr)中的pls2:0位来设定监控的电压值。pls2:0位用于选择pvd监控电源的电压阀值:000:2.2v001:2.3v010:2.4v011:2.5v100:2.6v101:2.7v110:2.8v111:2.9v在电源控制/状态寄存器(pwr_csr)中的pvdo标志用来表明vdd是高于还是低于pvd设定的电压阀值。该事件连接到外部中断的第16线,如果该中断在外部中断寄存器中被使能的,该事件就会产生中断。当vdd下降到pvd阀值以下和(或)当vdd上升到pvd阀值之上时,根据外部中断第16线的上升/下降边沿触发设置,就会产生pvd中断。这一特性可用于发现电压出现异常时,执行紧急关闭任务。stm32温度传感器的使用和计算stm32内置一个温度传感器,通过adc_in16这个通道可以读出温度传感器的电压。在stm32的技术参考手册中给出了一个计算公式:temperature (in ) = (v25 - vsense) / avg_slope + 25公式中的vsense就是在adc_in16读到的数值。avg_slope就是温度与adc数值转换的斜率。设想一个xy坐标,x轴为adc的电压读数,y轴为温度,两轴之间有一条直线代表了温度与转换电压的关系;在这条直线上如果x轴电压为v25时,y轴即为25;当读出的电压是其它数值时,即读出的电压是vsense时,使用这个公式就可以得到温度的数值。在stm32f103xx的数据手册中分别给出了v25和avg_slope的值:v25 最小=1.34v典型=1.43v最大=1.52vavg_slope 最小=4.0典型=4.3最大=4.6单位是 mv/例如读到vsense = 1.30v。分别取v25和avg_slope的典型值,计算得到:(1.43 - 1.30)/0.0043 + 25 = 55.23所以温度大约为 551 发送: te 允许位被设置时,发送数据寄存器中的数据在tx引脚上输出,相应的时钟sclk脚输出时钟。配置如下 : 1. usart_cr1寄存器上配置ue来激活usart 即 13位 0禁止1 允许2. 设置usart_cr1的m位来设置定义字长。 即 12位 0为8个数据 1 为9个数据3. 置usart_cr2中设置停止位的位数。4 . 如果是采用的是多级缓冲器通信则配置usrat_cr3中的dma未允许位;按照多级 缓冲的描述配置dma;5 . 设置usrt_cr1中的te,将第一个空闲帧作为第一次数据发送。6 . 配置usrat_brp寄存器选择要求的波特率7 . 把要发发送的数据写入的到usrat_dr寄存器,(它会清楚txe位) ,在只有一个缓冲器的情况下对这(7) 重复步骤。2接收配置 : usart接收期间数据从rx传入最低位,usart_dr寄存器和缓冲器位于内部总线和接收移位寄存器之间。配置如下: 1. usart_cr1寄存器上配置ue来激活usart
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国紫铜石墨市场调查研究报告
- 2025年中国精冲精密模具项目投资可行性研究报告
- 2025年中国管外强磁水处理器市场调查研究报告
- 2025年中国科易档案信息管理系统数据监测研究报告
- 2025年中国石油密度测定器项目投资可行性研究报告
- 2025年中国相贯线切割机市场调查研究报告
- 2025年中国电子产品生产线工具包项目投资可行性研究报告
- 2025年中国生物降解地膜数据监测研究报告
- 2025年中国玻璃灯盖市场调查研究报告
- 酒店行政年终工作总结资料15篇
- 教学第七章-无机材料的介电性能课件
- 应急值班值守管理制度
- 外国文学史-总课件
- 《中小企业划型标准规定》补充说明
- 房屋租赁信息登记表
- 六年级上册数学课件-1.6 长方体和正方体的体积计算丨苏教版 (共15张PPT)
- 食品科学技术词汇
- 质量总监.安全生产责任制考核表
- 小学生汉字听写大赛题库
- 第一框 关爱他人
- 渗透检测培训教材(1)
评论
0/150
提交评论