ONGOING!
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_KEY\Sources\code_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的滤波。
根据原理图可知,对应的按键
key |
SW丝印标号 |
PIN |
key1 |
SW4 |
PJ4 |
key2 |
SW5 |
PJ5 |
key3 |
SW6 |
PJ6 |
key4 |
SW3 |
PJ7 |
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。
今天的文章mct模块_mc9s12xs128单片机「建议收藏」分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/85297.html