stm32简易示波器程序
时间: 2023-08-31 07:12:46 浏览: 44
以下是一个简单的示波器程序,使用STM32F103C8T6作为微控制器,并使用ADC和DMA实现数据采集:
```c
#include "stm32f10x.h"
#define ADC1_DR_Address ((uint32_t)0x4001244C) //定义ADC1 DR地址
uint16_t ADC_ConvertedValue[128]; //定义存储ADC值的数组
uint8_t Current_Point = 0; //当前存储点
void ADC_DMA_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); //使能GPIOA和ADC1时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA1时钟
//配置ADC输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置DMA通道
DMA_DeInit(DMA1_Channel1); //复位DMA1通道1
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //设置DMA外设地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue; //设置DMA内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //设置DMA传输方向
DMA_InitStructure.DMA_BufferSize = 128; //设置DMA缓存大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //禁止外设地址增量
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //使能内存地址增量
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //设置外设数据大小
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //设置内存数据大小
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //设置DMA模式为循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //设置DMA优先级为高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //禁止内存到内存传输
DMA_Init(DMA1_Channel1, &DMA_InitStructure); //初始化DMA1通道1
//配置ADC
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //设置ADC工作模式为独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //使能连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //设置数据对齐方式为右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //设置采样通道数
ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC1
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_28Cycles5); //配置ADC采样通道
//使能DMA传输
ADC_DMACmd(ADC1, ENABLE);
//使能ADC转换器
ADC_Cmd(ADC1, ENABLE);
//启动ADC连续转换
ADC_ResetCalibration(ADC1); //重置校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //等待校准寄存器重置完成
ADC_StartCalibration(ADC1); //开始校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准完成
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开始连续转换
}
int main(void)
{
ADC_DMA_Init(); //初始化ADC和DMA
while (1)
{
//将ADC采样值输出到串口
printf("%d\r\n", ADC_ConvertedValue[Current_Point]);
//将当前存储点移动到下一个位置
Current_Point++;
if (Current_Point >= 128) Current_Point = 0;
//等待一段时间,控制采样频率
for (int i = 0; i < 10000; i++);
}
}
```
这个程序会持续地采集ADC数据,并将其输出到串口。你可以使用串口调试助手等工具来查看采集到的波形数据。
请注意,这个程序只能采集单通道的数据,如果你需要采集多通道数据或者需要更高的采样速率,你需要对程序进行修改。