论坛元老
 
- 积分
- 3571
- 金钱
- 3571
- 注册时间
- 2014-12-2
- 在线时间
- 365 小时
|
发表于 2016-3-1 16:56:30
|
显示全部楼层
举例:
根据3.3 Memory map,
GPIO Port A的基地址是0x40010800
而GPIOx_ODR的地址偏移是0x0C,
所以如果想将GPIOA的16个引脚都输出为1可以立即得如下代码:
[mw_shl_code=c,true]*(volatile uint32_t *)(0x40010800+0x0C) = 0xFFFF;[/mw_shl_code]
高八位置1,低八位置0,则是:
[mw_shl_code=c,true]*(volatile uint32_t *)(0x40010800+0x0C) = 0xFF00;[/mw_shl_code]
由上可以看出,想要操作寄存器还得找基地址,找偏移地址,作地址转换等等,非常麻烦
而STM32提供的头文件可以将上述过程大大简化:
[mw_shl_code=c,true]GPIOA->ODR = 0xFFFF;[/mw_shl_code]
[mw_shl_code=c,true]GPIOA->ODR = 0xFF00;[/mw_shl_code]
------分割线--------
你可以对GPIOA跟踪,找到它最终的定义所在:
[mw_shl_code=c,true]#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;[/mw_shl_code]
------分割线-------
如果依然看不明白结构体与GPIO寄存器的关系,
就得回去重新学习一下指针和结构体。
|
|