MC9S12G128模块化分层化软件架构之二——IO驱动

源码地址://download.csdn.net/download/Sure_gengjia/1253037

 PDF文档://download.csdn.net/download/Sure_gengjia/12530929

MC9S12G128数据手册://download.csdn.net/download/Sure_gengjia/12530918

更多内容关注公众号:激活未来

1. overview

目的

本文档用于起点开发板的PORT模块软件编写说明。

2. 软件分层架构

软件分为底层驱动层——driver层,中间件层(本软件中称之为modules)和应用层——application。

 

2.1 driver

与MCU寄存器打交道的软件放在driver层。

diver层分为两部分,一部分是MCU芯片内部寄存器中需要配置的参数,每一个module里面有一个xxx_cfg.c,把MCU在本module中尽量多的寄存器都放在指针数组中,给上层的中间件层和driver层中的服务函数访问。

如在drio_cfg.c中定义drio_dir_reg[]

在drio.c中的drio_set_pin_input()函数会访问该数组以设置某个具体的port和pin的为输入属性。

2.2 中间件层

中间件中放每个模块的相关功能。中间件层分为两部分,一部分为服务函数,包括如每个模块的初始化(IO初始化,ADC初始化)、每个模块处理任务、每个模块数据采集任务。另外一部分为配置部分,需要根据硬件原理图填入对应的配置。

如在中间件层的mdio.c中,包括了IO的初始化部分和输入的IO的电平采集任务;

在mdio_cfg.c中,则是具体的IO输出输入配置;

3. port资源

* GPIO: PORTA、PORTB、PORTC、PORTD、PORTE、PORTT、PORTS、PORTM、PORTP、PORTJ和PORTAD;

* PORTT、PORTS、PORTM、PORTP、PORTJ和PORTAD每一个引脚有对应的上拉下拉使能寄存器行和上拉下拉选择寄存器;

* PORTA、PORTB、PORTC、PORTD和PORTE有一个单独的上拉下拉使能寄存器,PORTA、PORTB、PORTC、PORTD、只能上拉,PORTE只能下拉;

* PORTP、PORTJ和PORTAD支持外部中断;

起点开发板MCU为MC9S12G128,64引脚,外部资源如下表:

PORT

MC9S12G128100pin

MC9S12G12864pin

A

7-0

-

B

7-0

-

C

7-0

-

D

7-0

-

E

1-0

1-0

T

7-0

7-0

S

7-0

7-0

M

3-0

3-0

P

7-0

7-0

J

7-0

7-0

AD

15-0

15-0

 

3.1  数据方向寄存器DDR

以PORTT为例:

MC9S12G128数据手册定义如下:

DDRT在codeewarrior提供的mc9s12g128.h中的定义如下:

所以,要想PORTT的pin0、pin1、pin2、pin3为输出,pin4、pin5、pin6、pin7为输入,可以

DDRT = (unsigned char)(DDRT & 0x0fu);  //高四位清零

DDRT = (unsigned char)(DDRT | 0x0fu);   //低四位置一

 

3.2  数据寄存器

以PORTT为例:

MC9S12G128数据手册定义如下:

DDRT在codeewarrior提供的mc9s12g128.h中的定义如下:

要想读取PORTT的引脚0电平,可以直接对PTT取值,或者PTT_PTT0:

portt_pin0_value = PTT & 0x01;

//或者

portt_pin0_value = PTT_PTT0;

 

3.3  上拉下拉使能寄存器

以PORTT为例:

MC9S12G128数据手册定义如下:

PERT在codeewarrior提供的mc9s12g128.h中的定义如下:

要想PORTT的PIN0和PIN1使能上拉:

PERT = PERT | 0x03;

 

3.4 上拉下拉选择寄存器

以PORTT为例,MC9S12G128数据手册定义如下:

PPST在codeewarrior提供的mc9s12g128.h中的定义如下:

要想PORTT的PIN0和PIN1使能上拉:

PPST = PPST | 0x03;

 

 

4 软件实现

4.1 driver

4.1.1 drio_cfg.c

4.1.1.1 方向寄存器DDR

方向寄存器有DDRE, DDRJ, DDRM, DDRP, DDRS, DDRT,将这些寄存器放在指针数组中,方便索引:

定义好之后注意port方向寄存器定义顺序,根据port在数据手册中地址顺序:

修改之后定义为:

需要考虑的问题可在文件的change log中看到:

 

4.1.1.2  指针数组类型定义

在drio_cfg.h中重定义:

4.1.1.3 数据寄存器

数据寄存器有PORTE, PTJ, PTM, PTP, PTS, PTT,

将这些寄存器放在指针数组中,方便索引:

 

4.1.2 drio_cfg.h

4.1.2.1 port 枚举

该文件中枚举出有哪些port,方便在drio_cfg.c中索引数组中的指针:

 

4.1.2.2 PIN脚枚举

枚举出有哪些PIN

 

4.1.3 drio.c

该文件中主要有以下功能:

    • 引脚输出设置;
    • 引脚输入设置;
    • 引脚上拉下拉使能设置;
    • 引脚下拉下拉选择;

需要考虑的问题可以在文件的change log中看到:

4.1.3.1 引脚输出设置

形参:

port: drio_cfg.h中所有的枚举的port;

pin:drio_cfg.h中所有枚举的PIN;

4.1.3.2 引脚输入设置:

形参:

port: drio_cfg.h中所有的枚举的port;

pin:drio_cfg.h中所有枚举的PIN;

4.1.4 drio.h

函数声明

 

 

4.2 中间件module层

4.2.1 mdio_cfg.c

该文件与MCU原理图紧密关联,根据原理图,文件中应当定义有哪些port的哪些PIN是输出的,哪些port的哪些PIN是输入的,输入的引脚是否需要上拉还是下拉,是否需要debounce,debounce的时长是多少,debounce方式是什么?

考虑的问题可以在文件的log中看到:

4.2.1.1 引脚输出配置

 

 

输出的引脚具有以下属性:

· port

· pin

· open drain(可省略)

· 初始化引脚电平

· 进入睡眠模式的引脚电平

 

根据原理图,8个LED输出的引脚如下:

增加输出port和pin:

4.2.1.2 引脚输入配置

 

 

输出的引脚具有以下属性:

· port

· pin

· deb_type(debounce type)

· deb_ctr(debounce counter)

 

4.2.1.3 输出输入数组大小定义

 

 

 

 

4.2.2 mdio_cfg.h

 

4.2.2.1 输出数组类型结构体定义

 

 

 

 

 

4.2.2.2 输入数组类型结构体定义

4.2.2.3 debounce方式枚举定义

 

 

4.2.2.4 无效值定义

 

 

 

4.2.3 mdio.c

 

 

 

 

4.2.3.1 io初始化函数

 

 

4.2.4 mdio.h

函数声明:

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值