一、概述
本篇文章主要描述了 E3 的 GPIO 口作为 input/output 时的具体设置。
二、 HandsOn 1
选取一个 port,配置为 DO,在测试程序中实现拉高,拉低,反转。在 jlink 仿真时使用 IAR 单步执行,并打开 memory 显示窗口,输入 port 对应的输出值地址,观察对应Bit 位的变化。
选取的 port 为 GPIO_B10 ,使用 example 示例程序中的 dio_example.c 实现( E3110 ):
1、在 EB 项目下,在 E3_ref_getway 下打开 port 组别,在 port 栏下选择“PortContainer”标签,
添加 GPIO_B 的 PortContainer ;
PortNumberOfPortPins 是显示使用了多少个 IO 口;
PortNumberOfPortPins 表示该组 GPIO 中实际配置的 PortPin数目。
2、进入 GPIO_B 内,选择 PortPin 标签,添加命名为 Naib_out 的 PortPin ,其中PortPinId 列需从 1 开始,而非 0。
3、进入 PortPin 设置 Port 参数,其中 PinID 选择使用的 GPIO 口 GPIO_B10 ,Mux 复用功能选择 GPIO。
4、配置 Dio ,因为使用的 GPIO_B10 ,根据 SD tool ,其 ChannelID 为 55,属于 port1,所以加入到已存在的 DioPort_1 内,如其他组别的 GPIO ,则使用加号,添加对应的组别,并设 DioPortId为对应组别数字。
5、配置完成后,保存,并检查和生成代码。
6、完成后,可以在输出的代码中查看配置的参数, output/src/Port_Cfg.c 文件末尾, 可以看到新配置的 GPIO_B10 参数。
宏定义 DioConf_DioChannel_Naib_Ch ,在 EB 生成 C 文件时产生,在项目文件\MCAL_release\Mcal_Cfg\E3_ref_gateway\output\include\Dio_Cfg.h 文件内。
Dio_WriteChannel(ChannelId, level) 函数为对应 ChannelId 的 GPIO 口输出电平。
Dio_FlipChannel(ChannelId) 函数为反转对应 ChannelIdId 的 GPIO 口输出电平。
①设置断点,检查编译并下载 debug 程序,点击运行。点击菜单栏 View – Memory ,添加Memory 1 窗口。
②在串口软件中发送 dio test ,则会进入 dio_test() 函数,停在断点处。
GPIO_B10 的地址计算:
GPIO_B10 的ChannelId为55,属于 Port1,为 GPIO_SAFETY ,起始地址为 0xF074_0000;
Port1 的偏移地址 offset 为 0x680+(1*0x10)=0x690 ;两个地址相加: 0xF074_0690
三、HandsOn 2
选取一个 port,配置为 DI ,并使能中断模式,编写测试代码,在中断处理函数中打印对应的 port ID。运行后给对该 port 输入配的的中断触发信号,在终端能够观察到打印信息。
1、因为需要使用中断功能,所以需将 Port 的 PortSetPinINTDetect 功能打开。
2、添加命名为 DI 的 PortPin ,配置引脚上电默认输出电压为高电平,中断触发方式为下降沿触发。
3、在 IAR 项目内,打开 dio_example.c 文件,添加头文件 Dio_Irq.h ,和 irq_test() 函数,并在 dio_test() 函数内加入 irq_test() 函数。
①添加的 irq_test() 函数为关联中断标志和中断函数,因为 GPIO_B10 属于 GPIO_SAFETY port1,所以使用 GPIO_SF_SYNC_GRP_1_INTR_NUM;
②因为中断函数 GPIO_Irq4Handler 内 id 会自减 1 ,所以使用 2 ;中断函数 GPIO_Irq2Handler 定义在 Dio_Irq.h ,所以添加头文件 Dio_Irq.h;
③使能 GPIO_SF_SYNC_GRP_1_INTR_NUM。
4、进入中断后:
在 Dio_IP.C 文件内一层一层调用函数, GPIO_Irq4Handler() -> Dio_Ip_IrqHandler()->
Dio_UserCallouts(),进入 Dio_UserCallouts.c 文件。
在文件内添加头文件 Dio_Cfg.h 和 debug.h ,和 switch case 并打印传参对应的ChannelId 的程序。
Dio_Cfg.h 是 GPIO_B10 的宏定义 DioConf_DioChannel_DO_IN 文件, debug.h 是函数 PRINT() 文件。
5、编译并烧录程序后,通过串口软件写入 dio test ,再使用杜邦线将地和 GPIO_B10 引脚短接后松开,串口软件中会打印对应的串口数据。
四、Reference:
[1] E3系列MCAL_Example_Description_
[2] SemiDrive_E3_MCAL_User_Guide_Rev02.00
欢迎在博文下方留言评论,我们会及时回复您的问题。如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com
作者:Naib Zhou / 周甜甜
评论