NXP S32K12

Posted by 肥仔 on May 17, 2024

前言

想起,实习的时候还抽空,弄过nxp 平台的驱动移植以及模块开发…然后自己都有点忘记干过这事情了…

Note

目标_20210204

板子信息_20210204

参考资料

https://community.nxp.com/t5/S32K/bd-p/S32K

https://www.nxp.com.cn/design/design-center/development-boards/automotive-development-platforms/s32k-mcu-platforms/s32k146evb-q144-evaluation-board-for-automotive-general-purpose:S32K146EVB#support

板子信息

S32新建工程

可以仔细查看S32的快速入门手册,里面的debug方式可以多学习下,ide 使用

调试过程_20210204

记得多百度,多上论坛搜资源!!!!!!! 记得多收集官方手册 调试LED

https://blog.csdn.net/zz56z56/article/details/88914549

PTD0 Blue PTD15 Red PTD16 Green 在clock_manager 里面设置时钟。 在Pin_mux 中设置引脚状态,全部拉高 高是亮灯状态 初始化,如下 CLOCK_DRV_Init(&clockMan1_InitConfig0); PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); 改变引脚状态

1
2
PINS_DRV_TogglePins(PTD,(1 << 0) | (1 << 15 ) | (1 << 16));
PINS_DRV_TogglePins(PTD,(1 << 0) | (0 << 15 ) | (0 << 16));

问题

  1. 延时函数如何实现?
  2. Flash与Ram的区别 Drive Strength(也被称为:driving strength),表示“驱动强度”。这个参数用来控制信号强度,数值越大代表信号强度越高。 https://blog.csdn.net/qwaszx523/article/details/53541209

调试ADC

ADC_DRV_ConfigConverter(INST_ADCONV1, &adConv1_ConvConfig0); ADC_DRV_GetChanResult(INST_ADCONV1,3,&result);

是否要强行转换为32位???? 问题 uint16_t * const result ???? https://blog.csdn.net/qq_37941471/article/details/80678904 Stm32 ADC函数 https://blog.csdn.net/qq_43743762/article/details/100067558

调试中断(按键)

PTC12 BTN0 SW2 PTC13 BTN1 SW3 SW2 -»»» 4096 1000000000000 2的12次方 SW3 -»»» 8192 8192 2的13次方 中断向量表,中断注册,以及函数实现 //install IRQ INT_SYS_InstallHandler(PORTC_IRQn,PORTC_IRQn_Button_ISR,NULL); INT_SYS_EnableIRQ(PORTC_IRQn);

void PORTC_IRQn_Button_ISR(void){

1
2
3
4
5
6
7
8
9
10
11
12
Flag_Status = PINS_DRV_GetPortIntFlag(PORTC);
if(Flag_Status & (1 << BTN0)){

	PINS_DRV_TogglePins(PTD,(1 << 0) | (0 << 15 ) | (1 << 16));
	PINS_DRV_ClearPinIntFlagCmd(PORTC,12U);
}

if(Flag_Status & (1 << BTN1)){

	PINS_DRV_TogglePins(PTD,(1 << 0) | (0 << 15 ) | (0 << 16));
	PINS_DRV_ClearPinIntFlagCmd(PORTC,13U);
}

}

定时器中断 低功耗定时器 // SWI_IRQn = 64u, /**< Software interrupt */ //Install LPTimer IRQ INT_SYS_InstallHandler(LPTMR0_IRQn,lptmrISR,0); INT_SYS_EnableIRQ(LPTMR0_IRQn);

void lptmrISR(void) { // clear flag LPTMR_DRV_ClearCompareFlag(INST_LPTMR1); // function task_timer++; NSFlag= 1; if(task_timer== 1000){ task_timer=0; PINS_DRV_TogglePins(PTD,(1 « 0) | (0 « 15 ) | (0 « 16)); }

}

void Timer_Init(){ //Init LPTMR_DRV_Init(INST_LPTMR1, &lpTmr1_config0,0);

1
2
//Start Timer
LPTMR_DRV_StartCounter(INST_LPTMR1);

1ms ,2ms ,10ms,20,100

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
   //Install FTM1 IRQ
    /* Initialize Flex Timer instance as simple timer */
    FTM_DRV_Init(INST_FLEXTIMER_MC1, &flexTimer_mc1_InitConfig, &ftmStateStruct);

    //Install handler for the Timer overflow interrupt and enable it
    INT_SYS_InstallHandler(FTM1_Ovf_Reload_IRQn, &SysTsk_Cpu0_100ms, NULL);
    INT_SYS_EnableIRQ(FTM1_Ovf_Reload_IRQn);

    // Setup the counter to trigger an interrupt every 100 ms
    FTM_DRV_InitCounter(INST_FLEXTIMER_MC1, &flexTimer_mc1_TimerConfig);
    // Start the counter
    FTM_DRV_CounterStart(INST_FLEXTIMER_MC1);

void SysTsk_Cpu0_100ms( void ){
    static uint8_t FTM1_flowCount = 0U;

    if(FTM1_flowCount < 9U)
    {
        FTM1_flowCount++;
    }
    else
    {
        PINS_DRV_TogglePins(PTD,(0 << 0) | (1 << 15 ) | (0 << 16));
        FTM1_flowCount = 0U;
    }
    /* Clear FTM Timer Overflow flag */
    FTM_DRV_ClearStatusFlags(INST_FLEXTIMER_MC1, (uint32_t)FTM_TIME_OVER_FLOW_FLAG);

}

低功耗时钟,rtc,看门狗,pdb,高级时钟 计算tick 1个tick 8us,太少了 如何调试中断,定时器会溢出,如何溢出,感觉是在递减/递加 选择4个GPIO做测试 左下角4个做GPIO做测试 1 ,2 3,4 giop初始化,时钟,引脚正确,代码正确,特别是移位指令 函数没有执行 ———-》》》》》 lptimer 没有开始计数

FTM FTM0 CH0 ———»»»> PTB12 FTM1 CH0 ———»»» PTB2 FTM_DRV_ClearStatusFlags(INST_FLEXTIMER_MC1, (uint32_t)FTM_TIME_OVER_FLOW_FLAG); /* Initialize Flex Timer instance as simple timer */ FTM_DRV_Init(INST_FLEXTIMER_MC1, &flexTimer_mc1_InitConfig, &ftmStateStruct);

1
2
3
4
5
6
7
8
/* Install handler for the Timer overflow interrupt and enable it */
INT_SYS_InstallHandler(FTM0_Ovf_Reload_IRQn, &ftmTimerISR, (isr_t*) 0U);
INT_SYS_EnableIRQ(FTM0_Ovf_Reload_IRQn);

/* Setup the counter to trigger an interrupt every 100 ms */
FTM_DRV_InitCounter(INST_FLEXTIMER_MC1, &flexTimer_mc1_TimerConfig);
/* Start the counter */
FTM_DRV_CounterStart(INST_FLEXTIMER_MC1);

问题

  1. 软件中断没有找到相应的函数入口
  2. 如何设置软件中断优先级
  3. 设置编译优先级 查看软中断的相应寄存器 SWI_IRQn S32_NVIC - >STIR = 94

调试串口

TX , PTD7 —–»»»»»» J5,16 RX, PTA8 - »»»»»»»»> J6,25

是否需要中断,是否需要FIFO, TIME_NULL是什么意思 问题

S32DS for ARM v2018.R1 安装 IAR Eclipse Plugin后,添加 S32K SDK 的 PAL 层组件编译报错文件解决 基于 IAR Eclipse Plugin,创建 SDK 的 IAR 工程时,添加外设抽象层(PAL)组件后,编译时会提示相应的 PAL 组件的头文件找不到的错误: Fatal error[Pe1696]: cannot open source file “xxx_pal.h” 比如,添加 can_pal 组件后,生成代码,并编译,将提示以下错误: Fatal error[Pe1696]: cannot open source file “can_pal.h”

来自 https://blog.csdn.net/weixin_43139794/article/details/106391275

板子的GND,以及VCC 连线

SPI 通信

没有qspi???? 注意片选的选择

问题 S32 的Input/output的与单个GIPO状态的区别 SPI通信没有成功 1.检查是否有时钟 2.检查时序是否正确

FlexRam

flash有现成的demo可以使用

GPIO仿I2C

CAN_20210225

说明 FILTER 大小是否会占MB 的空间 FILTER 的作用对象是什么 FIFO 的MB的大小 FIFO用轮询做/dma Can error 不用中断,明确状态 CAN通信

Can demo

GIOP_CAN

问题

Tricore To nxp

移植函数,抓主要函数进行移植 初始化数据,接收与发送 Fifo 只有接收

基本架构

需要维护的两张表 CAN手册信息

详细解读

寄存器信息