打印
[STM8]

I/O输出寄存器的位操作

[复制链接]
1571|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xwh7010|  楼主 | 2014-9-30 13:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
怎么弄啊
沙发
songchenping| | 2014-9-30 14:14 | 只看该作者
你可以看一下,库里面有专门位操作的函数呢。

使用特权

评论回复
板凳
xwh7010|  楼主 | 2014-9-30 14:20 | 只看该作者
songchenping 发表于 2014-9-30 14:14
你可以看一下,库里面有专门位操作的函数呢。

我想单个操作位  不想用函数

使用特权

评论回复
地板
xwh7010|  楼主 | 2014-9-30 14:21 | 只看该作者
songchenping 发表于 2014-9-30 14:14
你可以看一下,库里面有专门位操作的函数呢。

我想单独操作位  不想用库函数   跟51这种 sbit xx=P1^1

使用特权

评论回复
5
hopewise| | 2014-9-30 14:44 | 只看该作者
#include "stm8s005k6.h"

/*************IO口定义*************/
_Bool time_add_key       @PD_IDR:7;     //40K时间+按键引脚
/*************变量定义*************/
typedef unsigned char uchar;
typedef unsigned int  uint;
_Bool   f_buzon=0;                //蜂鸣器响的标志位

使用特权

评论回复
6
xwh7010|  楼主 | 2014-9-30 14:45 | 只看该作者
hopewise 发表于 2014-9-30 14:44
#include "stm8s005k6.h"

/*************IO口定义*************/

我用的是IAR 编译器

使用特权

评论回复
7
Leeone| | 2014-9-30 15:06 | 只看该作者
xwh7010 发表于 2014-9-30 14:21
我想单独操作位  不想用库函数   跟51这种 sbit xx=P1^1

你看下位带操作,应该是你想要的,cortex-m3手册中有详细介绍

使用特权

评论回复
8
myxiaonia| | 2014-9-30 16:00 | 只看该作者
用bsrr和brr寄存器,手册里推荐用这个

使用特权

评论回复
9
lyc613| | 2014-9-30 17:56 | 只看该作者
看这里
//------初始化------
PA_DDR|=0x40;//控制方向
PA_CR1|=0x40;//CR1 CR2控制输出模式
//---------------------
用的时候直接
//-----
[size=13.63636302948px]#define RD      PC_ODR_ODR1
[size=13.63636302948px]#define WR      PE_ODR_ODR5
[size=13.63636302948px]#define DATA    PC_ODR_ODR2

这种操作方式和51一样.







使用特权

评论回复
10
zh113214| | 2014-9-30 19:04 | 只看该作者
我想问一下楼主问的是什么问题!!

使用特权

评论回复
11
Q3698741| | 2014-9-30 20:02 | 只看该作者
本帖最后由 Q3698741 于 2014-9-30 20:05 编辑

LZ一定是想要这样的
比如PA.0脚输入或输出直接写成 PAout(0)   PAin(0)

这个用位绑定可以实现



#include "stm32f10x.h"

//位绑定操作开始
#define GPIOA_ODR_ADDR (GPIOA_BASE + 0x0C)  //0x0C是ODR的地址偏移,见数据手册,GPIOA_BASE在头文件里
#define GPIOA_IDR_ADDR (GPIOA_BASE + 0x08)    //0x08是IDR的地址偏移
#define GPIOB_ODR_ADDR (GPIOB_BASE + 0x0C)  //0x0C是ODR的地址偏移,见数据手册
#define GPIOB_IDR_ADDR (GPIOB_BASE + 0x08)    //0x08是IDR的地址偏移
//....PC  PD PE  PF IO都按此操作

#define BitBand(Addr,BitNum)  *(volatile unsigned long *)(( Addr & 0xF0000000) + 0x02000000 + ((Addr & 0xFFFFF)<<5) + ( BitNum << 2) )

#define PAout(n)   BitBand(GPIOA_ODR_ADDR,n)
#define PAin(n)    BitBand(GPIOA_IDR_ADDR,n)

#define PBout(n)   BitBand(GPIOB_ODR_ADDR,n)
#define PBin(n)    BitBand(GPIOB_IDR_ADDR,n)


//位绑定结束,如要绑定其他IO口,只需把GPIOA换成GPIOB  GPIOC.....GPIOF即可,n(0~31)表示第几个IO

int main(void)
{
   //之前要对GPIO的输入输出定义
    GPIOA ->CRL = 0xC3; //这里的C是把PA.1当输入, 3是把PA.0当输出,CRL控制PA.0-PA.7脚
    GPIOA ->CRH = 0xC3; //这里的C是把PA.1当输入, 3是把PA.0当输出,CRH控制PA.8-PA.15脚
    //这里定义要是不明白,那就要好好看数据手册了

    PAout(0)=1;  //GPIOA  0 脚输出高电平,这里和C51差不多,sbit xx=P1^1   , xx=1
    PAin(1)=1;   // GPIOA  1 脚输入高电平

    returned(1);
}


使用特权

评论回复
12
mmuuss586| | 2014-9-30 20:53 | 只看该作者
楼上的方法不错

使用特权

评论回复
13
aleckleo| | 2014-9-30 22:06 | 只看该作者
调用函数吧,函数很方便‘

使用特权

评论回复
14
a2b3c4ddd| | 2014-10-10 20:53 | 只看该作者
直接拿IAR  或是 STVD 的头文件   都是结构体或是联合体方式  并将已经将各定义定位到了相应的寄存器地址

使用特权

评论回复
15
学生0时代| | 2014-10-14 15:37 | 只看该作者
手册里都有啊

使用特权

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

本版积分规则

18

主题

51

帖子

0

粉丝