打印
[STM8]

如何对STM8S进行单个IO口定义

[复制链接]
18300|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luanliang|  楼主 | 2012-2-23 17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人菜鸟,刚毕业,从51转过来用STM8S系列,习惯了51对于单个IO口的操作(如sbit XX=P1^1 脚的指令),但是好像STM8S不支持这样的操作,网上查了下,好像是需要添加GPIO库或者是用位操作指令,但是水平有限,弄了半天没成功,没弄明白,希望有人能指点下,谢谢。补充下,我的平台是STVD 外挂COSMIC的编译器
沙发
uc_stm32f050| | 2012-2-23 17:18 | 只看该作者
用位域,也一样。

使用特权

评论回复
板凳
luanliang|  楼主 | 2012-2-25 10:21 | 只看该作者
能举个例吗

使用特权

评论回复
地板
zhj520zhj| | 2012-2-25 10:50 | 只看该作者
从新定义下GPIO的结构体在STM8S.H文件中 1# luanliang

使用特权

评论回复
5
zhj520zhj| | 2012-2-25 11:12 | 只看该作者
typedef struct GPIO_struct
{
union
{
  vu8 ODR; /*!< Output Data Register */
  struct
  {
   vu8 0:1;
   vu8 1:1;
   vu8 2:1;
   vu8 3:1;
   vu8 4:1;
   vu8 5:1;
   vu8 6:1;
   vu8 7:1;
  }ODR;
}
union
{
  vu8 IDR; /*!< Input Data Register */
  struct
  {
   vu8 0:1;
   vu8 1:1;
   vu8 2:1;
   vu8 3:1;
   vu8 4:1;
   vu8 5:1;
   vu8 6:1;
   vu8 7:1;
  }IDR;
}
   union
{
  vu8 DDR; /*!< Data Direction Register */
  struct
  {
   vu8 0:1;
   vu8 1:1;
   vu8 2:1;
   vu8 3:1;
   vu8 4:1;
   vu8 5:1;
   vu8 6:1;
   vu8 7:1;
  }DDR;
}
   union
{
  vu8 CR1; /*!< Configuration Register 1 */
  struct
  {
   vu8 0:1;
   vu8 1:1;
   vu8 2:1;
   vu8 3:1;
   vu8 4:1;
   vu8 5:1;
   vu8 6:1;
   vu8 7:1;
  }CR1;
}
union
{
  vu8 CR2; /*!< Configuration Register 2 */
  struct
  {
   vu8 0:1;
   vu8 1:1;
   vu8 2:1;
   vu8 3:1;
   vu8 4:1;
   vu8 5:1;
   vu8 6:1;
   vu8 7:1;
  }CR2;
}
}
GPIO_TypeDef;
写位时可以写   GPIOE->ODR.1=1;别的同理;

使用特权

评论回复
6
zhj520zhj| | 2012-2-25 11:49 | 只看该作者
上面写的有点错下面是改后的简调试了下没有错误
typedef struct GPIO_struct
{
union
{
  vu8 ODR; /*!< Output Data Register */
  struct
  {
   vu8 R0:1;
   vu8 R1:1;
   vu8 R2:1;
   vu8 R3:1;
   vu8 R4:1;
   vu8 R5:1;
   vu8 R6:1;
   vu8 R7:1;
  }ODRR;
};
  union
{
  vu8 IDR; /*!< Input Data Register */
  struct
  {
   vu8 R0:1;
   vu8 R1:1;
   vu8 R2:1;
   vu8 R3:1;
   vu8 R4:1;
   vu8 R5:1;
   vu8 R6:1;
   vu8 R7:1;
  }IDRR;
};
   union
{
  vu8 DDR; /*!< Data Direction Register */
  struct
  {
   vu8 R0:1;
   vu8 R1:1;
   vu8 R2:1;
   vu8 R3:1;
   vu8 R4:1;
   vu8 R5:1;
   vu8 R6:1;
   vu8 R7:1;
  }DDRR;
};
   union
{
  vu8 CR1; /*!< Configuration Register 1 */
  struct
  {
   vu8 R0:1;
   vu8 R1:1;
   vu8 R2:1;
   vu8 R3:1;
   vu8 R4:1;
   vu8 R5:1;
   vu8 R6:1;
   vu8 R7:1;
  }CR1R;
};
union
{
  vu8 CR2; /*!< Configuration Register 2 */
  struct
  {
   vu8 R0:1;
   vu8 R1:1;
   vu8 R2:1;
   vu8 R3:1;
   vu8 R4:1;
   vu8 R5:1;
   vu8 R6:1;
   vu8 R7:1;
  }CR2R;
};
} GPIO_TypeDef;
int main()
{
  while(1)
  {
   GPIOE->CR2=0X01;
   GPIOE->CR2R.R1=1;
  }
}

使用特权

评论回复
7
uc_stm32f050| | 2012-2-25 14:05 | 只看该作者
本帖最后由 uc_stm32f050 于 2012-2-25 14:07 编辑

#include <iostm8.h>
#include "util_bit_field.h"

#define TEST_IO   IO_BIT_ALIAS(&PA_ODR,1)   

int main( void )
{
     
  TEST_IO =0;
   
  TEST_IO =1;
      
  TEST_IO =!TEST_IO;
  
  while(1);
  
  //return 0;
}

iar_stm8.rar

13.26 KB

使用特权

评论回复
8
luanliang|  楼主 | 2012-3-1 09:14 | 只看该作者
5# zhj520zhj
想再请问下,为什么我的include里面没有stm8s.h这个标准库 只有某个特定芯片的,而且打开也只有没有LS所说的结构体

使用特权

评论回复
9
raodaqing| | 2012-3-2 19:57 | 只看该作者
简单的方法就是:_Bool   LED1  @ PD_ODR:0;  //对寄存器位寻址,就可以单独的赋值控制(可以有空格也可以直接连在一起 @PD_ODR:0)
运算符“@”是定义寄存器的哪一位是为位变量。
如上声明就可以对寄存器PD_ODR的第0位进行单独的读写数据:LED1=1、LED1=0.

使用特权

评论回复
10
tsb0574| | 2013-3-1 23:05 | 只看该作者
raodaqing 发表于 2012-3-2 19:57
简单的方法就是:_Bool   LED1  @ PD_ODR:0;  //对寄存器位寻址,就可以单独的赋值控制(可以有空格也可以 ...

能传个完整的工程吗?
iar里面不行啊!

使用特权

评论回复
11
linjiaze1991| | 2013-3-2 22:42 | 只看该作者
自己宏定义

使用特权

评论回复
12
dalian345| | 2013-3-13 23:06 | 只看该作者
_Bool l4   @PC_IDR:7;//定义lie4

_Bool h1   @PD_IDR:2;//定义hang1

就这么简单

使用特权

评论回复
13
相耘| | 2013-10-9 15:19 | 只看该作者
raodaqing 发表于 2012-3-2 19:57
简单的方法就是:_Bool   LED1  @ PD_ODR:0;  //对寄存器位寻址,就可以单独的赋值控制(可以有空格也可以 ...

正解

使用特权

评论回复
14
trumpxp| | 2013-10-9 17:01 | 只看该作者
通过宏定义   一般就行了   楼主

使用特权

评论回复
15
gyh974| | 2014-8-29 14:12 | 只看该作者

使用特权

评论回复
16
anyway132| | 2014-9-9 10:11 | 只看该作者
dalian345 发表于 2013-3-13 23:06
_Bool l4   @PC_IDR:7;//定义lie4

_Bool h1   @PD_IDR:2;//定义hang1

IAR里面就不能这样写,我也搞了很久

使用特权

评论回复
17
mage心寒| | 2014-9-9 10:57 | 只看该作者
#define SETLCD_SCL                (GPIOE->ODR |= BIT5)
#define CLRLCD_SCL                (GPIOE->ODR &= ~BIT5)   //#define  BIT5  (0x1<<5)  自己定义一下

typedef struct GPIO_struct
{
  __IO uint8_t ODR; /*!< Output Data Register */
  __IO uint8_t IDR; /*!< Input Data Register */
  __IO uint8_t DDR; /*!< Data Direction Register */
  __IO uint8_t CR1; /*!< Configuration Register 1 */
  __IO uint8_t CR2; /*!< Configuration Register 2 */
}
GPIO_TypeDef;

直接操作寄存器就好了,库里面一起写了,不过可以通过与或写单个。。

使用特权

评论回复
18
suxilong| | 2015-10-17 10:16 | 只看该作者
dalian345 发表于 2013-3-13 23:06
_Bool l4   @PC_IDR:7;//定义lie4

_Bool h1   @PD_IDR:2;//定义hang1

请问你们的头文件哪里 拿的???

使用特权

评论回复
19
win| | 2016-2-18 12:50 | 只看该作者
感谢!  mage心寒 ,方**是我想要的!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

12

帖子

2

粉丝