MC9S12G128模块化分层化软件架构之五——IO优化

更多内容,关注公众号:激活未来 

FS32K144即将登陆本公众号号,还是那句话:

不局限于硬件功能的实现,着眼于实现高质量、优美的软件

 

 

1      overview

1.1    目的

本文档用于起点开发板的GPIO模块软件优化说明。

不局限于硬件功能的实现,着眼于实现高质量、优美的软件

2       优化内容

2.1     软件功能

①      增加PORTA、PORTB、PORTC、PORTD和PORTAD引脚的相关配置;

②      driver层和module层针对新增的PORT进行调整;

2.2     编程健壮性

①     常量前增加const修饰;

②     仅用于本文件调用的变量和函数前增加static;

3      软件实现

3.1     CodingRule

具体可在源码的 .\MC9S12G128_IO_optimize\Sources\code_rules.txt中可见。

3.2    driver层优化

3.2.1         drio_cfg.c

3.2.1.1          drio_dir_reg[]方向寄存器优化

变化如下:

①      增加const修饰;

②      增加DRIO_HAS_PORTA2D宏配置;

③      增加DDR1AD和DDR0AD两个寄存器,用于PORTAD的引脚设置;

修改原因:

①      增加const原因:

根据coding rule,对于常量,需要增加const修饰;

②      增加DRIO_HAS_PORTA2D原因:

对于不同引脚的MC9S12G128,100脚是有PORTA到PORTD的,对于64PIN的并没有,所以这里可以增加宏在预编译时进行配置;

③      增加DDR1AD和DDR0AD两个寄存器:

PORTAD有16个引脚,DRIO_PIN0到DRIO_PIN7对应的方向寄存器是DDR1AD;DRIO_PIN8到DRIO_PIN15对应的方向寄存器是DDR0AD;

3.2.1.2          drio_data_reg[]数据寄存器优化

改动如下:

①      增加const修饰;

②      增加DRIO_HAS_PORTA2D宏配置;

③      增加PT1AD和PT0AD两个寄存器,用于PORTAD的引脚设置;

增加PT1AD和PT0AD修改原因:

PORTAD有16个引脚,DRIO_PIN0到DRIO_PIN7对应的数据寄存器是PT1AD;DRIO_PIN8到DRIO_PIN15对应的数据寄存器是PT0AD;

 

3.2.2         drio_cfg.h

3.2.2.1          宏定义DRIO_HAS_PORTA2D

变化如下:

从下图中可以看出,MC9S12G128中的引脚不仅仅是PORTE、PORTT、PORTS、PORTM、PORTP、PORTJ,还有PORTAD,如果引脚是100脚的MC9S12G128还有PORTA、PORTB、PORTC、PORTD。但是因为引脚个数的限制,并不是所有的MC9S12G128都有PORTA到PORTD,所以可以使用宏来配置是否有PORTA到PORTD这几个PORT。

原来的drio_cfg.h只有PORTT、PORTS、PORTM、PORTP、PORTJ,现在增加PORTAD和PORTA、PORTB、PORTC、PORTD。

其中PORTAD是一个特殊的PORT,因为PORTAD有16个引脚。其寄存器如下:

为了便于driver层调用drio_dir_reg[]等级寄存器数组进行索引,而不需要对PORTAD单独处理,将PORTAD分为DRIO_PORTAD和DRIO_PORTAD_DUPLICATE。上层module层调用时,只需要选择DRIO_PORTAD这个port即可,当引脚大于DRIO_PIN7时,port加一,变为DRIO_PORTAD_DUPLICATE去索引drio_dir_reg[]和drio_data_reg[],这两个寄存器数组的变化见drio_cfg.c。

3.2.2.2          枚举DRIO_PIN

变化如下:

由于POATAD由16个引脚,为例module层在配置GPIO时,在选择引脚时不必纠结于是PT0AD还是PT1AD的引脚,而只需要选择DRIO_PORTAD和DRIO_PIN0还是DRIO_PIN15。因为在原理图和芯片手册引脚配置图中,只有PAD0到PAD15,如下图:

至于如何设置对应的方向寄存器和数据寄存器,已在drio_cfg.c和drio.c中设置好。具体可以见drio_cfg.c和drio.c章节。

3.2.2.3          声明extern

3.2.3         drio.c

change log:

3.2.3.1          drio_set_pin_input

变动如下:

除了port范围和pin范围的有效性检查外,针对PORTAD的DRIO_PIN8到DRIO_PIN15增加的port处理,原因在drio_cfg.h和drio_cfg.c中可见;

port范围和pin范围的有效性检查是为了防止drio_dir_reg[]数组越界,其实在上层module层已经做了防越界处理,这里也可以省略。

3.2.3.2          drio_set_pin_output优化

3.2.3.3          drio_set_pin_value优化

3.2.3.4          增加drio_read_pin

为下节读取引脚电平的按键采集作准备。

3.3    中间件module层优化

3.3.1         mdio_cfg.c优化

常量增加const修饰。

如下:

3.3.2         mdio_cfg.h

extern  变量声明

3.3.3         mdio.c

3.3.3.1          io初始化函数mdio_init优化

指针改为指向常量的指针

4       软件测试及调试

4.1    PORTAD验证代码

增加了PORTAD后,为了验证PORTAD可以正确设方向寄存器和数据寄存器,在drio_cfg.c中增加PORTAD的输出设置,如下:

4.2    MCU register

4.2.1         DDR数据方向寄存器

PORTAD的方向寄存器DDR1AD和DDR0AD,从图中可以看出,我们需要DDR1AD和DDR0AD每个位都为1,即output。 debug时可以看到:DDR1AD和DDR0AD每个位都为1。

4.2.2         Data Register数据寄存器

根据mdio_cfg.cz中的配置,PT1AD应该为0x55,PT0AD应该为0xff,debug可以看到如下:

根据原理图:

测试左侧引脚电平从AN0到AN7为1 0 1 0 1 0 1 0,对应PT1AD为0x55,右侧引脚均为高电平。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值