stm32407,ADC采集数据10秒DMA搬运数据存到flash里面,在从flash里面读出数据通过DAC输出出来 模块化程序
时间: 2023-12-19 15:07:56 浏览: 21
以下是一个简单的模块化程序,其中包括了ADC、DMA、Flash和DAC的初始化和配置以及数据采集、搬运和输出的代码。你可以根据自己的需要进行修改和扩展。
```
// ADC DMA Flash DAC模块化程序
#include "stm32f407xx.h"
// 定义Flash地址
#define FLASH_ADDRESS 0x080E0000
// 定义采样时间
#define SAMPLE_TIME 56
// 定义采样数据缓冲区大小
#define BUFFER_SIZE 1000
// 定义数据搬运完成标志
volatile uint8_t transferComplete = 0;
// 定义DMA传输完成回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {
// 设置数据搬运完成标志
transferComplete = 1;
}
// 初始化ADC
void initADC() {
// 初始化ADC GPIO
__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);
// 初始化ADC
__HAL_RCC_ADC1_CLK_ENABLE();
ADC_HandleTypeDef hadc = {0};
hadc.Instance = ADC1;
hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.ScanConvMode = DISABLE;
hadc.Init.ContinuousConvMode = ENABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.NbrOfDiscConversion = 0;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc);
// 配置ADC通道
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
sConfig.SamplingTime = SAMPLE_TIME;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
}
// 初始化DMA
void initDMA(uint32_t* buffer, uint32_t bufferSize) {
// 初始化DMA
__HAL_RCC_DMA2_CLK_ENABLE();
DMA_HandleTypeDef hdma = {0};
hdma.Instance = DMA2_Stream0;
hdma.Init.Channel = DMA_CHANNEL_0;
hdma.Init.Direction = DMA_MEMORY_TO_MEMORY;
hdma.Init.PeriphInc = DMA_PINC_ENABLE;
hdma.Init.MemInc = DMA_MINC_ENABLE;
hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma.Init.Mode = DMA_NORMAL;
hdma.Init.Priority = DMA_PRIORITY_HIGH;
HAL_DMA_Init(&hdma);
// 配置DMA传输
HAL_DMA_Start_IT(&hdma, (uint32_t)&ADC1->DR, (uint32_t)buffer, bufferSize);
}
// 初始化Flash
void initFlash() {
// 初始化Flash
HAL_FLASH_Unlock();
FLASH_Erase_Sector(FLASH_SECTOR_11, FLASH_VOLTAGE_RANGE_3);
HAL_FLASH_Lock();
}
// 将数据存储到Flash
void writeFlash(uint32_t* buffer, uint32_t bufferSize) {
// 写入数据到Flash
HAL_FLASH_Unlock();
for (int i = 0; i < bufferSize; i++) {
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_ADDRESS + i * 4, buffer[i]);
}
HAL_FLASH_Lock();
}
// 从Flash读取数据
void readFlash(uint32_t* buffer, uint32_t bufferSize) {
// 从Flash读取数据
for (int i = 0; i < bufferSize; i++) {
buffer[i] = *(uint32_t*)(FLASH_ADDRESS + i * 4);
}
}
// 初始化DAC
void initDAC() {
// 初始化DAC GPIO
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 初始化DAC
__HAL_RCC_DAC_CLK_ENABLE();
DAC_HandleTypeDef hdac = {0};
hdac.Instance = DAC;
HAL_DAC_Init(&hdac);
// 配置DAC通道
DAC_ChannelConfTypeDef sConfig = {0};
sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1);
}
// 启动ADC转换
void startADC() {
HAL_ADC_Start(&hadc);
}
// 停止ADC转换
void stopADC() {
HAL_ADC_Stop(&hadc);
}
// 启动DMA传输
void startDMA(uint32_t* buffer, uint32_t bufferSize) {
HAL_DMA_Start_IT(&hdma, (uint32_t)&ADC1->DR, (uint32_t)buffer, bufferSize);
}
// 停止DMA传输
void stopDMA() {
HAL_DMA_Abort_IT(&hdma);
}
// 启动DAC输出
void startDAC(uint32_t* buffer, uint32_t bufferSize) {
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t)buffer, bufferSize, DAC_ALIGN_12B_R);
}
// 停止DAC输出
void stopDAC() {
HAL_DAC_Stop_DMA(&hdac, DAC_CHANNEL_1);
}
int main(void) {
// 初始化ADC、DMA、Flash和DAC
initADC();
initDMA((uint32_t*)0x20000000, BUFFER_SIZE);
initFlash();
initDAC();
while (1) {
// 启动ADC转换和DMA传输
startADC();
startDMA((uint32_t*)0x20000000, BUFFER_SIZE);
// 等待数据搬运完成
while (!transferComplete);
// 停止ADC转换和DMA传输
stopADC();
stopDMA();
// 将数据存储到Flash
writeFlash((uint32_t*)0x20000000, BUFFER_SIZE);
// 从Flash读取数据并输出到DAC
readFlash((uint32_t*)0x20000000, BUFFER_SIZE);
startDAC((uint32_t*)0x20000000, BUFFER_SIZE);
// 等待DAC输出完成
HAL_DAC_Stop_DMA(&hdac, DAC_CHANNEL_1);
// 重置数据搬运完成标志
transferComplete = 0;
}
}
```