
[OHOS - STM32MP157] 1 GPIO驱动分析 原创 精华
[OHOS - STM32MP157] 1 GPIO驱动分析
1 . STM32MP157GPIO寄存器
- 【参考资料】dm00327659-stm32mp157-advanced-armbased-32bit-mpus-stmicroelectronics.pdf
寄存器组地址
【P159 Memory map and register boundary addresses Table 9. Register boundary addresses】
以PA0
为例:
由上表可知,GPIOA基地址为0x50002000,记住备用。
【以输出模式为例】查看芯片GPIO使用方法:
【P1064 I/O pin alternate function multiplexer and mapping 】: 找到如下描述:
- 【配置PA0为高速推挽上拉输出高电平模式】
下面看GPIO寄存器组:
【P1072 GPIO registers】
【GPIO port mode register (GPIOx_MODER) 】端口模式配置寄存器
由上图可知,该寄存器每两位控制一个IO口,如PA0配置为输出模式,即将该寄存器MODER0[1:0]位配置为01即可,该寄存器地址为GPIOA基地址 + 寄存器偏移地址,由上面得到的GPIOA基地址为0x50002000,由上图得到端口模式配置寄存器偏移地址为0x00,故我们最后需要的操作就是将0x50002000+0x00
地址的低两位设置为01(输出)即可。
【GPIO port output type register (GPIOx_OTYPER) 】输出类型配置寄存器
配置详情同上,最后需要的操作就是将0x50002000+0x04
地址的低一位设置为0(推挽输出)。
【GPIO port pull-up/pull-down register (GPIOx_PUPDR) 】端口上下拉配置寄存器
配置详情同上,最后需要的操作就是将0x50002000+0x0C
地址的低两位设置为01(上拉)。
【GPIO port output data register (GPIOx_ODR) 】端口输出数据配置寄存器
配置详情同上,最后需要的操作就是将0x50002000+0x14
地址的低一位设置为1(高电平)。
自此,芯片数据手册分析完毕,下面是openHarmony与具体soc平台GPIO的相关开发介绍。
2 .openHarmony驱动加载
-
驱动加载入口
驱动加载时会执行Bind方法和Init方法,详情参考官方文档,本文只做GPIO分析,不做驱动框架层面分析。
bind方法,GPIO驱动里面不做具体操作:
Init方法,获取hcs文件具体配置信息,根据该信息初始化硬件驱动:
上述为openHarmony初始化GPIO的方法简单介绍,详细情况请仔细阅读源码,自此,OpenHarmony已经得到STM32MP157芯片的GPIO外设基本信息,我们继续往下分析。
3 .openHarmony驱动GPIO
【openHarmony对外提供的GPIO驱动函数】
-
STM32MP157驱动函数实例化:
【Stm32Mp157GpioSetDir】设置GPIO引脚反向
函数名 | 入参 | 出参 | 返回值 | 功能 |
---|---|---|---|---|
Stm32Mp157GpioSetDir | cntlr:结构体指针,核心层GPIO控制器;local:uint16_t,GPIO端口标识号 ;dir:uint16_t,管脚方向传入值; | 无 | HDF_STATUS相关状态 | 设置GPIO引脚输入/输出方向 |
【Stm32Mp157GpioWrite】设置GPIO输出电平
函数名 | 入参 | 出参 | 返回值 | 功能 |
---|---|---|---|---|
Stm32Mp157GpioWrite | cntlr:结构体指针,核心层GPIO控制器;local:uint16_t,GPIO端口标识号 ;val:uint16_t,电平传入值; | 无 | HDF_STATUS相关状态 | GPIO引脚写入电平值 |
其他函数请自行阅读源码。
device/st/drivers/gpio · 小熊派开源社区/BearPi-HM_Micro_small - 码云 - 开源中国 (gitee.com)
自此,openHarmony操作硬件寄存器的基本流程已经介绍完毕,供阅读参考。
4 .openHarmony GPIO驱动使用
【补充】:STM32MP157 GPIO管脚号计算 PXY = = [X] * 16 + Y
其中 [X]: [A] = 0, [B] = 1,[C] = 2,[D] = 3,[E] = 4,[F] = 5,[G] = 6,[H] = 7,[I] = 8,[J] = 9,[K] = 10,[Z] = 11
如 : PA0 = 0 * 16 + 0 = 0 ; PC10 = 2 * 16 + 10 = 42
【Tips】:GPIO驱动使用时,仅能支持一个GPIO管脚设置中断,重复其他管脚会导致系统运行异常
