Przeglądaj źródła

add:gpio输出翻转,外部audio pa的控制

alienwalker 4 lat temu
rodzic
commit
8aff785bd7

+ 24 - 0
application/src/luat_audio_air105.c

@@ -201,6 +201,10 @@ int luat_audio_write_raw(uint8_t multimedia_id, uint8_t *data, uint32_t len)
 
 int luat_audio_stop_raw(uint8_t multimedia_id)
 {
+	if (prvAudioStream.UseOutPA)
+	{
+		GPIO_Output(prvAudioStream.PAPin, !prvAudioStream.PAOnLevel);
+	}
 	Audio_Stop(&prvAudioStream);
 	OS_DeInitBuffer(&prvAudioStream.FileDataBuffer);
 	OS_DeInitBuffer(&prvAudioStream.AudioDataBuffer);
@@ -217,6 +221,7 @@ int luat_audio_stop_raw(uint8_t multimedia_id)
 	prvAudioStream.IsStop = 0;
 	prvAudioStream.IsPlaying = 0;
 	prvAudioStream.waitRequire = 0;
+
 	return ERROR_NONE;
 }
 
@@ -355,6 +360,10 @@ int luat_audio_play_file(uint8_t multimedia_id, const char *path)
 			prvAudioStream.IsPlaying = 1;
 			prvAudioStream.pParam = multimedia_id;
 			prvAudioStream.IsFileNotEnd = 1;
+			if (prvAudioStream.UseOutPA)
+			{
+				GPIO_Output(prvAudioStream.PAPin, prvAudioStream.PAOnLevel);
+			}
 			prvAudioStream.Decoder(&prvAudioStream, prvAudioStream.CoderParam);
 
 			if (!llist_num(&prvAudioStream.DataHead))
@@ -382,3 +391,18 @@ int luat_audio_play_file(uint8_t multimedia_id, const char *path)
 	}
 	return -1;
 }
+
+void luat_audio_config_pa(int8_t multimedia_id, uint32_t pin, int level)
+{
+	if (pin < GPIO_NONE)
+	{
+		prvAudioStream.PAPin = pin;
+		prvAudioStream.PAOnLevel = level;
+		prvAudioStream.UseOutPA = 1;
+		GPIO_Config(prvAudioStream.PAPin, 0, !prvAudioStream.PAOnLevel);
+	}
+	else
+	{
+		prvAudioStream.UseOutPA = 0;
+	}
+}

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

@@ -300,6 +300,13 @@ uint8_t __FUNC_IN_RAM__ GPIO_Input(uint32_t Pin)
 	return (prvGPIO_Resource[Port].RegBase->IODR & (Pin << 16))?1:0;
 }
 
+void __FUNC_IN_RAM__ GPIO_Toggle(uint32_t Pin)
+{
+	uint8_t Port = (Pin >> 4);
+	Pin = 1 << (Pin & 0x0000000f);
+	prvGPIO_Resource[Port].RegBase->IODR ^= Pin;
+}
+
 void __FUNC_IN_RAM__ GPIO_OutputMulti(uint32_t Port, uint32_t Pins, uint32_t Level)
 {
 	prvGPIO_Resource[Port].RegBase->BSRR |= Level?Pins:(Pins << 16);
@@ -309,3 +316,8 @@ uint32_t __FUNC_IN_RAM__ GPIO_InputMulti(uint32_t Port)
 {
 	return (prvGPIO_Resource[Port].RegBase->IODR >> 16);
 }
+
+void __FUNC_IN_RAM__ GPIO_ToggleMulti(uint32_t Port, uint32_t Pins)
+{
+	prvGPIO_Resource[Port].RegBase->IODR ^= (Pins);
+}

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

@@ -66,7 +66,14 @@ void GPIO_ExtiConfig(uint32_t Pin, uint8_t IsLevel, uint8_t IsRiseHigh, uint8_t
  * @param Function 复用功能,这个需要根据芯片实际情况决定,当前是0~3,注意GPIO功能是1
  */
 void GPIO_Iomux(uint32_t Pin, uint32_t Function);
-
+/**
+ * @brief GPIO复用功能扩展,目前只有106需要
+ *
+ * @param Pin Pin序号
+ * @param Function 复用功能,这个需要根据芯片实际情况决定,当前是0~15,注意GPIO功能是0
+ * @IsInput 是否是输入功能
+ */
+void GPIO_IomuxEx(uint32_t Pin, uint32_t Function, uint8_t IsInput);
 /**
  * @brief GPIO输出电平
  *
@@ -83,6 +90,13 @@ void GPIO_Output(uint32_t Pin, uint8_t Level);
  */
 uint8_t GPIO_Input(uint32_t Pin);
 
+/**
+ * @brief 翻转GPIO输出电平
+ *
+ * @param Pin Pin序号
+ * @return 无
+ */
+void GPIO_Toggle(uint32_t Pin);
 /**
  * @brief GPIO同一端口多个pin输出电平,针对类似STM32GPIO分布有效
  *
@@ -100,6 +114,15 @@ void GPIO_OutputMulti(uint32_t Port, uint32_t Pins, uint32_t Level);
  */
 uint32_t GPIO_InputMulti(uint32_t Port);
 
+/**
+ * @brief 翻转GPIO同一端口多个pin输出电平
+ * @param Port 端口号
+ * @param Pins Pin序号组合
+ * @return 无
+ */
+void GPIO_ToggleMulti(uint32_t Port, uint32_t Pins);
+
+
 void GPIO_ExtiSetCB(uint32_t Pin, CBFuncEx_t CB, void *pParam);
 void GPIO_ODConfig(uint32_t Pin, uint8_t InitValue);
 #endif

+ 3 - 0
bsp/audio/include/audio_ll_drv.h

@@ -43,6 +43,9 @@ typedef struct
 	uint8_t IsPlaying;
 	uint8_t IsFileNotEnd;
 	uint8_t DecodeStep;
+	uint8_t UseOutPA;
+	uint8_t PAPin;
+	uint8_t PAOnLevel;
 }Audio_StreamStruct;
 
 void Audio_GlobalInit(void);