蜂鸣器这里我直接连接PA6引脚,移植了安富莱的驱动程序,不再过多叙述,只是IO输出,跟LED灯同理按键,板子上的按键如下
两个按键分别在PA14和PA18,区别在S1带下拉,S2不带下拉,根据原理图,S1按下前PA18是低电平,按下后是高电平,S2没有上下拉电阻,按常规应该是要配置为上拉模式,所以按下前是高电平,按下后是低电平
按照原理图配置
PA18配置为输入不配置上下拉
PA14配置为上拉输入
#define GET_KEY() DL_GPIO_readPins(GPIO_KEY_PORT, GPIO_KEY_S1_PIN|GPIO_KEY_S2_PIN) key_in = GET_KEY(); if (key_in == 0X00044000) // S1 { key = 0x10; } else if (key_in == 0X00000000) // S2 { key = 0x20; } else if (key_in == 0X00040000) // S1&S2 { key = 0x30; }
直接就可以读出按键状态
DS18B20,单总线的一个温度传感器,需要控制IO的输入输出,网上很容易找驱动,需要us级别的延迟
连接到PA1
#define DS18B20_DQ_OUTH DL_GPIO_setPins(GPIO_DQ_PORT, GPIO_DQ_PIN_4_PIN) #define DS18B20_DQ_OUTL DL_GPIO_clearPins(GPIO_DQ_PORT, GPIO_DQ_PIN_4_PIN) #define DS18B20_DQ_READ DL_GPIO_readPins(GPIO_DQ_PORT, GPIO_DQ_PIN_4_PIN) #define DS18B20_DQ_IN DL_GPIO_initDigitalInput(GPIO_DQ_PIN_4_IOMUX);DL_GPIO_disableOutput(GPIO_DQ_PORT, GPIO_DQ_PIN_4_PIN) #define DS18B20_DQ_OUT DL_GPIO_initDigitalOutput(GPIO_DQ_PIN_4_IOMUX);DL_GPIO_enableOutput(GPIO_DQ_PORT, GPIO_DQ_PIN_4_PIN) // 复位DS18B20 void DS18B20_Rst(void) { DS18B20_DQ_OUT; DS18B20_DQ_OUTL; // 拉低DQ delay_cycles(750 * 32); // 拉低750us DS18B20_DQ_OUTH; // DQ=1 delay_cycles(15 * 32); // 15US } // 等待DS18B20的回应 // 返回1:未检测到DS18B20的存在 // 返回0:存在 uint8_t DS18B20_Check(void) { uint8_t retry = 0; DS18B20_DQ_IN; while (DS18B20_DQ_READ && retry < 200) { retry++; delay_cycles(1 * 32); }; if (retry >= 200) return 1; else retry = 0; while (!DS18B20_DQ_READ && retry < 240) { retry++; delay_cycles(1 * 32); }; if (retry >= 240) return 1; return 0; } // 从DS18B20读取一个位 // 返回值:1/0 uint8_t DS18B20_Read_Bit(void) // read one bit { DS18B20_DQ_OUT; uint8_t data; DS18B20_DQ_OUTL; delay_cycles(2 * 32); DS18B20_DQ_OUTH; delay_cycles(12 * 32); DS18B20_DQ_IN; if (DS18B20_DQ_READ) data = 1; else data = 0; delay_cycles(50 * 32); return data; } // 从DS18B20读取一个字节 // 返回值:读到的数据 uint8_t DS18B20_Read_Byte(void) // read one byte { uint8_t i, j, dat; dat = 0; for (i = 1; i <= 8; i++) { j = DS18B20_Read_Bit(); dat = (j << 7) | (dat >> 1); } return dat; } // 写一个字节到DS18B20 // dat:要写入的字节 void DS18B20_Write_Byte(uint8_t dat) { uint8_t j; uint8_t testb; DS18B20_DQ_OUT; for (j = 1; j <= 8; j++) { testb = dat & 0x01; dat = dat >> 1; if (testb) { DS18B20_DQ_OUTL; // Write 1 delay_cycles(2 * 32); DS18B20_DQ_OUTH; delay_cycles(60 * 32); } else { DS18B20_DQ_OUTL; // Write 0 delay_cycles(60 * 32); DS18B20_DQ_OUTH; delay_cycles(2 * 32); } } } // 开始温度转换 void DS18B20_Start(void) // ds1820 start convert { DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc); // skip rom DS18B20_Write_Byte(0x44); // convert } // 初始化DS18B20的IO口 DQ 同时检测DS的存在 // 返回1:不存在 // 返回0:存在 uint8_t DS18B20_Init(void) { DS18B20_Rst(); return DS18B20_Check(); } // 从ds18b20得到温度值 // 精度:0.1C // 返回值:温度值 (-550~1250) int16_t DS18B20_Get_Temp(void) { uint8_t temp; uint8_t TL, TH; int16_t tem; DS18B20_Start(); // ds1820 start convert DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc); // skip rom DS18B20_Write_Byte(0xbe); // convert TL = DS18B20_Read_Byte(); // LSB TH = DS18B20_Read_Byte(); // MSB if (TH > 7) { TH = ~TH; TL = ~TL; temp = 0; // 温度为负 } else temp = 1; // 温度为正 tem = TH; // 获得高八位 tem <<= 8; tem += TL; // 获得底八位 tem = (float)tem * 0.625; // 转换 if (temp) return tem; // 返回温度值 else return -tem; }
所需基本驱动