stm8s系列编程

网友投稿 672 2022-11-09

stm8s系列编程

stm8s系列编程

stm8s系列的单片机,不同于stc系列能够直接获取引脚。

看原理图:

这是stm8s103f系列的引脚图。

对于每个PX端口,例如PC,PD,都有5个定义,"stm8s103f.h"头文件中的定义如下:

/* Port A *//*****************************************************************//* Port A data output latch register */DEF_8BIT_REG_AT(PA_ODR,0x5000);/* Port A input pin value register */DEF_8BIT_REG_AT(PA_IDR,0x5001);/* Port A data direction register */DEF_8BIT_REG_AT(PA_DDR,0x5002);/* Port A control register 1 */DEF_8BIT_REG_AT(PA_CR1,0x5003);/* Port A control register 2 */DEF_8BIT_REG_AT(PA_CR2,0x5004);/* Port B *//*****************************************************************//* Port B data output latch register */DEF_8BIT_REG_AT(PB_ODR,0x5005);/* Port B input pin value register */DEF_8BIT_REG_AT(PB_IDR,0x5006);/* Port B data direction register */DEF_8BIT_REG_AT(PB_DDR,0x5007);/* Port B control register 1 */DEF_8BIT_REG_AT(PB_CR1,0x5008);/* Port B control register 2 */DEF_8BIT_REG_AT(PB_CR2,0x5009);/* Port C *//*****************************************************************//* Port C data output latch register */DEF_8BIT_REG_AT(PC_ODR,0x500a);/* Port C input pin value register */DEF_8BIT_REG_AT(PC_IDR,0x500b);/* Port C data direction register */DEF_8BIT_REG_AT(PC_DDR,0x500c);/* Port C control register 1 */DEF_8BIT_REG_AT(PC_CR1,0x500d);/* Port C control register 2 */DEF_8BIT_REG_AT(PC_CR2,0x500e);/* Port D *//*****************************************************************//* Port D data output latch register */DEF_8BIT_REG_AT(PD_ODR,0x500f);/* Port D input pin value register */DEF_8BIT_REG_AT(PD_IDR,0x5010);/* Port D data direction register */DEF_8BIT_REG_AT(PD_DDR,0x5011);/* Port D control register 1 */DEF_8BIT_REG_AT(PD_CR1,0x5012);/* Port D control register 2 */DEF_8BIT_REG_AT(PD_CR2,0x5013);

可以看到每个端口都有如下5种定义:

PX_ODR:定义了输出数据寄存器,0为低电平,1为高电平。注意这里是只写的。

PX_IDR:定义了输入寄存器,0为低电平,1为高电平。注意这里是只读的。

PX_DDR:定义数据流方向,0为输入,1为输出。

PX_CR1:定义了控制寄存器1,在输入模式时(DDR=0):0:浮空输入,1:带上拉电阻输入;在输出模式时(DDR=1):0:模拟开漏输出(不是真正的开漏输出),1:推挽输出, 由CR2相应的位做输出摆率控制。

PX_CR2:定义了控制寄存器2,在输入模式时(DDR=0):0: 禁止外部中断,1: 使能外部中断;在输出模式时(DDR=1):0:输出速度最大为2MHZ,1:输出速度最大为10MHZ。

可以发现,每一位都是8bit的,也就对应了8个端口,例如端口C:PC0对应0bit位,PC1对应1bit位.........PC7对应7bit位。

看下面这个原理图:

以PC5,PC6,PC7作为输入端口,PC3作为信号输出端口。

那么我们首先定义各个端口数据流输入方向:

PC_DDR = 0x08;

0x08对应00001000,也就是PC3为输出,其余均为输入。

然后我们通过位运算获取PC5,PC6,PC7的输入:

(PC_IDR & (0x01 << 5)); //PC5(PC_IDR & (0x01 << 6)); //PC6(PC_IDR & (0x01 << 7)); //PC7

它的值为0(输入低电平或者无输入)或者非0(不是1)(输入高电平)。

那么输出PC3高电平也就是这样了:

PC_ODR = 0x08;

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解决@Api注解不展示controller内容的问题
下一篇:LeetCode-583. Delete Operation for Two Strings
相关文章

 发表评论

暂时没有评论,来抢沙发吧~