MC9S12G128模块化分层化软件架构之六——KEY
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。
MC9S12G128模块化分层化软件架构之六——KEY相关推荐
- MC9S12G128模块化分层化软件架构之四——LED
源码下载:https://download.csdn.net/download/Sure_gengjia/125628 内容关注公众号:激活未来 1 overview 1.1 目的 本 ...
- MC9S12G128模块化分层化软件架构之二——IO驱动
源码地址://download.csdn.net/download/Sure_gengjia/1253037 PDF文档://download.csdn.net/download/Sure_gengj ...
- MC9S12G128模块化分层化软件架构之五——IO优化
更多内容,关注公众号:激活未来 FS32K144即将登陆本公众号号,还是那句话: 不局限于硬件功能的实现,着眼于实现高质量.优美的软件. 1 overview 1.1 目的 本文档用于 ...
- MC9S12G128模块化分层化软件架构之九_ClockAndRTI
修改历史 内容 1 overview 1.1 目的 2 question 3 软件实现 3.1 Coding Rule 3.2 ...
- MC9S12G128模块化分层化软件架构之十——TaskSchedule任务调度
修改历史 内容 1 overview 1.1 目的 1.2 综述 2 question 3 软件实现 3.1 Cod ...
- 系分架构 - 软件架构设计
个人总结,仅供参考,欢迎加好友一起讨论 文章目录 系分&架构 - 软件架构设计 考点摘要 概念 架构的 4 + 1 视图 软件架构风格 经典五大架构风格 调用/返回风格 独立构件风格 虚拟机风 ...
- 分层化网络设计:核心层,汇聚层,接入层
核心层,汇聚层,接入层 分层化网络设计模型可以帮助设计者按层次设计网络结构,并对不同层次赋予特定的功能,为不同层次选择正确的设备和系统.三层网络模型是最常见的分层化网络设计模型,通常划分为接入层.汇聚 ...
- 瀑布模型:像工厂流水线一样把软件开发分层化
今天我们聊一聊这个软件工程中的瀑布模型. 瀑布模型算是现代软件工程的起源,软件工程的发展,很大部分都是构建于瀑布模型的基础之上的.我们后面所学的软件工程的很多内容,都是源自瀑布模型的衍生,或者其中某个 ...
- 一种Android客户端架构设计分享
转载请注明出处:http://blog.csdn.net/ahence/article/details/56678126 技术发展日新月异,业界各种Android客户端架构设计,五花八门,但我们不能简 ...
最新文章
- 关键字static、const、volatile的作用
- ServiceStack.Redis的问题与修正
- 关于ssh 配置文件的参数说明
- pyqt5讲解8:容器QTabWidget,QStackedWidget,QDockWidget
- 使用route命令解决一机双网访问
- 再论数据仓库与数据库的区别
- 百度课程——基于深度学习的自然语言处理
- 五步构建经营指标,拒绝分析不接地气
- Unable to round-trip http request to upstream: EOF
- keli中逻辑分析仪的使用
- 离散数学(五):命题逻辑的推理理论
- linux鼠标怎么取出来,浅析linux中鼠标数据读取
- jupyter notebook的安装与启动
- linux服务器被攻击怎么办
- tableau:柱图的两种实现方式
- 前端一键切换深色模式
- carsim2020.0的教程在“将HDWDZDPPV6 替换成 复制的HostID”这个步骤总是安装失败,解决这个问题,成功安装carsim2020.0的经验
- bp神经网络的主要功能,一文搞定bp神经网络
- vue 项目实战 递归
- java类型转换的例子
热门文章
- 写一些关于如何运用计算机英语,关于介绍电脑的英语作文,80词左右.
- 用Python爬虫来爬写真网图片
- Ubuntu 15.10 安装 小米/360 2代等随身WIFI驱动
- 经济研究之关于ROE指标//2021-2-3
- 中英文文本分类的区别
- 全球与中国远程家庭监控系统市场深度研究分析报告
- iPhone文件路径大全
- 中标麒麟安装达梦数据库DM8
- c语言开发一个学生成绩统计程序,用C语言实现成绩统计程序的设计课程设计报告.doc...
- 在MAC下,使用anaconda,解决python画图时中文乱码