STM32F1与STM32CubeIDE编程实例-麦克风声音传感器驱动 麦克风声音传感器驱动 麦克风声音传感器,顾名思义,它可以检测声音和测量声音的响度。当声音的响应达到一定的阈值时,传感器输出高电平或低电平信号(取决于硬件设计)。麦克风声音传感器广泛应用于声控开关、噪音测量等。
本文将演示如何驱动麦克风声音传感器。
1、麦克风声音传感器配置
本次使用的麦克风声音传感器有两种输出(A0),一种是模拟量输出(D0),另外一种是数字输出。在这里,使用数字输出(D0)。当声音达到阈值时,输出低电平。
在STM32CubeIDE中,传感器引脚的配置如下:
保存配置,并生成代码。
2、麦克风声音传感器驱动实现 1)基本定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 /\* \* voice\_sensor.h \* \* Created on: Apr 21, 2022 \* Author: jenson \*/ #ifndef \_\_VOICE\_SENSOR\_H\_\_ #define \_\_VOICE\_SENSOR\_H\_\_ #include "stm32f1xx\_hal.h" #include "main.h" #include "gpio.h" #include <stdlib.h> #include <unistd.h> typedef struct{ uint16\_t id; // 编号 GPIO_TypeDef\* GPIOx; // 总线端口 uint16\_t GPIO_Pin; // 总线引脚 }voice\_sensor\_t; /\*\* \* @brief 检测是否有报警 \* @param sensor 传感对象 \* @return 当检测到传感器阈值输出低电平时,返回1,否则返回0 \*/ uint8\_t voice\_sensor\_check\_alert(voice\_sensor\_t\* sensor); #endif /\* \_\_VOICE\_SENSOR\_H\_\_ \*/
2)驱动代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /\* \* voice\_sensor.c \* \* Created on: Apr 21, 2022 \* Author: jenson \*/ #include "voice\_sensor.h" uint8\_t voice\_sensor\_check\_alert(voice\_sensor\_t\* sensor){ if(HAL\_GPIO\_ReadPin(sensor->GPIOx, sensor->GPIO_Pin) == GPIO_PIN_RESET){ return 1; } return 0; }
代码非常简单,只需要检测传感器的输出信号为低电平即可。
3)主程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 /\* Private includes ----------------------------------------------------------\*/ /\* USER CODE BEGIN Includes \*/ #include <stdio.h> #include "voice\_sensor/voice\_sensor.h" /\* USER CODE END Includes \*/ /\* USER CODE BEGIN PV \*/ voice\_sensor\_t sensor; /\* USER CODE END PV \*/ int main(void) { /\* USER CODE BEGIN 1 \*/ /\* USER CODE END 1 \*/ /\* MCU Configuration--------------------------------------------------------\*/ /\* Reset of all peripherals, Initializes the Flash interface and the Systick. \*/ HAL\_Init(); /\* USER CODE BEGIN Init \*/ /\* USER CODE END Init \*/ /\* Configure the system clock \*/ SystemClock\_Config(); /\* USER CODE BEGIN SysInit \*/ /\* USER CODE END SysInit \*/ /\* Initialize all configured peripherals \*/ MX\_GPIO\_Init(); MX\_USART1\_UART\_Init(); /\* USER CODE BEGIN 2 \*/ sensor.id = 1; sensor.GPIOx = VOICE_SENSOR_GPIO_Port; sensor.GPIO_Pin = VOICE_SENSOR_Pin; /\* USER CODE END 2 \*/ /\* Infinite loop \*/ /\* USER CODE BEGIN WHILE \*/ while (1) { /\* USER CODE END WHILE \*/ /\* USER CODE BEGIN 3 \*/ if(voice\_sensor\_check\_alert(&sensor)){ printf("voice alert\r\n"); } HAL\_Delay(10); } /\* USER CODE END 3 \*/ }
程序运行结果:
3、麦克风声音传感器配置(基于中断方式) 前面的驱动代码是基于循环轮询实现,比较耗CPU。可以通过外部中断方式来对传感器输出信号进行检测。关于外部中断使用,请参考:
传感器的中断方式驱动配置如下:
基本配置不变,保存并生成代码。
4、麦克风声音传感器驱动实现(基于中断方式) 1)基本定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 /\* \* voice\_sensor.h \* \* Created on: Apr 21, 2022 \* Author: jenson \*/ #ifndef \_\_VOICE\_SENSOR\_H\_\_ #define \_\_VOICE\_SENSOR\_H\_\_ #include "stm32f1xx\_hal.h" #include "main.h" #include "gpio.h" #include <stdlib.h> #include <unistd.h> /\*\*\* \* @brief 传感器回调函数 \* @ \*/ typedef void (\*voice_alert_callback)(uint16\_t id); typedef struct{ uint16\_t id; // 编号 GPIO_TypeDef\* GPIOx; // 总线端口 uint16\_t GPIO_Pin; // 总线引脚 voice_alert_callback callback; // 回调函数 }voice\_sensor\_t; #endif /\* \_\_VOICE\_SENSOR\_H\_\_ \*/
2)中断调用实现
在stm32f1xx_it.c文件,实现如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /\* USER CODE BEGIN Includes \*/ #include "voice\_sensor/voice\_sensor.h" /\* USER CODE END Includes \*/ /\* USER CODE BEGIN PV \*/ extern voice\_sensor\_t sensor; /\* USER CODE END PV \*/ /\* USER CODE BEGIN 1 \*/ void HAL\_GPIO\_EXTI\_Callback(uint16\_t GPIO_Pin) { if(GPIO_Pin == sensor.GPIO_Pin){ if(sensor.callback){ sensor.callback(sensor.id); } } } /\* USER CODE END 1 \*/
3)主程序
在main.c文件中输入如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 /\* USER CODE BEGIN Includes \*/ #include <stdio.h> #include "voice\_sensor/voice\_sensor.h" /\* USER CODE END Includes \*/ /\* USER CODE BEGIN PV \*/ voice\_sensor\_t sensor; /\* USER CODE END PV \*/ /\* USER CODE BEGIN PFP \*/ void on\_voice\_alert(uint16\_t id); /\* USER CODE END PFP \*/ /\* USER CODE BEGIN 0 \*/ void on\_voice\_alert(uint16\_t id){ printf("sensor:%d alerted\r\n",id); } /\* USER CODE END 0 \*/ int main(void) { /\* USER CODE BEGIN 1 \*/ /\* USER CODE END 1 \*/ /\* MCU Configuration--------------------------------------------------------\*/ /\* Reset of all peripherals, Initializes the Flash interface and the Systick. \*/ HAL\_Init(); /\* USER CODE BEGIN Init \*/ /\* USER CODE END Init \*/ /\* Configure the system clock \*/ SystemClock\_Config(); /\* USER CODE BEGIN SysInit \*/ /\* USER CODE END SysInit \*/ /\* Initialize all configured peripherals \*/ MX\_GPIO\_Init(); MX\_USART1\_UART\_Init(); /\* USER CODE BEGIN 2 \*/ sensor.id = 1; sensor.GPIOx = VOICE_SENSOR_GPIO_Port; sensor.GPIO_Pin = VOICE_SENSOR_Pin; sensor.callback = on_voice_alert; /\* USER CODE END 2 \*/ /\* Infinite loop \*/ /\* USER CODE BEGIN WHILE \*/ while (1) { /\* USER CODE END WHILE \*/ /\* USER CODE BEGIN 3 \*/ } /\* USER CODE END 3 \*/ }
程序运行结果如下:
文章来源: https://iotsmart.blog.csdn.net/article/details/125305160
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!