源码地址://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 |
MC9S12G128(100pin) |
MC9S12G128(64pin) |
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
函数声明: