hal库基于stm32f407 写出ADC读取语音电信号,内部flash存储10sADC读取的语音信号,后用dac再将flash内部信号输出,实现语音回放掉电存储的代码
时间: 2024-05-02 18:16:13 浏览: 13
以下是基于STM32F407的HAL库的ADC读取语音电信号、内部Flash存储10s ADC读取的语音信号、用DAC将Flash内部信号输出的代码:
```
#include "stm32f4xx_hal.h"
#include "stm32f4xx_hal_flash.h"
#include "stm32f4xx_hal_dac.h"
#define FLASH_START_ADDR ((uint32_t)0x080E0000) // Internal flash start address
#define FLASH_SECTOR FLASH_SECTOR_11 // Internal flash sector for storage
#define AUDIO_SAMPLE_RATE 8000 // Audio sample rate in Hz
#define AUDIO_SAMPLE_SIZE 16 // Audio sample size in bits
#define AUDIO_BUFFER_SIZE (AUDIO_SAMPLE_RATE * 10 * AUDIO_SAMPLE_SIZE / 8) // Audio buffer size in bytes
ADC_HandleTypeDef hadc1;
DAC_HandleTypeDef hdac;
FLASH_EraseInitTypeDef flashErase;
uint8_t audioBuffer[AUDIO_BUFFER_SIZE];
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_DAC_Init(void);
static void MX_NVIC_Init(void);
int main(void) {
uint32_t flashAddress = FLASH_START_ADDR;
uint32_t audioSampleCount = AUDIO_SAMPLE_RATE * 10;
uint32_t audioSampleSize = AUDIO_SAMPLE_SIZE / 8;
uint32_t audioBufferSize = audioSampleCount * audioSampleSize;
uint32_t audioBufferIndex = 0;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_DAC_Init();
MX_NVIC_Init();
HAL_ADC_Start(&hadc1);
HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
while (1) {
uint32_t adcValue = HAL_ADC_GetValue(&hadc1);
audioBuffer[audioBufferIndex++] = (uint8_t)(adcValue & 0xFF);
audioBuffer[audioBufferIndex++] = (uint8_t)(adcValue >> 8);
if (audioBufferIndex >= audioBufferSize) {
HAL_DAC_Stop(&hdac, DAC_CHANNEL_1);
HAL_FLASH_Unlock();
flashErase.TypeErase = TYPEERASE_SECTORS;
flashErase.Sector = FLASH_SECTOR;
flashErase.NbSectors = 1;
flashErase.VoltageRange = VOLTAGE_RANGE_3;
uint32_t sectorError;
HAL_FLASHEx_Erase(&flashErase, §orError);
for (uint32_t i = 0; i < audioBufferSize; i += 4) {
uint32_t data = *(uint32_t *)(audioBuffer + i);
HAL_FLASH_Program(TYPEPROGRAM_WORD, flashAddress + i, data);
}
HAL_FLASH_Lock();
audioBufferIndex = 0;
HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
}
}
}
void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 16;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
RCC_OscInitStruct.PLL.PLLQ = 7;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
}
static void MX_ADC1_Init(void) {
ADC_ChannelConfTypeDef sConfig;
__HAL_RCC_ADC1_CLK_ENABLE();
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc1);
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
static void MX_DAC_Init(void) {
DAC_ChannelConfTypeDef sConfig;
__HAL_RCC_DAC_CLK_ENABLE();
hdac.Instance = DAC;
HAL_DAC_Init(&hdac);
sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1);
}
static void MX_GPIO_Init(void) {
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
static void MX_NVIC_Init(void) {
HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
}
void DMA1_Stream5_IRQHandler(void) {
HAL_DMA_IRQHandler(&hdac);
}
```
这个代码中,我们使用`HAL_ADC_GetValue()`函数从ADC读取语音信号,并将其存储在一个缓冲区中。当缓冲区被填满时,我们停止DAC并将缓冲区中的数据存储到内部Flash中。然后,我们重置缓冲区并开始DAC以回放存储的语音信号。