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

[复制链接]
 楼主| 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
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;别的同理;
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;
  }
}
uc_stm32f050 发表于 2012-2-25 14:05 | 显示全部楼层
本帖最后由 uc_stm32f050 于 2012-2-25 14:07 编辑

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

  3. #define TEST_IO   IO_BIT_ALIAS(&PA_ODR,1)   

  4. int main( void )
  5. {
  6.      
  7.   TEST_IO =0;
  8.    
  9.   TEST_IO =1;
  10.       
  11.   TEST_IO =!TEST_IO;
  12.   
  13.   while(1);
  14.   
  15.   //return 0;
  16. }

iar_stm8.rar

13.26 KB, 下载次数: 281

 楼主| luanliang 发表于 2012-3-1 09:14 | 显示全部楼层
5# zhj520zhj
想再请问下,为什么我的include里面没有stm8s.h这个标准库 只有某个特定芯片的,而且打开也只有没有LS所说的结构体
raodaqing 发表于 2012-3-2 19:57 | 显示全部楼层
简单的方法就是:_Bool   LED1  @ PD_ODR:0;  //对寄存器位寻址,就可以单独的赋值控制(可以有空格也可以直接连在一起 @PD_ODR:0)
运算符“@”是定义寄存器的哪一位是为位变量。
如上声明就可以对寄存器PD_ODR的第0位进行单独的读写数据:LED1=1、LED1=0.
tsb0574 发表于 2013-3-1 23:05 | 显示全部楼层
raodaqing 发表于 2012-3-2 19:57
简单的方法就是:_Bool   LED1  @ PD_ODR:0;  //对寄存器位寻址,就可以单独的赋值控制(可以有空格也可以 ...

能传个完整的工程吗?
iar里面不行啊!
linjiaze1991 发表于 2013-3-2 22:42 | 显示全部楼层
自己宏定义
dalian345 发表于 2013-3-13 23:06 | 显示全部楼层
_Bool l4   @PC_IDR:7;//定义lie4

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

就这么简单
相耘 发表于 2013-10-9 15:19 | 显示全部楼层
raodaqing 发表于 2012-3-2 19:57
简单的方法就是:_Bool   LED1  @ PD_ODR:0;  //对寄存器位寻址,就可以单独的赋值控制(可以有空格也可以 ...

正解
trumpxp 发表于 2013-10-9 17:01 | 显示全部楼层
通过宏定义   一般就行了   楼主
gyh974 发表于 2014-8-29 14:12 | 显示全部楼层
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里面就不能这样写,我也搞了很久
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;

直接操作寄存器就好了,库里面一起写了,不过可以通过与或写单个。。
suxilong 发表于 2015-10-17 10:16 | 显示全部楼层
dalian345 发表于 2013-3-13 23:06
_Bool l4   @PC_IDR:7;//定义lie4

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

请问你们的头文件哪里 拿的???
win 发表于 2016-2-18 12:50 | 显示全部楼层
感谢!  mage心寒 ,方**是我想要的!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

12

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部