MC9S12G128模块化分层化软件架构之七_外部中断

2023-05-16

文章目录

内容

1        overview

1.1        目的

2        优化内容

2.1        软件功能

2.2        编程健壮性

3        软件实现

3.1        Coding Rule

3.2        中断基础知识

3.2.1        mc9s12g128的中断向量号

3.2.2        mc9s12g128中断向量表

3.3        driver层

3.3.1        drio_cfg.c

3.3.2        drio_cfg.h

3.3.3        drio.c

3.3.4        drio.h

3.3.5        新建drint.c

3.3.6        新建drint.h

3.4        中间件module层优化

3.4.1        mdio_cfg.h

3.4.2        mdio_cfg.c

3.4.3        mdio.c

3.4.4        mdio.h

3.5        应用层

3.5.1        apl_key.h

3.5.2        apl_key.c

3.6        main.c

3.6.1        main

4        软件测试及调试

4.1        PORTJ验证代码

4.2        MCU register

4.2.1        中断使能寄存器PIEJ

4.2.2        极性选择寄存器PPSJ

4.2.3        中断标志位寄存器PIFJ

5       实物展示

上一期的

MC9S12G128模块化分层化软件架构之六——KEY代码下载地址:

https://download.csdn.net/download/Sure_gengjia/12801323

实物展示:

更多内容,请持续关注公众号:激活未来

 

 

  • 1      overview

  • 1.1    目的

本文档用于起点开发板的外部中断模块软件说明。

不局限于硬件功能的实现,着眼于实现高质量、优美的软件

  • 2       优化内容

  • 2.1     软件功能

①      增加PORTA、PORTB、PORTC、PORTD和PORTAD引脚的相关配置;

②      driver层和module层针对新增的PORT进行调整;

2.2     编程健壮性

①     常量前增加const修饰;

②     仅用于本文件调用的变量和函数前增加static;

3      软件实现

3.1     CodingRule

具体可在源码的\Sources\code_rules.txt中可见。

3.2     中断基础知识

3.2.1         mc9s12g128的中断向量号

见mc9s12g128.h文件的第51行,如下:

 

每一个中断处理函数都要有一个中断向量号,中断处理函数格式如下:

3.2.2         mc9s12g128中断向量表

每个中断发生后,PC都会跳转到对应的地址去取值,然后进入不同的中断处理函数中。

3.3    driver层

3.3.1         drio_cfg.c

change log:

3.3.1.1          新增drio_enable_interrupt_reg[]中断使能使能寄存器

如下:

在mc9s12g128数据手册中提到:

只有PORTP、PORTJ和PORTAD支持外部中断功能,如下:

注意:由于不是所有的PORT都支持中断,所有在使能中断时不能像其他寄存器一样在drio_enable_interrupt_reg[]中直接用PORT的枚举索引,需要在PORTP的基础上索引中断使能寄存器,如使能PORTJ的PIN3,应写成:

BYTEOP_BIT_SET_AT(*drio_interrupt_flag_reg[DRIO_PORTJ - DRIO_PORTP], DRIO_PIN3);

 

3.3.1.1.1    PIEP

在MC9S12G128.h中的定义:

在芯片手册中的定义:

3.3.1.1.2     PIEJ

在mc9s12g128.h中的定义:

在datasheet中的定义:

3.3.1.1.3     PIE1AD

在mc9s12g128.h中的定义:

在datasheet中的定义:

3.3.1.1.4     PIE0AD

在mc9s12g128.h中的定义:

在datasheet中的定义:

3.3.1.2          新增drio_interrupt_flag_reg[]中断标志位寄存器

如下:

在mc9s12g128数据手册中提到:

只有PORTP、PORTJ和PORTAD支持外部中断功能。

注意:由于不是所有的PORT都支持中断,所有在查询使能中断时不能像其他寄存器一样在drio_interrupt_flag_reg[]中直接用PORT的枚举索引,需要在PORTP的基础上索引中断使能寄存器,如查询PORTJ的PIN3中断标志位,应写成:

BYTEOP_BIT_READ_AT(*drio_interrupt_flag_reg[DRIO_PORTJ - DRIO_PORTP], DRIO_PIN3);

3.3.1.2.1     PIFP

在mc9s12g128.h中的定义:

在datasheet中的定义:

3.3.1.2.2     PIFJ

在mc9s12g128.h中的定义:

在datasheet中的定义:

3.3.1.2.3     PIF1AD

在mc9s12g128.h中的定义:

在datasheet中的定义:

3.3.1.2.4     PIF0AD

在mc9s12g128.h中的定义:

在datasheet中的定义:

3.3.1.3          新增drio_pins_in_port[]

用于确定每个port有多少个引脚PIN。

3.3.2         drio_cfg.h

3.3.2.1          声明extern

3.3.3         drio.c

3.3.3.1          修改drio_set_pin_pull()

只有PORTT、PORTS、PORTM、PORTP、PORTJ和PORTAD有上下拉极性选择,所以drio_polarity_select_reg[]中是以PPST开始的寄存器。

3.3.3.2          增加drio_enable_interrupt()

使能中断使能前先清中断标志位。

3.3.3.3          增加drio_set_pin_int_type()

设置中断类型:上升沿中断还是下降沿中断,由于中断方式选择和上下拉极性选择是同一个寄存器,但是支持中断的只有PORTP、PORTJ、PORTAD,所以要从PORTP开始,增加有效port范围检查。

3.3.4         drio.h

3.3.5         新建drint.c

change log:

3.3.5.1          新增drint_portj_isr()

PORTJ中断处理函数:

说明:

1.       所有的中断处理函数都要在非分页区,因为16位芯片的MC9S12寻址范围0~2^16,十六进制范围(0, 0xFFFF),这个地址范围内是非分页区;

2.       中断处理函数需要有中断向量号,VectorNumber_Vportj为PORTJ中断向量号,具体的中断向量号可以在mc9s12g128.h的第51找到;

3.       PIFJ是PORTJ中断标志位寄存器,应在处理完任务之后写1清中断标志位;清中断标志位是为了下次中断能正常进入;在处理完之后再清中断标志位是防止在没有处理完中断处理任务时PORTJ再次触发中断,造成中断嵌套,造成处理错乱。

3.3.5.2          新增drint_portp_isr()

PORTP外部中断处理函数:

3.3.5.3          新增drint_portad_isr()

PORTAD中断处理函数:

在中断处理函数接收后,需要声明代码段恢复到默认代码段。

代码段定义在Project.prm中可见:

3.3.6         新建drint.h

中断处理函数自下而上调用callback函数,driver层调用module中间层,使用宏替换实现。

3.4    中间件module层优化

3.4.1         mdio_cfg.h

change history:

3.4.1.1          增加中断类型枚举

枚举数值需要和极性选择对应,在数据手册中可见,对于支持中断的PORT,极性选择寄存器1代表pulldown,同时代表上升沿中断选择;0代表pullup,同时代表下降沿中断选择。输入和中断不能同时选择,可以共用这个寄存器。

3.4.1.2          修改MdIoInputCfgStruct

增加中断类型选择

3.4.2         mdio_cfg.c

change log:

3.4.2.1          修改mdio_input_cfg[]

增加int_type选择,KEY1设置为下降沿触发中断,KEY2设置为上升沿触发中断。

根据原理图可知,对应的按键

key

SW丝印标号

PIN

key1

SW4

PJ4

key2

SW5

PJ5

key3

SW6

PJ6

key4

SW3

PJ7

 

3.4.3         mdio.c

change log:

3.4.3.1          io初始化函数mdio_init优化

1.       增加中断类型判断;

2.      如果配置了中断,设置中断触发方式,并使能中断;

3.4.3.2          增加静态函数uint8 mdio_find_in_input_cfg(uint8port, uint8 pin)

根据port和pin找到在mdio_input_cfg[]数组中排第几个,返回给mdio_portj_isr_callback(),便于应用层查询。

3.4.3.3          增加mdio_portj_isr_callback()

中间层中断处理函数callback函数,根据产生中断的PORT和pin查找到配置的index,然后传递给应用层,便于应用层处理。

3.4.4         mdio.h

新增函数声明:

3.5    应用层

3.5.1         apl_key.h

有原理图知:按键按下,PIN脚电平为0,松开为1。

3.5.2         apl_key.c

3.5.2.1          新增void apl_key_int_handler(uint8 keyx)

用于按键中断处理。第一个按键触发中断,LED1~LED4开,LED5~LED8关,第二个按键触发中断,LED1~LED4关,LED5~LED8开。

3.6    main.c

3.6.1         main

1.       调用初始化函数;

2.      调用周期任务;

4       软件测试及调试

4.1    PORTJ验证代码

4.2    MCU register

4.2.1         中断使能寄存器PIEJ

PORTJ的中断使能寄存器PIEJ,从图中可以看出,我们需要PIEJ位4到位5都为1,即使能中断。

4.2.2         极性选择寄存器PPSJ

根据mdio_cfg.c中的配置,在KEY1对应的PJ4设置为下降沿触发中断,KEY2对应的PJ5设置为上升沿触发中断,所以PPSJ极性寄存器bit4应为0,bit5应为1, debug可以看到如下:

4.2.3         中断标志位寄存器PIFJ

4.2.3.1          没有按键触发中断时

在没有外部中断触发时,中断标志位寄存器都为0:

4.2.3.2          按键KEY1触发中断时

在drint.c中的drint_portj_isr()打断点,当按键KEY1按下时(下降沿):

此时的中断标志位寄存器PIFJ的位4为1:

在中断处理函数接收后清中断标志位后,中断标志位重新恢复到0x00。

4.2.3.3          按键KEY2触发中断时

在drint..c中的drint_portj_isr()打断点,当按键KEY2按下并松开时(上升沿):

此时的中断标志位寄存器PIFJ的位4为1:

在中断处理函数接收后清中断标志位后,中断标志位重新恢复到0x00。

5      实物展示

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MC9S12G128模块化分层化软件架构之七_外部中断 的相关文章

随机推荐

  • Mavlink协议理解Pixhawk APM(一)

    有问题请回复评论 xff0c 然后邮箱提醒我回复 xff0c 550746284 64 qq com 私信不回 本系列博客共三篇 xff0c 这是第一篇 之前看了mavlink协议 xff0c 网上关于mavlink的资料不多 本文大概总结
  • Mavlink协议理解Pixhawk APM(二)

    本文是第二篇博客 xff0c 本系列博客共三篇 本文介绍mavlink里消息的种类和如何看懂开始时提到的那个官方的mavlink消息介绍https pixhawk ethz ch mavlink 有问题请回复评论 xff0c 然后邮箱提醒我
  • SqlServer数据库导入Excel数据:openrowset

    导入代码 xff1a declare 64 sql nvarchar 2000 declare 64 f excel varchar 100 set 64 f excel 61 39 导入文件名称 xlsx 39 IF EXISTS SEL
  • 安装ROS, 初始化时rosdep update出错解决办法

    背景 xff1a ubuntu上安装ROS xff0c 不管是在ubuntu16 04上装kinetic xff0c 还是在18 04上装melodic xff0c 安装完毕后 xff0c 进行初始化时 xff0c 反复失败 xff0c 试
  • Intel RealSense D435介绍、安装和使用

    实验室采购的三个Intel RealSense相机到了 xff0c 分别是D435 R200和blasterx senz3d xff0c 都试了一下 xff0c 除了适用的最佳距离范围不同 xff0c 其它功能大致相同 xff0c 用SDK
  • 配置适用于HoloLens开发的unity工程

  • HoloLens世界锚资料

    1 Unity 中的本地定位点传输 xff1a Unity 中的本地定位点传输 Mixed Reality Microsoft Docs https docs microsoft com zh cn windows mixed realit
  • HoloLens 2 之 Unity 开发基础入门指南

    研发实战 xff1a HoloLens 2 之 Unity 开发基础入门指南 知乎 查看 引用 信息源请点击 xff1a 映维网关于混合现实基础入门的指南 xff08 中文版 xff09 xff08 映维网 2021年03月15日 xff0
  • PCL学习资料

    01 代码学习博主 xff1a PCL读取PCD文件的数据 慕尘 博客园 1 pcd文件 rabbit pcd 链接 xff1a https pan baidu com s 1v6mjPjwd7fIqUSjlIGTIGQ 提取码 xff1a
  • obj文件格式与.mtl文件格式

    1 OBJ 是一种 3D模型文件 xff0c 因此不包含动画 材质特性 贴图路径 动力学 粒子等信息 但是可以读取 mtl 文件来获得材质信息 2 OBJ 文件使用 关键字根据数据类型排列 xff0c 每个关键字有一段简短描述 顶点数据 V
  • opencv_aruco

    文章参考 xff1a ArUco 木筏筏筏的博客 CSDN博客 aruco 1 01 显示识别mark cpp include lt opencv2 highgui hpp gt include lt opencv2 aruco hpp g
  • 详细图解,卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别

    博客园 xff1a https www cnblogs com baiduboy p 14234884 html
  • ORB角点检测--快速近似最近邻(FLANN)匹配--c++

    描述子匹配 图像特征检测首先会获取关键点 xff0c 然后根据关键点周围像素ROI区域的大小 xff0c 生成描述子 xff0c 完整的描述子向量就表示了一张图像的特征 xff0c 是图像特征数据 xff0c 这种方式也被称为图像特征工程
  • 二进制信号量,互斥信号和计数信号量的区别

    VxWorks的信号量机制分析 VxWorks信号量是提供任务间通信 同步和互斥的最优选择 xff0c 提供任务间最快速的通信 也是提供任务间同步和互斥的主要手段 VxWorks提供3种信号量来解决不同的问题 二进制信号量 xff1a 最快
  • WiFi智能开关方案

    伴随着物联网的蓬勃发展 xff0c 智能家居成为备受瞩目的新兴领域 xff0c 越来越多的智能产品进入消费市场并受到了广大用户的青睐 xff0c 用于控制设备状态的传统机械开关也面临智能化升级 市面上出现了各种各样的智能开关 xff0c 以
  • VNect: Real-time 3D Human Pose Estimation with a Single RGB Camera

    采用了两个CNN 第一个是卷积神经网络 CNN xff0c 在残缺的单目捕捉条件下返回二维和三维关节位置 xff1b 这是基于标记的3D人体数据集以及补充的2D人体姿态数据集训练的 xff0c 提升了捕捉性能 xff1b 第二部分结合回归的
  • 系统异常SVC与PendSV指令及CM3 处理器内部寄存器分析

    参考文献 1 野火 uCOS III 内核实现与应用开发实战指南 基于STM32 xff1b 2 CM3 权威指南CnR2 xff08 电子版 xff09 Cortex M3 权威指南 Joseph Yiu 著 宋岩 译 xff1b 两个指
  • RTOS任务调度思想汇总_2(任务时间管理)

    1 任务是独立的 xff0c 并且初始化后进入死循环 格式像主函数 xff1b 2 任务的任务控制块 xff1a 首先要定义每个任务的任务控制块变量 xff0c 任务控制块只是一个数据类型 数据结构 xff0c 其数据结构定义的元素有任务堆
  • C++类与对象之静态成员和静态成员函数

    C 43 43 面向对象编程中 xff0c 静态成员也是较为重要的 C 43 43 的变量存储区除了堆区和栈区之外 xff0c 还存在静态存储区 xff0c 用于存放static静态变量 xff0c 全局变量以及常量 xff0c 生命周期是
  • MC9S12G128模块化分层化软件架构之七_外部中断

    文章目录 内容 1 overview 1 1 目的 2 优化内容 2 1 软件功能 2 2 编程健壮性 3 软件实现 3 1 Coding Rule 3 2 中断基础知识 3 2 1 mc9s12g128的中断向量号 3 2 2 mc9s1