AURIX TC3XX GPIO-LED实验
声明:本文是在学习英飞凌 TC3XX系列多核 MCU 过程中整理的笔记,便于后期复习!
1、GPIO特征
控制最多16条端口;
通过软件能够控制每个端口的输出;
输出修改寄存器易于清除、设置和切换单个端口线和端口线的微调,而不影响其他端口的状态;
通过软件可以读取每个端口行的输入值;
每个输出最多可提供7个复用函数;
支持每个端口的直接I/O控制;
控制指定垫片的垫片特性,如驱动强度、转换速率、上/下拉、推/拉或开漏操作,以及TTL或CMOS/汽车输入电平的选择;
紧急停止功能允许通过SMU或特殊端口引脚关闭可配置端口线的输出驱动器;
对于具有LVDS功能的pad对,它控制LVDS特性,并允许在LVDS和CMOS模式之间切换;
在减少引脚数的包中,端口模块可以禁用选定的引脚。
2、GPIO 模式
TC3XX系列芯片 GPIO共有五种模式
NO_PULL, //无输入上下拉
PULLUP, //输入上拉
PULLDOWN, //输入下拉
PUSHPULL, //推挽输出
OPENDRAIN, //开漏输出
3、GPIO 通用寄存器
3.1、IOCR0-端口n输入/输出控制寄存器0
寄存器作用:
端口输入/输出控制寄存器选择一个GPIO端口引脚的数字输出和输入驱动程序的功能和特性。输入的端口方向(输入或输出)、上拉、下拉或无拉设备,以及输出的推拉或开漏功能,可由相应的位字段PCx(x=0-15)选择。每个32位宽端口输入/输出控制寄存器控制四条GPIO端口线:
寄存器Pn_IOCR0控制Pn [3:0]端口线路;
寄存器Pn_IOCR4控制Pn [7:4]端口线路;
寄存器Pn_IOCR8控制Pn [11:8]端口线路;
寄存器Pn_IOCR12控制Pn [15:12]端口线路。
位 | 功能 |
---|---|
PCx (x=0-3):8* x+7:8*x+ 3 | 可读可写,引脚x的端口控制 |
0:26:24, 18:16, 10:8,2:0 | 读取为0,应该用0写入 |
3.2、OMR-端口n输出修改寄存器
位 | 功能 |
---|---|
0~31 | 设置此位将在端口输出寄存器Pn_OUT中设置或切换相应的位。读取为0。该位元的函数显示为:0-不操作、1-设置或切换Pn_OUT.Px。 |
3.3、PDR0-端口n驱动程序模式寄存器0
4、GPIO 函数
4.1、设置GPIO 状态函数
void IfxPort_setPinState(Ifx_P *port, uint8 pinIndex, IfxPort_State action)
{
port->OMR.U = action << pinIndex;
}
参数:
port:GPIO 端口号
pinIndex:高低电平
4.2、设置GPIO输出模式
void IfxPort_setGroupModeOutput(Ifx_P *port, uint8 pinIndex, uint16 mask, IfxPort_OutputMode mode, IfxPort_OutputIdx index)
{
uint32 i;
uint32 iocrVal[4];
uint32 iocrMask[4];
IFX_UNUSED_PARAMETER(index == IfxPort_OutputIdx_general);
/* initialise */
for (i = 0; i < 4; i++)
{
iocrVal[i] = 0;
iocrMask[i] = 0;
}
/* calculate IOCRx values and masks */
uint32 imask = (uint32)mask << pinIndex;
for (i = pinIndex; i < 16; i++)
{
if ((imask & (1U << i)) != 0)
{
uint32 index = i / 4;
uint32 shift = (i & 0x3U) * 8;
iocrMask[index] |= (0x1FU << 3) << shift;
iocrVal[index] |= (mode | index) << shift;
}
}
/* write IOCRx */
for (i = 0; i < 4; i++)
{
if (iocrMask[i] != 0)
{
__ldmst(&((&(port->IOCR0.U))[i]), iocrMask[i], iocrVal[i]);
}
}
}
2、设置GPIO输出高电平
void IfxPort_setPinHigh(Ifx_P *port, uint8 pinIndex)
{
IfxPort_setPinState(port, pinIndex, IfxPort_State_high);
}
port:GPIO端口号
pinIndex:1-高电平、0-低电平
3、设置GPIO输出低电平
void IfxPort_setPinLow(Ifx_P *port, uint8 pinIndex)
{
IfxPort_setPinState(port, pinIndex, IfxPort_State_low);
}
port:GPIO端口号
pinIndex:1-高电平、0-低电平
4、设置GPIO翻转电平
void IfxPort_togglePin(Ifx_P *port, uint8 pinIndex)
{
IfxPort_setPinState(port, pinIndex, IfxPort_State_toggled);
}
port:GPIO端口号
pinIndex:1-高电平、0-低电平
5、读取GPIO电平
boolean IfxPort_getPinState(Ifx_P *port, uint8 pinIndex)
{
return (__getbit(&port->IN.U, pinIndex) != 0) ? TRUE : FALSE;
}
port:GPIO端口号
pinIndex:1-高电平、0-低电平
5、GPIO 测试实验
使用逐飞TC377系列核心板,板上有4路LED,原理图如下:
实验:实现点灯,熟悉GPIO使用。
5.1、新建工程,File-New-New AURIX Project
5.2、新建工程名:TC377_LED
5.3、选择芯片和开发板,也可以选择自定义板: Custom Board
5.4、激活工程,鼠标右击:Set Active Project
5.5、新建工程如下:
5.6、在CPU0初始化LED
#include "Ifx_Types.h"
#include "IfxCpu.h"
#include "IfxScuWdt.h"
#include "Bsp.h"
IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;
void core0_main(void)
{
IfxCpu_enableInterrupts();
/* !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!
* Enable the watchdogs and service them periodically if it is required
*/
IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());
//initTime(); /* Calculate iLLDs time constants */
IfxPort_setPinModeOutput(&MODULE_P20,8, IfxPort_OutputMode_pushPull, IfxPort_OutputIdx_general);
IfxPort_setPinHigh(&MODULE_P20,8); //Switch OFF the LED (low-level active)
/* Wait for CPU sync event */
IfxCpu_emitEvent(&g_cpuSyncEvent);
IfxCpu_waitEvent(&g_cpuSyncEvent, 1);
while(1)
{
IfxPort_togglePin(&MODULE_P20,8); /* Toggle the state of the LED*/
waitTime(500); /* Wait 500 milliseconds*/
}
}
5.7、编译并下载
欢迎各位大佬关注我的公众号:Kevin的学习站,测试例程将会上传到公众号,需要的小伙伴可以下载,整理不易,但您的点赞、关注、收藏就是对我最大的鼓励!