前言
想起,实习的时候还抽空,弄过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));
问题
- 延时函数如何实现?
- 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);
问题
- 软件中断没有找到相应的函数入口
- 如何设置软件中断优先级
- 设置编译优先级 查看软中断的相应寄存器 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手册信息