直接对寄存器的地址进行操作
(*(volatile unsigned long *)(address)) = ((unsigned long)value)
address可以是立即数或者是宏定义,该操作方法常见于TI的早期DSP芯片2407的程序中
对寄存器的指针进行操作
#define GPIO_BASE_ADDR (0x00006F80)
//! \brief Defines the General Purpose I/O (GPIO) object
typedef struct _GPIO_Obj_
{
volatile uint32_t GPACTRL; //!< GPIO A Control Register
//...
} GPIO_Obj;
//! \brief Defines the general purpose I/O (GPIO) handle
typedef struct _GPIO_Obj_ *GPIO_Handle;
GPIO_Handle gpioHandle;
// initialize the GPIO handle
gpioHandle = (GPIO_Handle) (*GPIO_BASE_ADDR);
gpioHandle-> GPACTRL=value;
该操作方法常见于TI公司DSP28069的示例程序中
使用编译器预处理命令DATA_SECTION
#pragma DATA_SECTION(GpioDataRegs,"GpioDataRegsFile");
volatile struct GPIO_DATA_REGS GpioDataRegs;
该操作方法常见于TI公司DSP2812和28335的程序中,GpioDataRegsFiled在文件DSP2833x_Headers_nonBIOS.cmd进行了定义
MEMORY
{
PAGE 0: /* Program Memory */
PAGE 1: /* Data Memory */
/*省去部分内容*/
GPIOCTRL : origin = 0x006F80, length = 0x000040 /* GPIO control registers */
GPIODAT : origin = 0x006FC0, length = 0x000020 /* GPIO data registers */
GPIOINT : origin = 0x006FE0, length = 0x000020 /* GPIO interrupt/LPM registers */
/*省去部分内容*/
}
SECTIONS
{
PieVectTableFile : > PIE_VECT, PAGE = 1
/*省去部分内容*/
GpioCtrlRegsFile : > GPIOCTRL PAGE = 1
GpioDataRegsFile : > GPIODAT PAGE = 1
GpioIntRegsFile : > GPIOINT PAGE = 1
/*省去部分内容*/
}