IAR软件使用:
https://www.iar.com/zh/knowledge/learn/programming/compiler-optimization-2
1.2 IAR 环境配置及编译_iar linker配置-CSDN博客
Lwip-undone
代码移植过去,PHY ID、speed协商等都没问题。
但是:
官方:
(后来我才明白。官方给的解决方案是对应于Lwip例程本身就不通的情况)
改了之后发现没有。
忽然明白,官方给的解决方法是对应于Lwip不通。
而测试Lwip已经调通了,只是移植进大程序不通而已。
SD
把之前测试的模板导入,成功。
但是后续如果要用SD卡去进行存储和取用的话,需要把example的函数分开写。现在所有的操作都写在一起了。
Timer
用的是:
#define TIMER_DEVICE_ID FPAR_TTCPS_0_DEVICE_ID//TIMERPS_0_DEVICE_ID//XPAR_XSCUTIMER_0_DEVICE_ID
#define TIMER_FREQ 0x34FB5E3//55.555555MHz 0x13DE4355 //333.333333MHz
#define TIMER_IRPT_INTR_ID TIMER0_1_INT_ID//XPAR_SCUTIMER_INTR
导入原来的Timer.c & Timer.h,但是函数内容作了修改(根据PeripheralTest中的ttc_example.c)
int Timer_Intr_Start(XScuTimer *ScuTimerPtr,XScuGic * IntcInstancePtr,u16 IntrId)
{
int status;
//设置优先级和触发方式
XScuGic_SetPriorityTriggerType(IntcInstancePtr,IntrId,0xA0,0x3);
//set up the timer interrupt
status = XScuGic_Connect(IntcInstancePtr, IntrId,(Xil_ExceptionHandler)Timer_IntrHandler,
(void *)ScuTimerPtr);
if(status != XST_SUCCESS)
{
return status;
}
//enable the interrupt for the Timer at GIC
XScuGic_Enable(IntcInstancePtr, IntrId);
//使能定时器中断
FTtcPs_setTimerEnble(ScuTimerPtr, timer1, FMSH_set);
// XScuTimer_EnableInterrupt(ScuTimerPtr);
//启动定时器
// XScuTimer_Start(ScuTimerPtr);
FTtcPs_setTimerEnble(ScuTimerPtr, timer1, FMSH_set);
return XST_SUCCESS;
}
int Timer_Init(XScuTimer *ScuTimerPtr,u32 DeviceID)
{
int status;
XScuTimer_Config *configPtr;
configPtr = XScuTimer_LookupConfig(DeviceID);
if(!configPtr)
{
xil_printf("No Config Found For Timer Device %d\n\r",DeviceID);
return XST_FAILURE;
}
status = FTtcPs_init(ScuTimerPtr, configPtr); //TRUE = 1
if(!status)
{
xil_printf("Timer Initialization Failed \n\r");
return XST_FAILURE;
}
// if(!configPtr)
// {
// xil_printf("No Config Found For Timer Device %d\n\r",DeviceID);
// return XST_FAILURE;
// }
// status = XScuTimer_CfgInitialize(ScuTimerPtr,configPtr,configPtr->BaseAddr);
// if(status != XST_SUCCESS)
// {
// xil_printf("Timer Initialization Failed\n\r");
// return XST_FAILURE;
// }
// status = XScuTimer_SelfTest(ScuTimerPtr);
// if(status != XST_SUCCESS)
// {
// xil_printf("Timer SelfTest Failed\n\r");
// return XST_FAILURE;
// }
return XST_SUCCESS;
}
int Timer_Load(XScuTimer *ScuTimerPtr,u32 TimeUs)
{
int loadvalue = TIMER_FREQ/1000000.0*TimeUs;
//使能自动装载
FTtcPs_setTimerEnble(ScuTimerPtr, timer1, FMSH_clear);
FTtcPs_setTimerMode(ScuTimerPtr, timer1, user_DefinedCount_mode);
// XScuTimer_EnableAutoReload(ScuTimerPtr);
//加载计数周期
FTtcPs_TimerNLoadCount(ScuTimerPtr, timer1,loadvalue);
// XScuTimer_LoadTimer(ScuTimerPtr,loadvalue);
FTtcPs_setTIMERPWM(ScuTimerPtr, timer1, FMSH_clear); //PWM mode 0:successful
return XST_SUCCESS;
}
int Timer_Stop(XScuTimer *ScuTimerPtr)
{
//停止定时器中断
// XScuTimer_DisableInterrupt(ScuTimerPtr);
FTtcPs_ClearTimerNInterrupt(ScuTimerPtr, 1);
//停止定时器
// XScuTimer_Stop(ScuTimerPtr);
FTtcPs_setTimerEnble(ScuTimerPtr, timer1, FMSH_clear);
return XST_SUCCESS;
}
中断处理函数
Timer : <(^-^)>
QSPI Flash :
UARTPS : (;´༎ຶД༎ຶ`) 调了近两周,终于进度到90%了
UART16550:
CAN: ʕ.•᷅ࡇ•᷄.ʔ good
Lwip: ໒𖦹ࡇ𖦹 ͛১ 目前还没有头绪
问题:
Timer的irq在配置完就会进入,并且只进入一次。
解决方法:
在irqHandler中加入中断清除标志的函数即可。
(其他模块调试内容见其他博文)