红叶何时落水
DMA初始化
GPIO_InitTypeDef GPIO_InitStructure;
DMA_InitTypeDef DMA_InitStructure;//结构体定义
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//开启DMA时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOA,&GPIO_InitStructure);//引脚设置为模拟输入
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ((u32)0x4001244C);//ADC外设地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_arr; //采集到的数据要存入的内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 100; //ADC_arr的大小
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_Normal; //是否开启循环传输
DMA_InitStructure.DMA_Priority = DMA_Priority_High ; //DMA优先级设置
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //传输通道的方向
DMA_Init(DMA1_Channel1, &DMA_InitStructure); //初始化
DMA_Cmd(DMA1_Channel1,ENABLE);//使能
ADC初始化
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启时钟
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC独立工作模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //是否使用多通道
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//是否连续采集数据
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //使用软件触发ADC
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //采集到的数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //一共使用一个通道
ADC_Init(ADC1, &ADC_InitStructure);//初始化
RCC_ADCCLKConfig(RCC_PCLK2_Div8);//
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);//采样周期
ADC_DMACmd(ADC1,ENABLE);//开启DMA传输
ADC_Cmd(ADC1,ENABLE);//使能
ADC_ResetCalibration(ADC1);//初始值校准
while(ADC_GetResetCalibrationStatus(ADC1));//
ADC_StartCalibration(ADC1);//
while(ADC_GetCalibrationStatus(ADC1));//
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发
画线函数
void draw(u16 arr[], int len, int height)
{
len = len - 1;
LCD_Fill(0, 0, 240, 100, GREEN);
for(i = 0; i < len; i++) {
LCD_DrawLine(i * 230 / len, 100 - (arr[i] / height), (i + 1) * 230 / len, 100 - (arr[i + 1] / height));
}
}
主函数
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(9600);
delay_init();
KEY_Init();
LCD_Init();
adc_init();
POINT_COLOR=BLUE;
LCD_DrawLine(0, 100, 230, 100);
while(1)
{
t=KEY_Scan(0);
switch(t)
{
case KEY0_PRES:
draw(ADC_arr, 100, 40);
adc_init();
break;
default:
delay_ms(1);
}
}
}
代码链接:ADC_DMA实现波形采集-单片机文档类资源-CSDN文库
更多资源如果需要,请到微信小程序“非遗种草社”留言。