Răsfoiți Sursa

add:gpio pulse

alienwalker 4 ani în urmă
părinte
comite
8984e185ac

+ 4 - 0
application/src/luat_gpio_air105.c

@@ -127,3 +127,7 @@ int luat_gpio_set_irq_cb(int pin, luat_gpio_irq_cb cb, void* args) {
     }
     return 0;
 }
+
+void luat_gpio_pulse(int pin, uint8_t *level, uint16_t len, uint16_t delay_ns) {
+	GPIO_OutPulse(pin, level, len, delay_ns);
+}

+ 26 - 0
bsp/air105/hal/core_gpio.c

@@ -321,3 +321,29 @@ void __FUNC_IN_RAM__ GPIO_ToggleMulti(uint32_t Port, uint32_t Pins)
 {
 	prvGPIO_Resource[Port].RegBase->IODR ^= (Pins);
 }
+
+void __FUNC_IN_RAM__ GPIO_OutPulse(uint32_t Pin, uint8_t *Data, uint16_t BitLen, uint16_t Delay)
+{
+	int i, j;
+	uint8_t table[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
+	uint8_t Port = (Pin >> 4);
+	Pin = 1 << (Pin & 0x0000000f);
+	__disable_irq();
+	if (Delay)
+	{
+		for(i = 0;i < BitLen; i++)
+		{
+			j = Delay;
+			prvGPIO_Resource[Port].RegBase->BSRR |= (Data[i >> 3] & (table[i & 0x07]))?Pin:(Pin << 16);
+			while(j > 0) {j--;}
+		}
+	}
+	else
+	{
+		for(i = 0;i < BitLen; i++)
+		{
+			prvGPIO_Resource[Port].RegBase->BSRR |= (Data[i >> 3] & (table[i & 0x07]))?Pin:(Pin << 16);
+		}
+	}
+	__enable_irq();
+}

+ 1 - 0
bsp/air105/include/core_gpio.h

@@ -122,6 +122,7 @@ uint32_t GPIO_InputMulti(uint32_t Port);
  */
 void GPIO_ToggleMulti(uint32_t Port, uint32_t Pins);
 
+void GPIO_OutPulse(uint32_t Pin, uint8_t *Data, uint16_t BitLen, uint16_t Delay);
 
 void GPIO_ExtiSetCB(uint32_t Pin, CBFuncEx_t CB, void *pParam);
 void GPIO_ODConfig(uint32_t Pin, uint8_t InitValue);