用GPIOx->BRR=0x00008000方便些。
前面的0x00008000只第15脚而已。
下面贴出复位/置位寄存器和复位寄存器来不说了。
下面通过宏命令,使控制GPIO来的更加方便
#defineBITBAND(addrbitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))
#defineMEM_ADDR(addr)*((volatileunsignedlong*)(addr))
#defineBIT_ADDR(addrbitnum)MEM_ADDR(BITBAND(addrbitnum))
//IO
#defineGPIOA_ODR_Addr(GPIOA_BASE+12)//0x4001080C
#defineGPIOB_ODR_Addr(GPIOB_BASE+12)//0x40010C0C
#defineGPIOC_ODR_Addr(GPIOC_BASE+12)//0x4001100C
#defineGPIOD_ODR_Addr(GPIOD_BASE+12)//0x4001140C
#defineGPIOE_ODR_Addr(GPIOE_BASE+12)//0x4001180C
#defineGPIOF_ODR_Addr(GPIOF_BASE+12)//0x40011A0C
#defineGPIOG_ODR_Addr(GPIOG_BASE+12)//0x40011E0C
#defineGPIOA_IDR_Addr(GPIOA_BASE+8)//0x40010808
#defineGPIOB_IDR_Addr(GPIOB_BASE+8)//0x40010C08
#defineGPIOC_IDR_Addr(GPIOC_BASE+8)//0x40011008
#defineGPIOD_IDR_Addr(GPIOD_BASE+8)//0x40011408
#defineGPIOE_IDR_Addr(GPIOE_BASE+8)//0x40011808
#defineGPIOF_IDR_Addr(GPIOF_BASE+8)//0x40011A08
#defineGPIOG_IDR_Addr(GPIOG_BASE+8)//0x40011E08
//IOIO!
//n16!
#definePAout(n)BIT_ADDR(GPIOA_ODR_Addrn)//
#definePAin(n)BIT_ADDR(GPIOA_IDR_Addrn)//
#definePBout(n)BIT_ADDR(GPIOB_ODR_Addrn)//
#definePBin(n)BIT_ADDR(GPIOB_IDR_Addrn)//
#definePCout(n)BIT_ADDR(GPIOC_ODR_Addrn)//
#definePCin(n)BIT_ADDR(GPIOC_IDR_Addrn)//
#definePDout(n)BIT_ADDR(GPIOD_ODR_Addrn)//
#definePDin(n)BIT_ADDR(GPIOD_IDR_Addrn)//
#definePEout(n)BIT_ADDR(GPIOE_ODR_Addrn)//
#definePEin(n)BIT_ADDR(GPIOE_IDR_Addrn)//
#definePFout(n)BIT_ADDR(GPIOF_ODR_Addrn)//
#definePFin(n)BIT_ADDR(GPIOF_IDR_Addrn)//
#definePGout(n)BIT_ADDR(GPIOG_ODR_Addrn)//
#definePGin(n)BIT_ADDR(GPIOG_IDR_Addrn)//
#defineled0=PAout(8)
使用时可以 led0=0;或者 led0=1;像不像51中的控制。
这样led0就可以像51系统中那样控制某一管脚的高低了,是不是很方便。
这是比前面的应用的方便性上更加进了一步,只是前面要做一些提前的预备工作了。
全局中断禁止和允许
在51系统中都有全局中断允许/禁止位,那在Cortex-M3中这个位在哪呢?
这的水很深,请看在Core_m3.h中有
static__INLINEvoid__enable_irq(){__ASMvolatile("cpsiei");}
static__INLINEvoid__disable_irq(){__ASMvolatile("cpsidi");}
static__INLINEvoid__enable_fault_irq(){__ASMvolatile("cpsief");}
static__INLINEvoid__disable_fault_irq(){__ASMvolatile("cpsidf");}
static__INLINEvoid__NOP(){__ASMvolatile("nop");}
static__INLINEvoid__WFI(){__ASMvolatile("wfi");}
static__INLINEvoid__WFE(){__ASMvolatile("wfe");}
static__INLINEvoid__SEV(){__ASMvolatile("sev");}
static__INLINEvoid__ISB(){__ASMvolatile("isb");}
static__INLINEvoid__DSB(){__ASMvolatile("dsb");}
static__INLINEvoid__DMB(){__ASMvolatile("dmb");}
static__INLINEvoid__CLREX(){__ASMvolatile("clrex");}
使用前二条__enable_irq();__disable_irq()就可以打开和关闭所有的中断了,
这是在库版本在V3.0以上的情况。
而对于V2.0则要用
NVIC_SETFAULTMASK();//关闭总中断
NVIC_RESETFAULTMASK();//开放总中断来实现了。
像51一样操作STM32的IO
2010-10-1409:
28:
38| 分类:
STM32学习 | 标签:
define bit_addr 输出 输入 addr |字号 订阅
//-----------------------------------------------------------------------------------------------------
//别名区 ADDRESS=0x42000000+(0x0001100C*0x20)+(bitx*4);bitx:
第x位
//把“位段地址+位序号”转换别名地址宏
#defineBITBAND(addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))
//把该地址转换成一个指针
#defineMEM_ADDR(addr) *((volatileunsignedlong *)(addr))
#defineBIT_ADDR(addr,bitnum) MEM_ADDR(BITBAND(addr,bitnum) )
#defineGPIOA_ODR_Addr (GPIOA_BASE+12)//0x4001080C
#defineGPIOB_ODR_Addr (GPIOB_BASE+12)//0x40010C0C
#defineGPIOC_ODR_Addr (GPIOC_BASE+12)//0x4001100C
#defineGPIOD_ODR_Addr (GPIOD_BASE+12)//0x4001140C
#defineGPIOE_ODR_Addr (GPIOE_BASE+12)//0x4001180C
#defineGPIOA_IDR_Addr (GPIOA_BASE+8)//0x40010808
#defineGPIOB_IDR_Addr (GPIOB_BASE+8)//0x40010C08
#defineGPIOC_IDR_Addr (GPIOC_BASE+8)//0x40011008
#defineGPIOD_IDR_Addr (GPIOD_BASE+8)//0x40011408
#defineGPIOE_IDR_Addr (GPIOE_BASE+8)//0x40011808
//-----------------------------------------------------
#definePA0 BIT_ADDR(GPIOA_ODR_Addr,0) //输出
#definePA1 BIT_ADDR(GPIOA_ODR_Addr,1) //输出
#definePA2 BIT_ADDR(GPIOA_ODR_Addr,2) //输出
#definePA3 BIT_ADDR(GPIOA_ODR_Addr,3) //输出
#definePA4 BIT_ADDR(GPIOA_ODR_Addr,4) //输出
#definePA5 BIT_ADDR(GPIOA_ODR_Addr,5) //输出
#definePA6 BIT_ADDR(GPIOA_ODR_Addr,6) //输出
#definePA7 BIT_ADDR(GPIOA_ODR_Addr,7) //输出
#definePA8 BIT_ADDR(GPIOA_ODR_Addr,8) //输出
#definePA9 BIT_ADDR(GPIOA_ODR_Addr,9) //输出
#definePA10 BIT_ADDR(GPIOA_ODR_Addr,10)//输出
#definePA11 BIT_ADDR(GPIOA_ODR_Addr,11)//输出
#definePA12 BIT_ADDR(GPIOA_ODR_Addr,12)//输出
#definePA13 BIT_ADDR(GPIOA_ODR_Addr,13)//输出
#definePA14 BIT_ADDR(GPIOA_ODR_Addr,14)//输出
#definePA15 BIT_ADDR(GPIOA_ODR_Addr,15)//输出
#definePA0in BIT_ADDR(GPIOA_IDR_Addr,0) //输入
#definePA1in BIT_ADDR(GPIOA_IDR_Addr,1) //输入
#definePA2in BIT_ADDR(GPIOA_IDR_Addr,2) //输入
#definePA3in BIT_ADDR(GPIOA_IDR_Addr,3) //输入
#definePA4in BIT_ADDR(GPIOA_IDR_Addr,4) //输入
#definePA5in BIT_ADDR(GPIOA_IDR_Addr,5) //输入
#definePA6in BIT_ADDR(GPIOA_IDR_Addr,6) //输入
#definePA7in BIT_ADDR(GPIOA_IDR_Addr,7) //输入
#definePA8in BIT_ADDR(GPIOA_IDR_Addr,8) //输入
#definePA9in BIT_ADDR(GPIOA_IDR_Addr,9) //输入
#definePA10in BIT_ADDR(GPIOA_IDR_Addr,10)//输入
#definePA11in BIT_ADDR(GPIOA_IDR_Addr,11)//输入
#definePA12in BIT_ADDR(GPIOA_IDR_Addr,12)//输入
#definePA13in BIT_ADDR(GPIOA_IDR_Addr,13)//输入
#definePA14in BIT_ADDR(GPIOA_