Browse Source

update

master
zhaohe 2 years ago
parent
commit
d8a831e0c4
  1. 1
      README.md
  2. 78
      src/umain.cpp

1
README.md

@ -13,5 +13,6 @@ ADC采样问题:
1. ADC芯片和MCU之间总线速率无法大于2M, 否则ADC芯片初始时,会报CRC错误
2. 采样率大于24k时,采集到的数据会出现错误,原因未知
3. 单片机采集到语音偶尔会出现噪声(输入源是信号发生器),原因未知
```

78
src/umain.cpp

@ -30,7 +30,7 @@ struct ad77681_init_param ADC_default_init_param = {
// },
/* Configuration */
.power_mode = AD77681_FAST, // power_mode
.mclk_div = AD77681_MCLK_DIV_2, // mclk_div
.mclk_div = AD77681_MCLK_DIV_8, // mclk_div
.conv_mode = AD77681_CONV_CONTINUOUS, // conv_mode
.diag_mux_sel = AD77681_POSITIVE_FS, // diag_mux_sel
.conv_diag_sel = false, // conv_diag_sel
@ -70,37 +70,11 @@ void Main::onTimerCallbackIRQ(STM32_TIM *tim) {
}
#define PACKET_SIZE 1000
static int32_t voicebuf[PACKET_SIZE + 1];
static bool s_prepareNextVoice = false;
void Main::STM32_GPIO_onIRQ(STM32_GPIO *GPIO_Pin, STM32_GPIO::IrqTypeEvent_t irqevent) {
if (GPIO_Pin == &SPI_SLAVE_GPIO) {
/**
* @brief
*
* SPI传输后之后SPI的发送BUF中依然会留有一个数据
*
* SPI模块
*
*/
HAL_SPI_DMAStop(&SLAVE_SPI);
HAL_SPI_Abort(&SLAVE_SPI);
HAL_SPI_DeInit(&SLAVE_SPI);
__HAL_RCC_SPI1_FORCE_RESET();
__HAL_RCC_SPI1_RELEASE_RESET();
MX_SPI1_Init();
memset(voicebuf, 0, sizeof(voicebuf));
if (m_voiceCacheQueue.numElements() < PACKET_SIZE ) {
/**
* @brief
*/
HAL_SPI_Transmit_DMA(&SLAVE_SPI, (uint8_t *)voicebuf, (1) * sizeof(int32_t));
} else {
voicebuf[0] = PACKET_SIZE * 4;
for (int i = 0; i < PACKET_SIZE; i++) {
m_voiceCacheQueue.pop(&voicebuf[i + 1]);
}
HAL_SPI_Transmit_DMA(&SLAVE_SPI, (uint8_t *)voicebuf, (PACKET_SIZE + 1) * 4);
}
s_prepareNextVoice = true;
}
}
// #pragma GCC pop_options
@ -126,12 +100,12 @@ void Main::main(int argc, char const *argv[]) {
// 初始化音频采集定时器
STM32_TIM2.initialize(&htim2, STM32_TIM::kTimMode_timer);
STM32_TIM2.regListener(this);
STM32_TIM2.startTimerByFreq(24000);
STM32_TIM2.startTimerByFreq(16000);
}
{
// 语音上传接口初始化
SPI_SLAVE_GPIO.initAsInput(STM32_GPIO::kInput_fallingIrq, false);
SPI_SLAVE_GPIO.initAsInput(STM32_GPIO::kInput_risingIrq, false);
SPI_SLAVE_GPIO.regListener(this);
}
@ -170,6 +144,48 @@ void Main::main(int argc, char const *argv[]) {
if (m_ticket % 3000 == 0) {
m_hardware.input_sensors_table_dump(0);
}
if (s_prepareNextVoice) {
/**
* @brief
*
* SPI传输后之后SPI的发送BUF中依然会留有一个数据
*
* SPI模块
*
*/
if (SLAVE_SPI.State != HAL_SPI_STATE_READY) {
HAL_SPI_DMAStop(&SLAVE_SPI);
HAL_SPI_Abort(&SLAVE_SPI);
HAL_SPI_DeInit(&SLAVE_SPI);
__HAL_RCC_SPI1_FORCE_RESET();
__HAL_RCC_SPI1_RELEASE_RESET();
MX_SPI1_Init();
}
memset(voicebuf, 0, sizeof(voicebuf));
int32_t nowvoicecount = 0;
{
m_hardware.critical_enter();
nowvoicecount = m_voiceCacheQueue.numElements();
m_hardware.critical_exit();
}
if (nowvoicecount >= PACKET_SIZE) {
voicebuf[0] = PACKET_SIZE * 4;
for (int i = 0; i < PACKET_SIZE; i++) {
m_hardware.critical_enter();
m_voiceCacheQueue.pop(&voicebuf[i + 1]);
m_hardware.critical_exit();
}
HAL_SPI_Transmit_DMA(&SLAVE_SPI, (uint8_t *)voicebuf, (PACKET_SIZE + 1) * 4);
} else {
// 语音还不足一包
HAL_SPI_Transmit_DMA(&SLAVE_SPI, (uint8_t *)voicebuf, (1) * sizeof(int32_t));
}
s_prepareNextVoice = false;
}
HAL_IWDG_Refresh(&hiwdg);
}
}
Loading…
Cancel
Save