HC32F460 GPIO的寄存器操作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

HC32F460 GPIO 的寄存器操作

GPIO的基本操作,例如输出高,输出低,读取,只需要操作对应寄存器就可以,比操作函数有效率。

另外,一个GPIO的定义,通常需要两个参数,PORT和PIN,PORT的数值范围0~xx,通常看到最多4bit,PIN的范围是0 - 15,通常用16bit位表示,所以我们可以用一个32BIT宏,来定义1个GPIO口,这样方便移植,不容易出错。

以下是HC32F460的部分GPIO REG定义

#define GPIO_BASE                       M4_PORT
#define GPIO_DEF(PORTx, GPIOx)	        ((uint32_t)(((uint32_t)(PORTx) << 16) + (GPIOx)))
#define GPIO_PINS(pin)                  ((uint32_t)((pin) & 0xffff))
#define GPIO_PORT(pin)                  ((uint32_t)((((pin) >> 16) * 0x10) + (uint32_t)GPIO_BASE))

#define GPIO_IDR(x)         	        (*((volatile uint16_t *)(GPIO_PORT((x)) + 0x00)))  
#define GPIO_ODR(x)         	        (*((volatile uint16_t *)(GPIO_PORT((x)) + 0x04)))
#define GPIO_EDR(x)         	        (*((volatile uint16_t *)(GPIO_PORT((x)) + 0x06)))
#define GPIO_OSR(x)         	        (*((volatile uint16_t *)(GPIO_PORT((x)) + 0x08)))
#define GPIO_ORR(x)         	        (*((volatile uint16_t *)(GPIO_PORT((x)) + 0x0A)))
#define GPIO_OTR(x)         	        (*((volatile uint16_t *)(GPIO_PORT((x)) + 0x0A)))

#define GPIO_SET(pin)       	        (GPIO_OSR((pin)) = GPIO_PINS((pin)))
#define GPIO_CLR(pin)       	        (GPIO_ORR((pin)) = GPIO_PINS((pin)))
#define GPIO_GET(pin)       	        (GPIO_IDR((pin)) & GPIO_PINS((pin)))

GPIO_BASE是HC32F460 GPIO的地址段起始地址

#define GPIO_DEF(PORTx, GPIOx) ((uint32_t)(((uint32_t)(PORTx) << 16) + (GPIOx)))
用以上这个宏,把一个GPIO的PORT和PIN都封装在一起

GPIO_OSR和GPIO_ORR可以控制一个GPIO输出HIGH和LOW

我们开始定义一个宏

#define LED0_PORT                       (PortE)
#define LED0_PIN                        (Pin06)
#define LED0_DEF                        GPIO_DEF(LED0_PORT, LED0_PIN)
#define LED0_ON                         GPIO_CLR(LED0_DEF)
#define LED0_OFF                        GPIO_SET(LED0_DEF)

在RT THREAD的IDLE HOOK里面使用这个宏

static void idle_hook(void)
{
    static uint32_t count = 0;
    if (count == 0x00000001){LED0_OFF;}
    if (count == 0x00010000){LED0_ON;}
    if (count == 0x00020000){count = 0;}
    count++;
}

然后我们就可以看到板子上LED一闪一闪亮晶晶。。。。。。

以此类推,我们可以把很多需要GPIO定义放在H文件的宏定义里面,例如按键,LED,外设RESET,片选等等。。。。。

这样又有效率又方便移植

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值