笔记-XGpioPs_SetDirectionPin(&Gpio, 15, 1);

Zynq GPIO设置教程

void XGpioPs_SetDirectionPin(XGpioPs *InstancePtr, u32 Pin, u32 Direction)
参数1:XGpioPs结构体指针
参数2:Pin是要写入数据的Pin的号码,zynq中为0-117(包括MIO和EMIO)
参数3:指定引脚设置的方向,输入方向为:0,输出方向为:1。
返回值:无
 

void XGpioPs_SetDirectionPin(XGpioPs *InstancePtr, u32 Pin, u32 Direction)
{
	u8 Bank;
	u8 PinNumber;
	u32 DirModeReg;

	Xil_AssertVoid(InstancePtr != NULL);
	Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
	Xil_AssertVoid(Pin < InstancePtr->MaxPinNum);
	Xil_AssertVoid(Direction <= (u32)1);


	/* Get the Bank number and Pin number within the bank. */
	//此函数根据传入的pin_num 在内部查询得到属于哪一个bank中,然后将bank返回
	XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber);
	

	//读取寄存器里面的初始值,不要轻易去更改,到时候将我们的值两者取或再写进去即可
	DirModeReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr,
				      ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) +
				      XGPIOPS_DIRM_OFFSET);
	//下面这一步为什么需要左移pinnumer个位?,我们查看datasheetug585
	if (Direction!=(u32)0) { /*  Output Dir
include "xparameters.h" #include "xgpiops.h" #include "xstatus.h" #include "xil_printf.h" #include "sleep.h" #define DHT11_GPIO_PIN 54 #define BUZZER_GPIO_PIN 55 // 蜂鸣器连接的GPIO引脚 #define LED_GPIO_PIN 56 // LED连接的GPIO引脚 #define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID #define MAX_RETRY 5 #define ALARM_THRESHOLD 24 // 温度报警阈值(摄氏度) #define HUMIDITY_THRESHOLD 10 // 湿度阈值(百分比) XGpioPs Gpio; void delay_us(u32 us) { u32 count = us * (XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ / 1000000 / 5); while(count--); } // 蜂鸣器初始化函数 int Buzzer_Init() { XGpioPs_SetDirectionPin(&Gpio, BUZZER_GPIO_PIN, 1); XGpioPs_SetOutputEnablePin(&Gpio, BUZZER_GPIO_PIN, 1); XGpioPs_WritePin(&Gpio, BUZZER_GPIO_PIN, 0); // 初始状态关闭蜂鸣器 return XST_SUCCESS; } // 控制蜂鸣器函数 void Buzzer_Control(int state) { XGpioPs_WritePin(&Gpio, BUZZER_GPIO_PIN, state); } // 蜂鸣器报警函数 - 发出短促的哔哔声 void Buzzer_Alarm() { int i; for(i = 0; i < 5; i++) { Buzzer_Control(1); // 打开蜂鸣器 usleep(200000); // 200ms Buzzer_Control(0); // 关闭蜂鸣器 usleep(200000); // 200ms } } // LED初始化函数 int LED_Init() { XGpioPs_SetDirectionPin(&Gpio, LED_GPIO_PIN, 1); XGpioPs_SetOutputEnablePin(&Gpio, LED_GPIO_PIN, 1); XGpioPs_WritePin(&Gpio, LED_GPIO_PIN, 0); // 初始状态关闭LED return XST_SUCCESS; } // 控制LED函数 void LED_Control(int state) { XGpioPs_WritePin(&Gpio, LED_GPIO_PIN, state); } int DHT11_Init() { int Status; XGpioPs_Config *ConfigPtr; ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID); if (NULL == ConfigPtr) return XST_FAILURE; Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr); if (Status != XST_SUCCESS) return XST_FAILURE; XGpioPs_SetDirectionPin(&Gpio, DHT11_GPIO_PIN, 1); XGpioPs_SetOutputEnablePin(&Gpio, DHT11_GPIO_PIN, 1); XGpioPs_WritePin(&Gpio, DHT11_GPIO_PIN, 1); // 初始置高 return XST_SUCCESS; } int DHT11_Read(u8 *temperature, u8 *humidity) { u8 data[5] = {0}; u8 i, j, retry = 0; int attempt = 0; for(attempt = 0; attempt < MAX_RETRY; attempt++) { // 发送开始信号 XGpioPs_SetDirectionPin(&Gpio, DHT11_GPIO_PIN, 1); XGpioPs_WritePin(&Gpio, DHT11_GPIO_PIN, 0); usleep(18000); // 释放总线 XGpioPs_WritePin(&Gpio, DHT11_GPIO_PIN, 1); XGpioPs_SetDirectionPin(&Gpio, DHT11_GPIO_PIN, 0); delay_us(40); // 检测响应 if(XGpioPs_ReadPin(&Gpio, DHT11_GPIO_PIN) == 0) { // 等待响应结束 while(XGpioPs_ReadPin(&Gpio, DHT11_GPIO_PIN) == 0 && retry++ < 100) delay_us(1); retry = 0; while(XGpioPs_ReadPin(&Gpio, DHT11_GPIO_PIN) == 1 && retry++ < 100) delay_us(1); // 读取数据 for(i = 0; i < 5; i++) { for(j = 0; j < 8; j++) { while(XGpioPs_ReadPin(&Gpio, DHT11_GPIO_PIN) == 0); delay_us(40); data[i] |= (XGpioPs_ReadPin(&Gpio, DHT11_GPIO_PIN) ? (1 << (7-j)) : 0); while(XGpioPs_ReadPin(&Gpio, DHT11_GPIO_PIN) == 1); } } // 校验数据 if(data[4] == ((data[0]+data[1]+data[2]+data[3]) & 0xFF)) { *humidity = data[0]; *temperature = data[2]; return XST_SUCCESS; } } // 重置GPIO状态 XGpioPs_SetDirectionPin(&Gpio, DHT11_GPIO_PIN, 1); XGpioPs_WritePin(&Gpio, DHT11_GPIO_PIN, 1); usleep(1000); // 等待1ms } return XST_FAILURE; } int main() { int Status; u8 temperature, humidity; Status = DHT11_Init(); if (Status != XST_SUCCESS) { xil_printf("DHT11 Initialization Failed\n\r"); return XST_FAILURE; } Status = Buzzer_Init(); if (Status != XST_SUCCESS) { xil_printf("Buzzer Initialization Failed\n\r"); return XST_FAILURE; } Status = LED_Init(); if (Status != XST_SUCCESS) { xil_printf("LED Initialization Failed\n\r"); return XST_FAILURE; } xil_printf("DHT11 Temperature & Humidity Monitor Started\n\r"); xil_printf("Alarm Threshold: %d°C\n\r", ALARM_THRESHOLD); xil_printf("Humidity Threshold: %d%%\n\r", HUMIDITY_THRESHOLD); while(1) { Status = DHT11_Read(&temperature, &humidity); if(Status == XST_SUCCESS) { xil_printf("Temp: %d°C, Humi: %d%%\n\r", temperature, humidity); // 温度超过阈值时触发报警 if(temperature > ALARM_THRESHOLD) { xil_printf("ALARM: Temperature exceeds threshold!\n\r"); Buzzer_Alarm(); } // 根据湿度控制LED if(humidity > HUMIDITY_THRESHOLD) { LED_Control(1); // 湿度大于阈值,LED点亮 } else { LED_Control(0); // 湿度小于等于阈值,LED熄灭 } } else { xil_printf("Read Error, Retrying...\n\r"); LED_Control(0); // 读取错误时LED熄灭 } sleep(2); } return XST_SUCCESS; }解释这段代码
最新发布
06-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值