发新帖我要提问
12
返回列表
打印
[其它产品/技术]

英飞凌Aurix2G TC3XX Port&Dio模块详解

[复制链接]
楼主: 慢动作
手机看帖
扫描二维码
随时随地手机跟帖
21
慢动作|  楼主 | 2024-6-30 21:40 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
Port输出寄存器(Port Output Register,OUT)
当Pin脚被设置为GPIO输出时,可直接通过修改输出控制寄存器的值来输出电平,1就是高电平,0就是低电平。每个Port端口有一个OUT寄存器,16个位域对应16个Pin脚。

使用特权

评论回复
22
慢动作|  楼主 | 2024-6-30 21:41 | 只看该作者
Port输出修改寄存器(Port Output Modification Register,OMR)
如果我们需要修改某一个Pin脚,一般是希望Port中的其他Pin脚保持不变的,这时候如果使用OUT寄存器则需要先回读OUT的状态,再修改我们需要修改的位。但是这样未免有点浪费资源,因此我们可以通过操作OMR寄存器,只操作我们的目标位,其他位不进行修改。

每个Port有一个OMR寄存器,包括16个Set位和16个Clear位,分别对应16个Pin脚。


关于OMR的Pin脚具体操作,我们通过查询下表可知,如果要拉高某个Pin脚,就将PSx置1,拉低则将PCLx置1,如果要翻转两个都置1,而其他没有设置位的Pin脚则不会受影响。


然后这个修改是直接作用于OUT寄存器的,因此不用担心OUT不同步的问题,另外该寄存器是虚拟的,没有存储位的,也就是说写这个寄存器相当于执行一种操作,而不是修改某个值,回读的话也是0。

使用特权

评论回复
23
慢动作|  楼主 | 2024-6-30 21:41 | 只看该作者
Port输出修改置位寄存器(Port Output Modification Set Register,OMSR)
除了OMR寄存器,TC3XX还支持置位寄存器OMSR,它和OMR功能一样是虚拟寄存器,只不过是置位功能。每个Port端口有一个MOSR,16个位域对于16个Pin脚。


PSx:Pinx置位,1表示将该Pin脚拉高,0表示无操作;

同样的,OMSR的功能是将对应的OUT寄存器的位拉高,其他位则不进行操作。回读该寄存器的值为0.

使用特权

评论回复
24
慢动作|  楼主 | 2024-6-30 21:41 | 只看该作者
另外TC3XX还提供了4个OMSRx寄存器,同样是虚拟寄存器,区别在于每个寄存器只控制4个Pin脚,这里就不展开介绍了。


使用特权

评论回复
25
慢动作|  楼主 | 2024-6-30 21:42 | 只看该作者
Port输出修改清除寄存器(Port Output Modification Clear Register,OMCR)
和输出修改置位寄存器的功能相反,修改清除寄存器OMCR的功能是将目标位清零,其他位不作修改。每个Port端口有一个OMCR寄存器,和4个OMCRx寄存器,每个位域对应一个Pin脚。

使用特权

评论回复
26
慢动作|  楼主 | 2024-6-30 21:42 | 只看该作者
PCLx:Pinx清除位,1表示将该Pin脚拉低,0表示无操作;

使用特权

评论回复
27
慢动作|  楼主 | 2024-6-30 21:43 | 只看该作者
急停开关寄存器(Emergency Stop Register,ESR)
急停开关寄存器用于控制急停功能的使能,注意这里仅仅是使能,急停的触发在SCU模块内配置。每个Port端口有一个ESR寄存器,16个位域对应16个Pin脚。


ENx:Pinx急停开关使能位,0表示不使能,1表示使能;

使用特权

评论回复
28
慢动作|  楼主 | 2024-6-30 22:25 | 只看该作者
ENx:Pinx急停开关使能位,0表示不使能,1表示使能;
2.3.11 Port输入寄存器(Port Input Register,IN)
Port输入寄存器可以用来读取Pin脚当前的状态,无论Pin脚处于输入还是输出,都可以通过IN寄存器读取Pin脚的高低电平。每个Port端口有一个IN寄存器,16个位域分别对应16个Pin脚。



Px:Pin脚读取状态,0表示低电平,1表示高电平;

使用特权

评论回复
29
慢动作|  楼主 | 2024-6-30 22:25 | 只看该作者
寄存器总结
Port的内部逻辑其实不复杂,这里对控制寄存器做下总结:

Port需要设置输入输出,包括输入上下拉,输出推挽等,使用输入输出控制寄存器IOCR;
驱动模式需要调整以适配不同的硬件需求,使用驱动模式寄存器PDR;
Pin脚如果复用为ADC,使用Pin脚AD功能寄存器PDISC;
Pin脚如果需要被外设控制例如使用RGMII接口,使用Pin脚控制选择寄存器PCSR;
Pin脚如果需要修改GPIO输出,可使用OUT、OMR、OMSR、OMCR;
读取Pin脚状态使用IN寄存器;

使用特权

评论回复
30
慢动作|  楼主 | 2024-6-30 22:25 | 只看该作者
使用示例
介绍完了内部原理及寄存器,下面我们基于Aurix 2G的官方MCAL,使用EB Tresos工具来进行配置。通过两个示例来给大家讲解如何进行Port的配置。第一个是一个Dio使用示例,第二个是SPI配置示例。

3.1 GPIO使用示例
Dio配置这里我们做一个Pin脚状态读取和Pin脚状态输出。我这边开发板上P00.7是一个输入按钮,所以输入我选择这个Pin脚,输出的话P00.6有一个LED灯,能够指示输出。软件上循环读取P00.7的状态,并将其值直接输出给P00.6。开发板上按键按下是低电平,LED灯是低电平点亮,所以这里表现应该是按下按键则灯亮。

使用特权

评论回复
31
慢动作|  楼主 | 2024-6-30 22:26 | 只看该作者
首先我们来到Port这里,打开P00.7界面,这里PortPinSymbolicName输入一下,方便维护;PortPinDirection配置为输入;其他基本不用修改。

使用特权

评论回复
32
慢动作|  楼主 | 2024-6-30 22:26 | 只看该作者
然后来到P00.6,配置为输出,PortPinInitialMode选择GPIO。

使用特权

评论回复
33
慢动作|  楼主 | 2024-6-30 22:26 | 只看该作者
然后我们来到MCAL的Dio模块,配置出Dio通道,Dio是一个依赖于Port的纯软件模块,用于GPIO的读写操作。


使用特权

评论回复
34
慢动作|  楼主 | 2024-6-30 22:26 | 只看该作者
代码中只需要将Port初始化就行了,Dio不需要初始化,然后在周期任务中读取、输出电平。
#include "Port.h"
Port_Init(&Port_Config);

#include "Dio.h"
Task()
{
      Dio_LevelType buttonLevel;
      
      /* Button and LED interaction. */
      buttonLevel = Dio_ReadChannel(DioConf_DioChannel_BUTTON1);
      Dio_WriteChannel(DioConf_DioChannel_LED2, buttonLevel);
}

使用特权

评论回复
35
慢动作|  楼主 | 2024-6-30 22:26 | 只看该作者
然后我们编译调试,可以看到灯随着按键操作变化。

使用特权

评论回复
36
digit0| | 2024-7-3 10:47 | 只看该作者
英飞凌Aurix 2G TC3XX的Port&Dio模块具备高性能通信与数字输入输出功能,支持多种接口配置,实现高效数据传输与灵活控制。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则