ZYNQ 定时器

一、ZYNQ定时器简介

每个Cortex-A9处理器都有自己的专用32位定时器和32位看门狗定时器。两个处理器共享一个全局64位定时器。这些计时器的时钟始终为CPU频率(CPU_3x2x)的1/2。在系统级,有一个24位看门狗定时器和两个16位三重定时器/计数器。系统看门狗定时器时钟在1/4或1/6的CPU频率(CPU_1x),或可以通过外部信号从MIO引脚或从PL时钟。两个三重定时器/计数器总是时钟1/4或1/6的CPU频率(CPU_1x),用于计算信号脉冲的宽度一个MIO引脚或从PL。

如下是系统框图。由此可以发现该2处理器有系统看门狗定时器、有CPU看门狗定时器、CPU私有定时器、全局时钟定时器、两个三从定时器。这些定时器都可以触发中断。本次实验任务用到的是CPU处理器的私有定时器触发中断。

系统框图。和前面的mio控制led的系统差不多,只是用到了定时器中断,因此项目工程在原有的项目基础上另存为后修改一下即可。

二、开发流程

1、 在我们原来的工程MIO LED上不需要修改硬件设计。

2、如过你是拷贝或者复制的原项目到新的目录下需要修改路径。第一种可以删掉SDK文件然后重新建立工程写代码。第二种如果你不想删掉原代码,只想在此基础上上修改,就需要修改板级知识包的路径。方法如下

第二种方法请点击此处

3、复制我们的代码进main.c里面。这里只需要按照你板子的原理图修改一下MIO引脚即可。代码不过解释,想了解的可以查看小梅哥或则正点原子的SOC开发手册。

复制代码
/*
 * main.c
 *
 *  Created on: 2025年9月1日
 *      Author: 32652
 */


#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "xscugic.h"
#include "XScuTimer.h"

#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID
#define TIMER_DEVICE_ID		XPAR_XSCUTIMER_0_DEVICE_ID
#define INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID
#define TIMER_IRPT_INTR		XPAR_SCUTIMER_INTR

//PS端LED
#define MIO7_LED			7
//我们想要计时的值
#define TIMER_LOAD_VALUE	0x3F94067//333.333MHz

XGpioPs_Config *ConfigPtr_gpio;
XGpioPs Gpio;
XScuTimer_Config *ConfigPtr_timer;
XScuTimer timer;
XScuGic_Config *ConfigPtr_inter;
XScuGic inter;
int state=0;


int mio_init(XGpioPs_Config *ConfigPtr_gpio,XGpioPs *Gpio)
{
	//初始化GPIO的驱动
	ConfigPtr_gpio = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
	XGpioPs_CfgInitialize(Gpio, ConfigPtr_gpio,ConfigPtr_gpio->BaseAddr);

	//把GPIO引脚设置为输出(0:输入,1:输出)
	XGpioPs_SetDirectionPin(Gpio, MIO7_LED, 1);
	//打开输出使能
	XGpioPs_SetOutputEnablePin(Gpio, MIO7_LED, 1);

	//写数据到GPIO引脚,由原理图可知设置为1时候点亮。初始时点亮。
	XGpioPs_WritePin(Gpio, MIO7_LED, 0x1);

	return	XST_SUCCESS;
}

int timer_init(XScuTimer_Config *ConfigPtr_timer,XScuTimer *timer)
{
	int Status;

	//初始化定时器
	ConfigPtr_timer = XScuTimer_LookupConfig(TIMER_DEVICE_ID);
	Status = XScuTimer_CfgInitialize(timer, ConfigPtr_timer,ConfigPtr_timer->BaseAddr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	//自检验
	Status = XScuTimer_SelfTest(timer);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	//使能自动装载模式。
	XScuTimer_EnableAutoReload(timer);

	//设置定时器时间
	XScuTimer_LoadTimer(timer, TIMER_LOAD_VALUE);



	return XST_SUCCESS;
}

void timer_interr_handle(void *CallBackRef)
{
	XScuTimer *timer = (XScuTimer *) CallBackRef;

	//XScuTimer_IsExpired这个函数是判断定时器有没有过期。
	if (XScuTimer_IsExpired(timer))
	{
		XScuTimer_ClearInterruptStatus(timer);
		if(state)
		{
			state=0;
			XGpioPs_WritePin(&Gpio, MIO7_LED, 0x0);
		}
		else
		{
			state=1;
			XGpioPs_WritePin(&Gpio, MIO7_LED, 0x1);
		}
	}

}

int timer_sys_init(XScuGic_Config *ConfigPtr_inter,XScuGic *inter)
{
	int Status;

	ConfigPtr_inter = XScuGic_LookupConfig(INTC_DEVICE_ID);
	if (NULL == ConfigPtr_inter) {
		return XST_FAILURE;
	}

	Status = XScuGic_CfgInitialize(inter, ConfigPtr_inter,ConfigPtr_inter->CpuBaseAddress);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	Status = XScuGic_Connect(inter, TIMER_IRPT_INTR,(Xil_ExceptionHandler)timer_interr_handle,(void *)&timer);
	if (Status != XST_SUCCESS) {
		return Status;
	}

	//使能中断设备。
	XScuGic_Enable(inter, TIMER_IRPT_INTR);
	//使能中断模式
	XScuTimer_EnableInterrupt(&timer);

	//处理ARM异常,中断程序必须有的三个函数
	Xil_ExceptionInit();
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,inter);
	Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);

	//启动定时器。中断系统配置完成再使能。
	XScuTimer_Start(&timer);

	return 0;
}

int main()
{
	printf("gpio_mio_test\n");

	mio_init(ConfigPtr_gpio,&Gpio);

	timer_init(ConfigPtr_timer,&timer);

	timer_sys_init(ConfigPtr_inter,&inter);

	XScuTimer_Start(&timer);

	while(1);
	return 0;
}

4、试验成功。

相关推荐
想放学的刺客5 小时前
单片机嵌入式试题(第29期)嵌入式系统的电源完整性设计与去耦电容选型。抗干扰设计与EMC合规性
c语言·stm32·嵌入式硬件·物联网·51单片机
代码游侠7 小时前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
czhaii7 小时前
STC32G.H中文注释各寄存器特殊功能寄存器作用
单片机·嵌入式硬件
码农三叔7 小时前
(9-3)电源管理与能源系统:充电与扩展能源方案
人工智能·嵌入式硬件·机器人·能源·人形机器人
集芯微电科技有限公司8 小时前
15V/2A同步开关型降压单节/双节锂电池充电管理IC支持输入适配器 DPM 功能
c语言·开发语言·stm32·单片机·嵌入式硬件·电脑
零一iTEM8 小时前
TPS61088大功率升压模块
嵌入式硬件·硬件工程·学习方法
MAR-Sky9 小时前
ws2812幻彩灯珠使用stc/AI8G1K08控制
单片机·嵌入式硬件
宵时待雨9 小时前
STM32笔记归纳7:EXTI
笔记·stm32·单片机·嵌入式硬件
古译汉书9 小时前
部分.exe文件打开但是一直显示界面,点击任务栏持续无反应
开发语言·单片机·嵌入式硬件
恒锐丰小吕10 小时前
屹晶微 EG27517 高速低侧单通道驱动芯片技术解析
嵌入式硬件·硬件工程