控制/MCU
AURIX TC3XX GPIO-LED实验
声明:本文是在学习英飞凌 TC3XX系列多核 MCU 过程中整理的笔记,便于后期复习!
控制最多16条端口;
通过软件能够控制每个端口的输出;
输出修改寄存器易于清除、设置和切换单个端口线和端口线的微调,而不影响其他端口的状态;
通过软件可以读取每个端口行的输入值;
每个输出最多可提供7个复用函数;
支持每个端口的直接I/O控制;
控制指定垫片的垫片特性,如驱动强度、转换速率、上/下拉、推/拉或开漏操作,以及TTL或CMOS/汽车输入电平的选择;
紧急停止功能允许通过SMU或特殊端口引脚关闭可配置端口线的输出驱动器;
对于具有LVDS功能的pad对,它控制LVDS特性,并允许在LVDS和CMOS模式之间切换;
在减少引脚数的包中,端口模块可以禁用选定的引脚。
TC3XX系列芯片 GPIO共有五种模式
NO_PULL, //无输入上下拉
PULLUP, //输入上拉
PULLDOWN, //输入下拉
PUSHPULL, //推挽输出
OPENDRAIN, //开漏输出
寄存器作用:
端口输入/输出控制寄存器选择一个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]端口线路。
1void IfxPort_setPinState(Ifx_P *port, uint8 pinIndex, IfxPort_State action)
2{
3 port- >OMR.U = action < < pinIndex;
4}
参数:
port:GPIO 端口号
pinIndex:高低电平
1void IfxPort_setGroupModeOutput(Ifx_P *port, uint8 pinIndex, uint16 mask, IfxPort_OutputMode mode, IfxPort_OutputIdx index)
2{
3 uint32 i;
4 uint32 iocrVal[4];
5 uint32 iocrMask[4];
6
7 IFX_UNUSED_PARAMETER(index == IfxPort_OutputIdx_general);
8
9 /* initialise */
10 for (i = 0; i < 4; i++)
11 {
12 iocrVal[i] = 0;
13 iocrMask[i] = 0;
14 }
15
16 /* calculate IOCRx values and masks */
17 uint32 imask = (uint32)mask < < pinIndex;
18
19 for (i = pinIndex; i < 16; i++)
20 {
21 if ((imask & (1U < < i)) != 0)
22 {
23 uint32 index = i / 4;
24 uint32 shift = (i & 0x3U) * 8;
25 iocrMask[index] |= (0x1FU < < 3) < < shift;
26 iocrVal[index] |= (mode | index) < < shift;
27 }
28 }
29
30 /* write IOCRx */
31 for (i = 0; i < 4; i++)
32 {
33 if (iocrMask[i] != 0)
34 {
35 __ldmst(&((&(port- >IOCR0.U))[i]), iocrMask[i], iocrVal[i]);
36 }
37 }
38}
1void IfxPort_setPinHigh(Ifx_P *port, uint8 pinIndex)
2{
3 IfxPort_setPinState(port, pinIndex, IfxPort_State_high);
4}
port:GPIO端口号
pinIndex:1-高电平、0-低电平
1void IfxPort_setPinLow(Ifx_P *port, uint8 pinIndex)
2{
3 IfxPort_setPinState(port, pinIndex, IfxPort_State_low);
4}
port:GPIO端口号
pinIndex:1-高电平、0-低电平
1void IfxPort_togglePin(Ifx_P *port, uint8 pinIndex)
2{
3 IfxPort_setPinState(port, pinIndex, IfxPort_State_toggled);
4}
port:GPIO端口号
pinIndex:1-高电平、0-低电平
1boolean IfxPort_getPinState(Ifx_P *port, uint8 pinIndex)
2{
3 return (__getbit(&port- >IN.U, pinIndex) != 0) ? TRUE : FALSE;
4}
port:GPIO端口号
pinIndex:1-高电平、0-低电平
使用逐飞TC377系列核心板,板上有4路LED,原理图如下:
实验:实现点灯,熟悉GPIO使用。
Custom Board
1#include "Ifx_Types.h"
2#include "IfxCpu.h"
3#include "IfxScuWdt.h"
4#include "Bsp.h"
5
6IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;
7
8void core0_main(void)
9{
10 IfxCpu_enableInterrupts();
11
12 /* !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!
13 * Enable the watchdogs and service them periodically if it is required
14 */
15 IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
16 IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());
17
18 //initTime(); /* Calculate iLLDs time constants */
19 IfxPort_setPinModeOutput(&MODULE_P20,8, IfxPort_OutputMode_pushPull, IfxPort_OutputIdx_general);
20 IfxPort_setPinHigh(&MODULE_P20,8); //Switch OFF the LED (low-level active)
21
22 /* Wait for CPU sync event */
23 IfxCpu_emitEvent(&g_cpuSyncEvent);
24 IfxCpu_waitEvent(&g_cpuSyncEvent, 1);
25
26 while(1)
27 {
28 IfxPort_togglePin(&MODULE_P20,8); /* Toggle the state of the LED*/
29 waitTime(500); /* Wait 500 milliseconds*/
30
31 }
32}
全部0条评论
快来发表一下你的评论吧 !