STM32 注意的地方
时间:10-02
整理:3721RD
点击:
STM32 注意的地方
注: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,然后才重新编译,就能顺利通过了。
类型说明------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: 115200
Data bits: 8
Parity: none
Stop bits: 1
Flow 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
注: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,然后才重新编译,就能顺利通过了。
类型说明------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: 115200
Data bits: 8
Parity: none
Stop bits: 1
Flow 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
想学,Linux,STM32,可以叫我QQ交流学习,QQ为2232894713
哦