本帖最后由 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);
}
|