|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
新唐单片机学习交流群:57955260,欢迎加入学习交流
由于官方提供的IO口配置函数效率低,且配置比较繁琐,下面使用寄存器配置的方式来控制IO口,实现实验一的点亮LED。通过查阅N329_Design_Guide_A0.pdf第627页可以发现,IO口相关寄存器的基址为0xB8001000,由此我们定义一个宏 #define GP_BA 0xB8001000
根据上图寄存器的偏移量,我们对寄存器的地址进行宏定义,为了方便对IO口进行初始化,定义一个结构体,同时也要把相关变量类型重新定义一下,符合我们的使用习惯,我创建的是n3290x.h,内容如下所示:
- #ifndef __N3290X_H
- #define __N3290X_H
-
- #include "stdint.h"
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- #ifdef __cplusplus
- #define __I volatile
- #else
- #define __I volatile const
- #endif
- #define __O volatile
- #define __IO volatile
-
- typedef int32_t s32;
- typedef int16_t s16;
- typedef int8_t s8;
-
- typedef const int32_t sc32; /*!< Read Only */
- typedef const int16_t sc16; /*!< Read Only */
- typedef const int8_t sc8; /*!< Read Only */
-
- typedef __IO int32_t vs32;
- typedef __IO int16_t vs16;
- typedef __IO int8_t vs8;
-
- typedef __I int32_t vsc32; /*!< Read Only */
- typedef __I int16_t vsc16; /*!< Read Only */
- typedef __I int8_t vsc8; /*!< Read Only */
-
- typedef uint32_t u32;
- typedef uint16_t u16;
- typedef uint8_t u8;
-
- typedef const uint32_t uc32; /*!< Read Only */
- typedef const uint16_t uc16; /*!< Read Only */
- typedef const uint8_t uc8; /*!< Read Only */
-
- typedef __IO uint32_t vu32;
- typedef __IO uint16_t vu16;
- typedef __IO uint8_t vu8;
-
- typedef __I uint32_t vuc32; /*!< Read Only */
- typedef __I uint16_t vuc16; /*!< Read Only */
- typedef __I uint8_t vuc8; /*!< Read Only */
-
- #define GP_BA 0xB8001000
- #define GPIOA_BASE (GP_BA + 0x00)
- #define GPIOB_BASE (GPIOA_BASE+ 0x10)
- #define GPIOC_BASE (GPIOB_BASE+ 0x10)
- #define GPIOD_BASE (GPIOC_BASE+ 0x10)
- #define GPIOE_BASE (GPIOD_BASE+ 0x10)
-
- typedef struct
- {
- __IO uint32_t OMD;
- __IO uint32_t PUEN;
- __IO uint32_t DOUT;
- __I uint32_t PIN;
- }GPIO_TypeDef;
-
- #define GPIOA ((GPIO_TypeDef*)(GPIOA_BASE))
- #define GPIOB ((GPIO_TypeDef*)(GPIOB_BASE))
- #define GPIOC ((GPIO_TypeDef*)(GPIOC_BASE))
- #define GPIOD ((GPIO_TypeDef*)(GPIOD_BASE))
- #define GPIOE ((GPIO_TypeDef*)(GPIOE_BASE))
-
- #endif
复制代码 GPIOx_ODM是一个32bit寄存器,控制IO口为输入或输出,每一bit控制一个IO口。当某一位为1时,配置对应的IO口为输出;当为0时,配置对应的IO口为输入。
如GPIOA->ODM = 0x00000001表示将PA0设为输出,PA的其它口均设为输入。
GPIOx_DOUT控制IO的输出为高电平或低电平,当某位为1时,表示对应的IO口输出高电平,反之输出低电平,前提是该IO口配置为输出模式。
下面贴出main.c的代码
- #include "wblib.h"
- #include "n3290x.h"
-
- int main(void)
- {
- sysSetSystemClock(eSYS_UPLL, //E_SYS_SRC_CLK eSrcClk,
- 192000, //UINT32 u32PllKHz,
- 192000, //UINT32 u32SysKHz,
- 192000, //UINT32 u32CpuKHz,
- 96000, //UINT32 u32HclkKHz,
- 48000); //UINT32 u32ApbKHz
- //PB3~PB6设为输出
- GPIOB->OMD |= 0x0F<<3;
- //PB3~PB6输出高电平
- GPIOB->DOUT |= 0x0F<<3;
- //PB3~PB6输出低电平
- GPIOB->DOUT &= ~(0x0F<<3);
- while(1)
- {
- }
- }
复制代码 通过仿真可以看到执行GPIOB->DOUT |= 0x0F<<3;后,灯就灭了,如此,用寄存器控制LED的实验完成。
|
|