IP核部分新增定时器外设流程如下。
流程图
1. 新增外设。
打开Vivado工程,打开Block Design。
这里以定时器为例,灵活新增一个定时器。打开原理图,右键添加IP。
双击增加定时器。必须连接的线路为总线,时钟与复位信号,中断线。
双击AXI总线,增加一组主接口。
可以点击进行自动连线,推荐手动连线。
连接总线,连接时钟与复位信号输入,连接外设。
创建一组中断线并连接。双击中断控制器,新增中断线,并连接到中断。
可以右键,进行原理图重新布局。
地址映射(推荐自动分配)。根据需求自行配置资源。
2. 生成与检查。
生成设计。
随后重新生成综合,实现,生成比特流。
生成xsa文件,保存文件路径。
删除Vivado工程中的旧elf文件。
打开Vitis,在平台目录下右键,更新xsa文件,自动生成相关文件。
平台目录下,按照以下步骤检查是否成功添加外设。
3. 增加C代码
打开查看自动生成的文件有没有添加上新的外设相关宏定义。
成功新增地址和中断相关宏定义。下一步只需要初始化定时器,使能中断,既可以在中断回调函数中执行相关定时指令。
XTmrCtr Timer1InitStruct;
#define TMRCTR1_DEVICE_ID XPAR_TMRCTR_1_DEVICE_ID
#define TMRCTR1_INTERRUPT_ID XPAR_INTC_0_TMRCTR_1_VEC_ID
#define TIMER1CNT 0
long time1_10ms = 0;
static void Timer1InterruptHandler(void *CallBackRef); //中断回调函数句柄
void timer1interruptfunction();
BOOL Timer1_Init( USHORT usTim1Timerout50us ) //定时器初始化样例
{
int Status;
unsigned int timer_load;
timer_load = RESET_VALUE* usTim1Timerout50us;
Status = XTmrCtr_Initialize(&Timer1InitStruct, TMRCTR1_DEVICE_ID);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR,TMRCTR1_INTERRUPT_ID,
(XInterruptHandler)Timer1InterruptHandler,(void *)XPAR_AXI_TIMER_1_BASEADDR);
XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_1_BASEADDR, TIMER1CNT, timer_load);
XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_1_BASEADDR, TIMER1CNT,XTC_CSR_ENABLE_TMR_MASK | XTC_CSR_ENABLE_INT_MASK |XTC_CSR_AUTO_RELOAD_MASK | XTC_CSR_DOWN_COUNT_MASK);
XTmrCtr_EnableIntr(XPAR_AXI_TIMER_1_BASEADDR, TIMER1CNT);
XTmrCtr_Start(&Timer1InitStruct, TIMER1CNT);
return TRUE;
}
void Timer1InterruptHandler(void *CallBackRef)//中断回调函数
{
unsigned int timer_csr;
timer_csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_1_BASEADDR, 0);
if(timer_csr & XTC_CSR_INT_OCCURED_MASK)
{
timer1interruptfunction(); //在这执行操作
XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_1_BASEADDR, 0, timer_csr);
}
}
void Timer1Start( ) //开始计数
{
XTmrCtr_Enable(XPAR_AXI_TIMER_1_BASEADDR, TIMER1CNT);
}
void Timer1Stop( ) //停止
{
XTmrCtr_Disable(XPAR_AXI_TIMER_1_BASEADDR, TIMER1CNT);
}
void system_intr_en(void) //不要忘记使能中断
{
microblaze_enable_interrupts();
microblaze_register_handler(XIntc_DeviceInterruptHandler,XPAR_INTC_0_DEVICE_ID);
XIntc_MasterEnable(XPAR_INTC_0_BASEADDR);
XIntc_EnableIntr(XPAR_INTC_0_BASEADDR,XPAR_AXI_TIMER_0_INTERRUPT_MASK|XPAR_AXI_TIMER_1_PWM0_MASK); //使能
}
4. 关联vivado并烧录
将软核代码修改完成后,进行编译。编译完成后找到vitis生成的.elf文件。一般位于debug目录下。
将elf文件导入vivado,进行关联。
从新生成比特文件,生成固化文件。