历史上的今天
今天是:2025年08月10日(星期日)
2021年08月10日 | MC9S12G128模块化分层化软件架构之五——IO优化
2021-08-10 来源:eefocus



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_optimizeSourcescode_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,右侧引脚均为高电平。
史海拾趣
|
VS2005静态调用调试出现错误 在WINCE上的调试 谁帮我看下 2>部署和/或注册失败,错误为: 0x8973190e。 写入文件“%CSIDL_PROGRAM_FILES%\\diaoyong2\\diaoyong2.exe\\diaoyong2.exe”时出错。错误 0x80070003: 系统找不到指定的路径。… 查看全部问答> |
|
目前有一个项目主要有如下问题诚觅大侠帮忙指点: 1.长按开机,目前我们一按就开机 2.开机Logo,动态显示 3.电源dvfs算法,电源动态管理 4.GPIO唤醒 5.系统是使用3972作为PMIC,还需要实现关机 6.开发环境目前对C#支持不好,SDK没有带仿真环境 ...… 查看全部问答> |
|
-----海腾数据◇庆圣诞迎元旦◇推出以下活动:----- ◇河南网通◇Intel PD双核915芯片散热CPU4M缓存-本月限量销售一年送产权6800元 CPU处理器:Intel PD 915双核处理器( 4M缓存) 内存:1024MB DDR2内存 硬盘:160GB SATA2硬盘/7200转 网卡:Inte ...… 查看全部问答> |
|
装了QUARTUS II7.2 仅仅可以用SOPC BUILDER 装了QUARTUS II7.2 仅仅可以用SOPC BUILDER,好象没有网络上众人说的DSP BUILDER呀,找不到点哪可以点出来。倒是装好QUARTUS II7.2后的文件包的一个QUARTUS文件夹里有SOPC BUILDER和DSP BUILDER文件夹。 是不是要另外装DSP BUILDER的相关文件才能 ...… 查看全部问答> |
|
http://item.taobao.com/item.htm?id=9137242939 板子说明在这里,想换个NXP的 或者ATMEL的cortex M3的玩玩!别的好东西也可以联系我QQ:343627392… 查看全部问答> |
|
关于MSP430的存储温度,datasheet里面是这样说的: storage temperature,Tstg(unprogrammed device)...........-55℃ to 150℃ storage temperature,Tstg(programmed device)...........-40℃ to 150℃ 是不是已经编过程序的器件的存 ...… 查看全部问答> |
|
1 GPIO 初始化 #include \"f2802x_common/include/gpio.h\" //首先包含头文件 GPIO_Handle myGpio; //定义了一个指向GPIO寄存器的句柄,就是指针,居然这么写 //接下是初始 ...… 查看全部问答> |

















