目标
在小梅哥的zynq 7015上,完成以下目标:
读取 S1 按键的电平,
当 S1 按键为按下状态时,驱动 PS LED 以 1S 的频率闪烁(注意理解 1S 的频率闪烁和 1S的时间翻转两种描述之间的差别),
当 S1 释放后,停止闪烁,
确保 S1释放后 PS_LED 处于熄灭状态。↔
通俗点讲,就是 S1 被按下后 PS_LED 就以 1s 的频率闪烁,释放后就熄灭且不再闪烁,
1S 的频率闪烁和 1S的时间翻转两种描述之间的差别
准备
S1按键的相关信息
ps端的s1按键,绑定在ps端的MIO47引脚。
PS端LED的相关信息
PS端的led绑定在MIO7上。
代码和注释
///*
// * main.c
// *
// * Created on: 2024年12月10日
// * Author: Administrator
// */
//
//#include "xparameters.h"
//#include "xil_io.h"
//#include "xgpiops.h"
//#include "sleep.h"
//
//int main(void)
//{
// u32 reg_val = 0;
// u32 Data = 0;
//
//
设定IO方向, bit7的方向为输出
// // 方向寄存器(Direction Mode Register),用于设置GPIO引脚是作为输入还是输出
// reg_val = Xil_In32(XPAR_PS7_GPIO_0_BASEADDR + XGPIOPS_DIRM_OFFSET);
// // 读出来的数据,给最高位置1,有点我们always@*模块里面做修改,然后再输出的感觉
// Data = reg_val | (1<<7);
// // 再将值重新写入到对应的管脚,实现控制
// Xil_Out32(XPAR_PS7_GPIO_0_BASEADDR + XGPIOPS_DIRM_OFFSET, Data);
//
设定输出使能, bit7输出使能
// // XGPIOPS_OUTEN_OFFSET是 GPIO输出使能寄存器(Output Enable Register)的偏移地址
// reg_val = Xil_In32(XPAR_PS7_GPIO_0_BASEADDR + XGPIOPS_OUTEN_OFFSET);
// Data = reg_val | (1<<7);
// Xil_Out32(XPAR_PS7_GPIO_0_BASEADDR + XGPIOPS_OUTEN_OFFSET, Data);
//
// while(1)
// {
// // 设bit7输出1
// Data = ((~(1<<7)) << 16) | (1<<7);
// Xil_Out32(XPAR_PS7_GPIO_0_BASEADDR + XGPIOPS_DATA_LSW_OFFSET, Data);
// usleep(1000000);
//
// // 设bit7输出0
// Data = ((~(1<<7)) << 16) & ~(1<<7);
// Xil_Out32(XPAR_PS7_GPIO_0_BASEADDR + XGPIOPS_DATA_LSW_OFFSET, Data);
// // 以微妙为单位进行延时 us sleep 进率是:s - ms us ns
// usleep(3000000);
// }
//
// return 0; // 虽然程序中不会运行到此处,一般写return防止编译器警告
//}
//在小梅哥的zynq 7015上,完成以下目标:
//
//读取 S1 按键的电平,
//当 S1 按键为按下状态时,驱动 PS LED 以 1S 的频率闪烁(注意理解 1S 的频率闪烁和 1S的时间翻转两种描述之间的差别),
//当 S1 释放后,停止闪烁,
//确保 S1释放后 PS_LED 处于熄灭状态。↔
//通俗点讲,就是 S1 被按下后 PS_LED 就以 1s 的频率闪烁,释放后就熄灭且不再闪烁,
#include "xgpiops.h"
#include "unistd.h"
XGpioPs Gpio;
XGpioPs_Config *ConfigPtr;
int main(void)
{
ConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
// 设置PS 端 MIO47管脚的 方向和输出使能
XGpioPs_SetDirectionPin(&Gpio, 47, 0); // 设置使能
XGpioPs_SetOutputEnablePin(&Gpio, 47, 0);
// 设置PS 端 MIO7管脚的 方向和输出使能
XGpioPs_SetDirectionPin(&Gpio, 7, 1); // 设置使能
XGpioPs_SetOutputEnablePin(&Gpio, 7, 1);
while(1)
{
// 保持读取47号管脚状态,如果拉高,就意味着要开始闪烁,0.5s亮,0.5s灭
// 因为小梅哥按键是摁下去低电平,平常的时候是高电平,所以前面需要加上一个取反的逻辑
while (!XGpioPs_ReadPin(&Gpio, 47))
{
// 设置bit7输出1
XGpioPs_WritePin(&Gpio, 7, 0x1);
// 持续亮0.5s
usleep(500000);
// 设置bit7输出0
XGpioPs_WritePin(&Gpio, 7, 0x0);
// 持续灭0.5s
usleep(500000);
}
}
return 0;
}