当前位置:首页 » 存储配置 » STM8配置功能是什么

STM8配置功能是什么

发布时间: 2023-08-04 20:32:56

‘壹’ STM8当中的GPIO各模式如何用

TM8的通用输入/输出口用于芯片和外部进行数据传输。一个IO端口可以包括多达8个引脚,每个引脚可以被独立编程作为数字输入或者数字输出口。另外部分口还可能会有如模拟输入,外部中断,片上外设的输入/输出等复用功能。但是在同一时刻仅有一个复用功能可以映射到引脚上。
复用功能的映射是通过选项字节控制的。请参考数据手册关于选项字节的描述。
每个端口都分配有一个输出数据寄存器,一个输入引脚寄存器,一个数据方向寄存器,一个选择寄存器,和一个配置寄存器。一个I/O口工作在输入还是输出是取决于该口的数据方向寄存器的状态。

GPIO主要功能

  • 可选择的输入模式:浮动输入和带上拉输入

  • 可选择的输出模式:推挽式输出和开漏输出

  • 数据输入和输出采用独立的寄存器

  • 外部中断可以单独使能和关闭

  • 输出摆率控制用以减少EMC噪声

  • 片上外设的I/O功能复用

  • 当作为模拟输入时可以关闭输入施密特触发器来降低功耗

  • 在数据输出锁存时支持读-修改-写

  • 输入兼容5V电压

  • I/O口工作电压范围为1.6 V到VDDIOmax

  • I/O的配置和使用

    每一个端口都有一个输出数据寄存器(ODR),一个引脚输入寄存器(IDR)和一个数据方向寄存器(DDR)总是同相关的。
    控制寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出进行配置。任何一个I/O引脚可以通过对DDR,ODR,CR1和CR2寄存器的相应位进行编程来配置。
    寄存器中的位n对应于口的引脚n。各种不同配置总结如表18。


    (表18:IO口配置表)

    注意:连接VDD的二极管在实际开漏极状态引脚是无效的,在引脚和VOL之间的局部保护设备重要性是有效的。
    没有使用的I/O引脚必须连接到一个固定的电平值。或者是上拉或者是下拉。

    输入模式

    将DDRx位清零就选择了输入模式。在该模式下读IDR寄存器的位将返回对应I/O引脚上的电平值。
    如表18所示,理论上STM8可以通过软件配置得到四种不同的输入模式:悬浮不带中断输入,悬浮带中断输入,上拉不带中断输入和上拉带中断输入。但是在实际情况下不是所有的口都具有外部中断能力和上拉,用户应参考数据手册中关于每个引脚的实际硬件性能描述来了解更多细节。

    输出模式

    将DDRx位置1就选择了输出模式。在该模式下向ODR寄存器的位写入数据将会通过锁存器输出对应数字值到I/O口。读IDR的位将会返回相应的I/O引脚电平值。通过软件配置CR1,CR2寄存器可以得到不同的输出模式:上拉输出,开漏输出。

    低功耗模式

    表19低功耗模式对STM8S的GPIO口的影响

    模式 描述

    等待(Wait) 对I/O口无影响。外部中断可以使MCU退出等待(Wait)模式

    停机(Halt) 对I/O口无影响。外部中断可以使MCU从停机(Halt)模式唤醒

    注意:如果PA1/PA2被用来连接外部谐振器,为了确保在HALT模式下有最低功耗必须配置PA1和PA2为带上拉输入。

‘贰’ STM8是红外通讯的绝配

有读者私信我,要获得更详细的内情。很抱歉,因为时间实在有限,而且对于实际场景不了解,所以,简单地更新,添加了点儿内容。至于更加详细的电路图和源码需要额外时间继续补充。

最近使用STM8L152做产品,需要基于红外线通讯的Bootloader。发现STM8L05X/15X是红外通讯的绝配。

红外线大致有CIR和SIR两种。前者主要用于5~10米距离的红外遥控器,采用38kHz载波,有大量的廉价接收解码器可用。后者是IrDa标准之一,曾经是功能手机和笔记本电脑的标准配置,其堆栈和配置实体设计与蓝牙比较像,物理层采用3/16载波方式,需要单独的收发模块。

电子、DVD、机顶盒、空调等传统消费电子中常见的遥控器,我们称之为CIR, Consumer Infra Red。CIR通常使用980nm红外线,还需要采用38KHz~40KHz载波以避免可见光干扰。CIR需要编码和解码电路。

我们可以找到若干编码电路。如果由MCU来实现,则需要产生38~40KHz 载波,另外根据特定的红外遥控协议,如SONY/Philips RC5等产生二进制码流。并利用逻辑门或者三极管来实现二进制码流对于载波的调制。理论上,二进制码流和载波还有一定的时序关系,但是实践下来,这种时序关系的容错率很高。

至于CIR的红外接收部分,因为产量比较大,有低成本模块供应,内置38~40KHz载波发生器,并直接输出解调后的二进制码流。所以解码接收部分任意MCU都可以实现。

综上所述,STM8L的CIR方案中,主要考虑的是编码发射端。

MCU产生38KHz载波最常见的方法是使用定时器。包括设定38KHz的中断,并在中断中去切换GPIO引脚。或者设定一个占空比为50%的PWM中断。其道理是类似的。同时,由软件或者另外一种定时器来产生定时中断,产生二进制码流。两者在外部使用CIR二极管相连,当两个GPIO压差为VCC时,IR二极管点亮,压差为零时,IR二极管关闭。这样就形成了最简单的CIR遥控器。

对于STM8L来说,其内部的低频RC振荡器频率正好在38KHz,当然有些误差,但是对于CIR来说要求没有那么严格。由于是内部IRC,所以并不需要使用定时器来产生中断。

通常38kHz载波采用定时器产生PWM。但是Bootloader状态下必须关闭所有中断。这就限制了许多MCU在这种状态的使用。有部分设计只用了单向传输,但是这种方式试错成本太高了。

STM8L05X内部低速RC就是38kHz。而且可以从引脚引出来为载波,实测37.2kHz。配合USART可以直接构成双向红外通讯和遥控器。比STM推荐的IRTM还好用。

消费者红外线技术是单向的:遥控器负责编码和发射红外线,设备负责接收和解码。在某些环境中,比如说水电煤表的自动抄表系统中,则需要建立起双向红外线通道。

红外线和无线电通讯类似,采用半双工通讯方式。所以软件角度必须要确保时序,不要造成双方的通讯冲突。同时硬件上也可以采取一些方法,保证己方在发射时不进行接收,避免自发自收。

由于38KHz载波的存在,其波特率收到限制,我测试过9.6kbps,但是工作在2.4kbps,误码率要少许多。

在Bootloader模式下,USART RXD可以采用polling方式实现,在低速率情况下不会掉数据。

这个其实和STM8无关了,可以参考Arino的红外编码和红外解码库。总的思路是将红外切割成一个个小的时间片,而无需太多考虑RC5/SONY/Toshiba/RCA等不同的红外遥控协议,直接使用一串二进制数据来编码。这也是大多数通用学习型红外遥控器的原理。

具体实现请参考  How to make IR decoder  以及 How to setup an IR remote and receiver on an Arino .

STM8的片内USART外设是支持IRDA SIR收发标准的。这是一种国际标准,早期移动电话和其他数据终端中多采用此类标准,通讯速率较高,可达到115.2kbps。但相对应的,它的红外收发模组成本在20多元人民币,比消费红外模块贵许多。

STM8的原始MCU架构来自意法半导体的ST7,是意法自主开发的内核。这里额外提一下,意法的STR7和ST7不同,是基于ARM7TDMI内核的产品线。STM8在ST7上做了很多改变,与STM32保持了引脚一致性。所以,STM8是一个性价比较高的MCU。

警告

但是STM8的ITC(中断控制)部分却存在着较大的问题。通过仿真器,我觉得和STM8的虚拟存储器以及压栈的先后顺序有关联。在某些极端嵌套中断情况下会导致堆栈溢出,或者一些莫名其妙的问题。具体请留意 STM8 Error Sheet 。

所以STM8在中断设计方面不能够采用过于复杂的嵌套设计,同时需要做些黑盒压力测试。

本文中的某些做法,如利用IRC直接产生38~40KHz载波的方式,可以作为一种思路,在其他MCU中继续使用。比如STM32F030F4 IRC40KHz/LPC812 SCT等。

‘叁’ stm8s103f3p6的afr怎样配置

本文使用的芯片是是stm8s103f3。
以下主要说明配置TIM2通道1为PWM输出的过程。
1.寄存器配置

4位预分频器,计数器的计数频率Fck_cnt=Fck_psc/2^(PSC[3:0])=16M/2^0=16M
那么计数周期为1/16us,也就是说计数器会每隔1/16us计数一次。
TIM2_PSCR=0x00; //分频值=0 16M

自动重装载寄存器,
当自动重装载寄存器=0时,计数器处于阻塞状态,也就是不计数状态,因为当CNTR=ARR时,CNTR就会清零,所以配置时自动重装载寄存器应该大于0。另外自动重装载寄存器的值就是PWM波形的周期,比如ARR=0X0100,PWM的周期为0x0100*1/16=16us,PWM的周期就是16us
TIM2_ARRH=0x01; //自动重装的值 0x0100
TIM2_ARRL=0x00;

捕获/比较使能寄存器,这个寄存器的配置可以选通相应的Tim2通道。
bit5,bit4为ch2配置,bit1,bit0为ch1配置
如果当前OC1为输出通道,则
bit1:OC1低电平有效
bit0:OC1信号被输出到当前引脚上
TIM2_CCER1=bit0|bit1; //low level,OC1

捕获/比较模式寄存器,
bit1,bit0
CC1S[1:0]为捕获/比较选择
00:CC1通道被配置为输出
bit2保留
bit3输出比较预加载使能
0:不使能
1:使能
bit6,bit5,bit4输出比较模式
110:PWM1模式
PWM1和PWM2模式区别
PWM1:CNT<CCR,CH1被激活
PWM2:CNT>CCR,CH1被激活
TIM2_CCMR1=bit3|bit5|bit6; //MODE

捕获/比较寄存器,这个寄存器决定着PWM的占空比。CCR/ARR=PWM的占空比,例如设置为0x0060,那么占空比为0x0060/0x0100=6/16
TIM2_CCR1H=0x00;
TIM2_CCR1L=0x60;

中断使能寄存器,如果需要中断可以在此设置。
bit1:CC1E 捕获/比较1中断使能
0:CC1 中断不使能
1:CC1中断使能
TIM2_IER=0x00; //更新中断使能

控制寄存器,bit0控制计数器的打开和关闭。
bit0,计数器使能
0:不使能
1:使能
TIM2_CR1=bit0; //enable counter
通过逻辑分析仪测试PD4管脚的输出电平,波形图如下所示。

源码如下,
//*******************************************

1 #define bit0 0x01
2 #define bit1 0x02
3 #define bit2 0x04
4 #define bit3 0x08
5 #define bit4 0x10
6 #define bit5 0x20
7 #define bit6 0x40
8 #define bit7 0x80
9
10 void Timer2_Init(void)
11 {
12 CLK_ICKR|=0x01; //开启内部HSI
13 while(!(CLK_ICKR&0x02));//HSI准备就绪
14 CLK_SWR=0xe1; //HSI为主时钟源
15 CLK_CKDIVR=0x00; //HSI,8分频=16M
16 TIM2_PSCR=0x00; //分频值=0 16M
17 TIM2_ARRH=0x01; //自动重装的值 0x0100
18 TIM2_ARRL=0x00;
19 TIM2_CCER1=bit0|bit1; //low level,OC1
20
21 TIM2_CCMR1=bit3|bit5|bit6; //MODE
22 TIM2_CCR1H=0x00;
23 TIM2_CCR1L=0x60;
24 TIM2_IER=0x00; //更新中断使能
25
26 TIM2_CR1=bit0; //enable counter
27 }
28 int main( void )
29 {
30 Timer2_Init();
31 while(1){};
32 }

‘肆’ stm8的定时器的tim2的通道1,通道2输出pwm,对应的GPIO需要配置吗,咋么配置啊

不需要任何配置的,只需要设置PWM的相关寄存,配置成输下PWM,他自动就输出PWM了

#include "STM8S103K.h" //头文件,定义各寄存器的地址

void main(void)
{
/*定时器基础设置*/
CLK_CKDIVR= 0x00; //内部16M时钟不分频
TIM2_PSCR = 0x00; //定时器2预分频系数为1
TIM2_CR1 = 0x01; //内部计数器使能;
TIM2_ARRH = 0x01;//0140,320分频,16M/320=50K,实测49.75K
TIM2_ARRL = 0x3e;//自动装载寄存器低位;实测013e正好为50.0K

/*PWM通道1设置*/
TIM2_CCER1 |= 0x01; //开启OC1信号输出脚
TIM2_CCMR1 = 0x60; //PWM1模式
TIM2_CCR1H = 0x00; //占空比高位
TIM2_CCR1L = 0xa0; //占空比低位
TIM2_CCMR1 |= 0x08; //输出比较1预装载使能

/*PWM通道2设置*/
TIM2_CCER1 |= 0x10; //开启OC2信号输出脚
TIM2_CCMR2 = 0x60; //PWM1模式
TIM2_CCR2H = 0x00; //占空比高位
TIM2_CCR2L = 0x03; //占空比低位
TIM2_CCMR2 |= 0x08; //输出比较2预装载使能

/*PWM通道3设置*/
TIM2_CCER2 = 0x01; //开启OC3信号输出脚
TIM2_CCMR3 = 0x60; //PWM1模式
TIM2_CCR3H = 0x01; //占空比高位
TIM2_CCR3L = 0x3d; //占空比低位
TIM2_CCMR3 |= 0x08; //输出比较3预装载使能

while (1); //
}

‘伍’ 如何使用stm8TIM1捕获外部脉冲测电机转速,TIM1如何配置

用一个转速传感器或者编码器,利用单片机引脚的脉冲沿捕获中断,1个计数器用于记录2相邻脉冲捕获时间间隔,一个计数器用于记录脉冲数。
然后计算1s时间内脉冲的个数就是频率,再通过换算的电机转速;

热点内容
滑板鞋脚本视频 发布:2025-02-02 09:48:54 浏览:432
群晖怎么玩安卓模拟器 发布:2025-02-02 09:45:23 浏览:557
三星安卓12彩蛋怎么玩 发布:2025-02-02 09:44:39 浏览:743
电脑显示连接服务器错误 发布:2025-02-02 09:24:10 浏览:536
瑞芯微开发板编译 发布:2025-02-02 09:22:54 浏览:146
linux虚拟机用gcc编译时显示错误 发布:2025-02-02 09:14:01 浏览:232
java驼峰 发布:2025-02-02 09:13:26 浏览:651
魔兽脚本怎么用 发布:2025-02-02 09:10:28 浏览:532
linuxadobe 发布:2025-02-02 09:09:43 浏览:212
sql2000数据库连接 发布:2025-02-02 09:09:43 浏览:726