语音经过ISD1820语音芯片和STM32F103C8T6工作原理介绍
时间: 2023-11-01 21:06:57 浏览: 76
ISD1820语音芯片是一种集成了录音和播放功能的芯片,可以实现语音录制、存储、播放等功能。STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,具有丰富的外设接口和强大的处理能力。
在语音传输过程中,首先需要将语音信号通过麦克风采集,并经过放大和滤波等处理后,输入到ISD1820语音芯片中进行录制。录制完成后,将录制得到的语音信号存储到芯片内部的EEPROM中。
当需要播放录制好的语音时,STM32F103C8T6通过SPI接口向ISD1820语音芯片发送控制指令,使其从EEPROM中读取语音数据并进行解码和放大,然后通过扬声器输出。
总体来说,ISD1820语音芯片和STM32F103C8T6的结合,可以实现简单且稳定的语音录制和播放功能。
相关问题
STM32F103C8T6控制ISD1820的引脚具体连接
STM32F103C8T6可以通过GPIO控制ISD1820的引脚,具体连接方式如下:
ISD1820引脚 | 连接至STM32F103C8T6引脚
------------|----------------------
VCC | 3.3V
GND | GND
PLAYE | GPIO输出引脚
REC | GPIO输出引脚
MIC | 麦克风
SP+ | 扬声器正极
SP- | 扬声器负极
需要注意的是,ISD1820的VCC电压为3.3V,需要连接至STM32F103C8T6的3.3V电源引脚,而不是5V电源引脚。此外,需要根据实际情况选择合适的GPIO引脚连接至ISD1820的PLAYE和REC引脚。
由STM32F103C8T6和ISD1820,LCD1602,按键模块组成的录音设备,具体写一下语音采集的代码
好的,下面是基于STM32F103C8T6、ISD1820、LCD1602和按键模块的语音采集代码:
首先,我们需要使用STM32的定时器来控制ISD1820的录音时间,并使用ADC采集模拟信号,将其转换为数字信号。在这里,我们将使用ADC1和TIM2。
```c
#include "stm32f10x.h"
void init_ADC(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
}
void init_TIM2(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitStructure.TIM_Period = 65535;
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
// 停止录音
ISD1820_StopRecord();
}
}
int main(void)
{
// 初始化ADC和TIM2
init_ADC();
init_TIM2();
// ...
while(1)
{
if(按键1被按下)
{
// 开始录音
ISD1820_StartRecord();
// 启动ADC
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
int16_t data = ADC_GetConversionValue(ADC1);
// 保存录音数据
ISD1820_SaveData(data);
}
}
}
```
在上面的代码中,我们初始化了ADC和TIM2,并在按键1被按下时开始录音并启动ADC。ADC采样完成后,我们将数据保存到ISD1820中。在录音时间到达后,TIM2中断会被触发,停止录音。
下面是ISD1820的控制代码:
```c
#include "stm32f10x.h"
void ISD1820_StartRecord(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0);
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
}
void ISD1820_StopRecord(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_1);
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
}
void ISD1820_SaveData(int16_t data)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1);
for(int i = 0; i < 16; i++)
{
if(data & 0x8000)
GPIO_SetBits(GPIOB, GPIO_Pin_3);
else
GPIO_ResetBits(GPIOB, GPIO_Pin_3);
GPIO_SetBits(GPIOB, GPIO_Pin_2);
GPIO_ResetBits(GPIOB, GPIO_Pin_2);
data <<= 1;
}
GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1);
}
```
在上面的代码中,我们定义了三个函数。`ISD1820_StartRecord`函数用于开始录音,`ISD1820_StopRecord`函数用于停止录音,`ISD1820_SaveData`函数用于保存录音数据。在保存数据时,我们将数据写入ISD1820的16位数据口中。
最后,我们需要初始化GPIO和LCD1602,并在LCD1602上显示录音状态。
```c
#include "stm32f10x.h"
#include "delay.h"
#include "lcd1602.h"
void init_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
int main(void)
{
// 初始化GPIO和LCD1602
init_GPIO();
LCD1602_Init();
// ...
while(1)
{
if(按键1被按下)
{
// 开始录音
ISD1820_StartRecord();
// 启动ADC
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
int16_t data = ADC_GetConversionValue(ADC1);
// 保存录音数据
ISD1820_SaveData(data);
// 显示录音状态
LCD1602_Clear();
LCD1602_WriteString("Recording...");
while(TIM_GetFlagStatus(TIM2, TIM_IT_Update) == RESET);
LCD1602_Clear();
LCD1602_WriteString("Recording end");
}
}
}
```
在上面的代码中,我们初始化了GPIO和LCD1602,并在按键1被按下时开始录音。在录音过程中,我们在LCD1602上显示“Recording...”字样。在录音完成后,我们在LCD1602上显示“Recording end”字样。
以上就是基于STM32F103C8T6、ISD1820、LCD1602和按键模块的语音采集代码。