论坛大神
  
- 积分
- 1850
- 金钱
- 1850
- 注册时间
- 2012-9-16
- 在线时间
- 286 小时
|
发表于 2014-1-2 11:09:34
|
显示全部楼层
//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
/********************IO口地址映射详解********************************/
// /**********************************************************************
// #define FLASH_BASE ((uint32_t)0x08000000) < FLASH base address in the alias region
// #define SRAM_BASE ((uint32_t)0x20000000) < SRAM base address in the alias region
// #define  ERIPH_BASE ((uint32_t)0x40000000) <  eripheral base address in the alias region
// #define SRAM_BB_BASE ((uint32_t)0x22000000) < SRAM base address in the bit-band region
// #define  ERIPH_BB_BASE ((uint32_t)0x42000000) <  eripheral base address in the bit-band region
// #define FSMC_R_BASE ((uint32_t)0xA0000000) < FSMC registers base address
// #define APB1PERIPH_BASE   ERIPH_BASE
// #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
// #define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000) //0x40020000
// #define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000)
// < AHB1 peripherals
// #define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000) //0x40020000
// #define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400) //0x40020400
// #define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) //0x40020800
// #define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00) //0x40020C00
// #define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000) //0x40021000
// #define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400) //0x40021400
// #define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800) //0x40021800
// #define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00) //0x40021C00
// #define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000) //0x40022000
// **************************************************************************/
#define GPIOA_ODR_Addr (GPIOA_BASE+20) //0x40020014
#define GPIOB_ODR_Addr (GPIOB_BASE+20) //0x40020414
#define GPIOC_ODR_Addr (GPIOC_BASE+20) //0x40020814
#define GPIOD_ODR_Addr (GPIOD_BASE+20) //0x40020C14
#define GPIOE_ODR_Addr (GPIOE_BASE+20) //0x40021014
#define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414
#define GPIOG_ODR_Addr (GPIOG_BASE+20) //0x40021814
/**********************************************************
14为GPIOx_ODR的偏移量, 10是GPIOx_IDR的偏移量,本程序是用在STM32F207ZET6上,
STM32F207ZET6有144个管脚,没有H、I管脚,这里配置,是为之后拓展使用
**********************************************************/
// #define GPIOH_ODR_Addr (GPIOH_BASE+20) //0x40021C14
// #define GPIOI_ODR_Addr (GPIOI_BASE+20) //0x40022014
#define GPIOA_IDR_Addr (GPIOA_BASE+16) //0x40020010
#define GPIOB_IDR_Addr (GPIOB_BASE+16) //0x40020410
#define GPIOC_IDR_Addr (GPIOC_BASE+16) //0x40020810
#define GPIOD_IDR_Addr (GPIOD_BASE+16) //0x40020C10
#define GPIOE_IDR_Addr (GPIOE_BASE+16) //0x40021010
#define GPIOF_IDR_Addr (GPIOF_BASE+16) //0x40021410
#define GPIOG_IDR_Addr (GPIOG_BASE+16) //0x40021810
// #define GPIOH_IDR_Addr (GPIOH_BASE+16) //0x40021C10
// #define GPIOI_IDR_Addr (GPIOI_BASE+16) //0x40022010
//IO口操作,只对单一的IO口!
//确保n的值小于16!
//BIT_ADDR((unsigned long)&(PORTA->ODR), 2) = 0; // GPIOA.2 = 0;
#define  Aout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define  Ain(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
#define  Bout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define  Bin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
#define  Cout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
// #define PHout(n) BIT_ADDR(GPIOH_ODR_Addr,n) //输出
// #define PHin(n) BIT_ADDR(GPIOH_IDR_Addr,n) //输入
// #define PIout(n) BIT_ADDR(GPIOI_ODR_Addr,n) //输出
// #define PIin(n) BIT_ADDR(GPIOI_IDR_Addr,n) //输入 |
|