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_KEYSourcescode_rules.txt中可见。
3.2 driver层
3.2.1 drio_cfg.c
change log:
3.2.1.1 新增drio_pull_enable_reg[]上拉使能寄存器
如下:
3.2.1.1.1 PCUR
在MC9S12G128.h中的定义:
在芯片手册中的定义:
3.2.1.1.2 PERT
在mc9s12g128.h中的定义:
在datasheet中的定义:
3.2.1.1.3 PERS
在mc9s12g128.h中的定义:
在datasheet中的定义:
3.2.1.1.4 PERM
在mc9s12g128.h中的定义:
在datasheet中的定义:
3.2.1.1.5 PERP
在mc9s12g128.h中的定义:
在datasheet中的定义:
3.2.1.1.6 PERJ
在mc9s12g128.h中的定义:
在datasheet中的定义:
3.2.1.1.7 PER1AD
在mc9s12g128.h中的定义:
在datasheet中的定义:
3.2.1.1.8 PER0AD
在mc9s12g128.h中的定义:
在datasheet中的定义:
3.2.1.2 新增drio_polarity_select_reg[]极性选择寄存器
如下:
3.2.1.2.1 PPST
在mc9s12g128.h中的定义:
在datasheet中的定义:
3.2.1.2.2 PPSS
在mc9s12g128.h中的定义:
在datasheet中的定义:
3.2.1.2.3 PPSM
在mc9s12g128.h中的定义:
在datasheet中的定义:
3.2.1.2.4 PPSP
在mc9s12g128.h中的定义:
在datasheet中的定义:
3.2.1.2.5 PPSJ
在mc9s12g128.h中的定义:
在datasheet中的定义:
3.2.1.2.6 PPS1AD
在mc9s12g128.h中的定义:
在datasheet中的定义:
3.2.1.2.7 PPS0AD
在mc9s12g128.h中的定义:
在datasheet中的定义:
3.2.2 drio_cfg.h
3.2.2.1 声明extern
3.2.3 drio.c
change log:
3.2.3.1 新增drio_set_pin_pull
变动如下:
除了port范围和pin范围的有效性检查外,针对PORTAD的DRIO_PIN8到DRIO_PIN15增加的port处理,原因在drio_cfg.h和drio_cfg.c中可见;
port范围和pin范围的有效性检查是为了防止drio_pull_enable_reg[]和drio_polarity_select_reg[]数组越界。
3.3 中间件module层优化
3.3.1 mdio_cfg.h
change history:
3.3.1.1 增加MdIoPullType上拉类型枚举
3.3.1.2 修改debounce方式枚举类型名为MdIoDebType
统一命名规范。
3.3.1.3 修改MdIoInputCfgStruct
1.增加上下拉选择;
2.修改deb_ctr为deb_max;这是debounce的阈值;
3.3.1.4 修改输入IO采样结果的结构体MdIoInputDataStruct
1.修改名字为MdIoInputDataStruct;
2.增加debouncecounter计数器;
3.3.1.5 修改IOInputCfg_NULL
3.3.2 mdio_cfg.c
change log:
3.3.2.1 修改mdio_input_cfg[]
这里给每个按键进行20ms的滤波。
根据原理图可知,对应的按键
3.3.3 mdio.c
change log:
3.3.3.1 增加输入PIN脚电平采集函数的周期长度
目的:将输入采样函数做成周期调用的函数;
3.3.3.2 io初始化函数mdio_init优化
1.增加上下拉判断和设定;
2.给mdio_input_data[].raw_value和mdio_input_data[].deb_value增加初始值;
3.3.3.3 mdio_input_info[]改名为mdio_input_data[]
3.3.3.4 增加三个input IO采样函数
1.mdio_input_sample
2.mdio_input_sample_opt
3.mdio_input_sample_opt2
此处以最终的mdio_input_sample_opt2周期任务为例:
3.3.3.4.1 mdio_input_sample任务最终实现的功能
1. 采集每个配置的输入PIN脚的原始值——raw_value;
2.根据配置方式进行滤波处理,设置deb_value;
3.将采集到的数据存储在mdio_input_data[]中;
3.3.4 mdinit.c
调用所有module层的初始化函数。
3.4 应用层
3.4.1 apl_key.c
注意网络标号和丝印不一致,后期会改善,此处的LED1和KEY1皆为网络标号。
检测到按键1按下点亮LED1,松开关闭LED1;
检测到按键2按下点亮LED2,松开关闭LED2;
检测到按键3按下点亮LED3,松开关闭LED3;
检测到按键4按下点亮LED4,松开关闭LED4;
3.4.2 apl_key.h
有原理图知:按键按下,PIN脚电平为0,松开为1。
3.5 main.c
3.5.1 delay_1ms ()模拟1ms定时器
提供1ms时间节拍。
3.5.2 timer_counter_task()模拟时间片管理
65532->65533->65534->65535->0
如果 C_plio_input_sample_task_perido为4,65532能整除4,mdio_input_sample可以执行,65533,65534,65535不能整除4,mdio_input_sample任务不能执行,
65535加一为0,任务可以执行,这样的话,时间间隔就不是4ms了,所以mdsys_time不能让它加满自动归零,应该在65532即65535-65535%4之前归零。
3.5.3 apl_task()APP任务
调用所有应用程序周期任务。
3.5.4 main
1.调用初始化函数;
2.调用周期任务;
4 软件测试及调试
4.1 PORTJ验证代码
4.2 MCU register
4.2.1 DDR数据方向寄存器
PORTJ的方向寄存器DDRJ,从图中可以看出,我们需要DDRJ位4到位7都为1,即input。 debug时可以看到:DDRJ每个位都为0,由于DDRJ的reset值为0x00,可以从datasheet中查到。
4.2.2 Data Register数据寄存器
根据mdio_cfg.c中的配置,在没有按键按下时,PTJ应该为0xff, debug可以看到如下:
此时按下KEY2:
PTJ的bit5为0,即输入为低电平。
4.3 raw_value测试
在mdio.c的io_input_data_ptr->raw_level= raw_value处打断点:
4.4 debounce测试
没有按键按下时:
当按下KEY2时:
debounce counter达到配置的20时,将raw_value赋值给io_input_data_ptr->deb_level。
上一篇:MC9S12G128模块化分层化软件架构之七_外部中断
下一篇:MC9S12G128模块化分层化软件架构之五——IO优化
推荐阅读最新更新时间:2024-10-29 10:59
设计资源 培训 开发板 精华推荐
- Si4455 EZRADIO 双向链路演示套件
- DRV8701_MOTOR_DRIVER
- LT1359 的典型应用 - 四路 25MHz、600V/us 运算放大器
- TB67S179FTG 2 相单极步进电机驱动器评估板
- RD-401,使用 FCM8531QY 三相 PMSM/BLDC 控制器的参考设计,用于 PSMS 电机驱动系统应用
- AP5725 升压型白光 LED 驱动器的典型应用
- 1800 - 2500 MHz 接收器应用中的 BGA622 硅锗通用低噪声放大器 MMIC 配置 A
- 1.8V、1.8V DC-DC多路输出手机电源
- DER-396 - 20W 高效>86% TRIAC 可调光 LED 驱动器,用于 PAR38 灯具
- ADP2138CB-2.5EVALZ,ADP2138 评估板,800 mA,输出电压 2.5 V,3 MHz 降压稳压器