目标
在小梅哥的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输出1XGpioPs_WritePin(&Gpio, 7, 0x1);// 持续亮0.5susleep(500000);// 设置bit7输出0XGpioPs_WritePin(&Gpio, 7, 0x0);// 持续灭0.5susleep(500000);}}return 0;
}