历史上的今天
返回首页

历史上的今天

今天是: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,右侧引脚均为高电平。

推荐阅读

史海拾趣

3L Electronic Corporation公司的发展小趣事

作为一家有社会责任感的企业,3L Electronic Corporation始终关注环境保护和可持续发展。公司积极采用环保材料和生产工艺,减少对环境的影响。同时,公司还参与社会公益事业,回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展创造了良好的社会环境。

请注意,上述故事是基于公开信息和行业常识的概括描述,并不代表3L Electronic Corporation公司的真实发展历程。如需了解更多关于该公司的详细信息,建议查阅其官方网站或相关新闻报道。

中科银河芯(GXCAS)公司的发展小趣事
在饱和状态下,集电极和发射极之间的电压降(Vce)很小,通常在0.3V到0.4V之间。这意味着三极管在这两个极之间相当于一个低阻值的开关。
Anders DX公司的发展小趣事
输入信号的电压范围决定了三极管何时截止、何时饱和导通。
Deltron / DEM Manufacturing公司的发展小趣事

DEM Manufacturing一直注重技术创新和产品升级。在合并后的几年里,公司投入大量资源用于研发,推出了一系列具有创新性的电子产品。这些产品不仅满足了市场的多样化需求,还为公司赢得了良好的口碑和广泛的客户基础。

Electroswitch公司的发展小趣事

Electroswitch Electronics Products(以下简称“Electroswitch”)成立于1986年,是Electro Switch Corp的一个子公司,后者早在1946年就已创立。在创立之初,Electroswitch就致力于设计和制造高品质的开关产品,以满足电子应用领域的各种需求。通过不断的技术创新和产品优化,Electroswitch逐渐在电子行业中树立了良好的声誉。

Chemtronics公司的发展小趣事

近年来,Chemtronics通过一系列收购活动进一步扩大了其业务范围。其中,最引人注目的是其子公司Wits以超过6亿元人民币的价格收购三星电机的电信模块业务。这一收购不仅增强了Chemtronics在电信领域的实力,也为其未来的发展打开了新的篇章。

这五个故事展示了Chemtronics公司在电子行业中的发展历程,从最初的清洁剂产品到完整的产品线,从遵循高标准的质量制造到成为大型企业的全资子公司,再到无铅产品线的创新和收购三星电机电信模块业务,每一个阶段都体现了公司的创新精神和对市场需求的敏锐洞察。这些故事不仅记录了Chemtronics的成长轨迹,也展示了其在电子行业中的重要地位。

问答坊 | AI 解惑

VS2005静态调用调试出现错误 在WINCE上的调试 谁帮我看下

2>部署和/或注册失败,错误为: 0x8973190e。 写入文件“%CSIDL_PROGRAM_FILES%\\diaoyong2\\diaoyong2.exe\\diaoyong2.exe”时出错。错误 0x80070003: 系统找不到指定的路径。…

查看全部问答>

若干WinCE6+PXA303问题请教或兼职(上海)

目前有一个项目主要有如下问题诚觅大侠帮忙指点: 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的相关文件才能 ...…

查看全部问答>

diy 没示波器玩不转 想买一个200M左右的示波器

公司的便宜有不太好占 想买一个200M左右的示波器,大家给个建议 自己干活没这玩意不行啊。…

查看全部问答>

STM32的板子或芯片换NXP ATMEL 的!

http://item.taobao.com/item.htm?id=9137242939  板子说明在这里,想换个NXP的 或者ATMEL的cortex M3的玩玩!别的好东西也可以联系我QQ:343627392…

查看全部问答>

【讨论】关于MSP430的存储温度?

关于MSP430的存储温度,datasheet里面是这样说的: storage temperature,Tstg(unprogrammed device)...........-55℃ to 150℃ storage temperature,Tstg(programmed device)...........-40℃ to 150℃ 是不是已经编过程序的器件的存 ...…

查看全部问答>

恩智浦获奖捷报!

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 #恩智浦动态#恩智浦LPC11C00系列MCU荣获@中国电子报 “工业设计MCU 最佳(产品)解决方案”。恩智浦LPC11C00实现了LPC11 …

查看全部问答>

求晶振怎么样清洗最好

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 求晶振用什么机器清洗最好,用什么液体不会伤害到晶振使用 …

查看全部问答>

C2000 LAUNCHPAD DEMO 程序学习

1 GPIO  初始化   #include \"f2802x_common/include/gpio.h\"  //首先包含头文件   GPIO_Handle myGpio;  //定义了一个指向GPIO寄存器的句柄,就是指针,居然这么写   //接下是初始 ...…

查看全部问答>