定时器(TIMER)触发多通道ADC-DMA采集


前言

提示:这里可以添加本文要记录的大概内容:

项目需要:

TIMER->ADC->DMA

定时器1通道1 比较触发
ADC1 通道0 PA0 通道1 PA1 模拟输入
DMA 采集数组到数组

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、框图

在这里插入图片描述

在这里插入图片描述

二、配置定时器

1.参考程序

代码如下(示例):

TIMER1 CH1 :不用配置引脚 ,用的是比较资源。

void timer1(u16 period,u16 prescaler)
{
      /*
	
	1.开启APB1时钟   72MHz
	2.配置定时器6    TimeInit()  72预分配,0-65535     1000000us/50000us =CNT=20         定时时间/中断溢出时间=计数值
	3.中断配置       分组,优先级 。开启中断源
	4.中断服务函数   计数值, 1us  ,计数20次后让一个LED取反
	*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_OCInitTypeDef  TIM_OCInitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
	
	//TIM_TimeBaseInitStruct.TIM_ClockDivision=
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=period-1;//50000-1;
	TIM_TimeBaseInitStruct.TIM_Prescaler=prescaler-1;// 72-1;
	//TIM_TimeBaseInitStruct.TIM_RepetitionCounter=
	
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
	
	 //TIM_OCInitStruct.TIM_OCIdleState=	 
	// TIM_OCInitStruct.TIM_OCNIdleState=
	  TIM_OCInitStruct.TIM_OCMode= TIM_OCMode_PWM1;
	  TIM_OCInitStruct.TIM_OCPolarity= TIM_OCPolarity_High;
	//  TIM_OCInitStruct.TIM_OCNPolarity=
	//  TIM_OCInitStruct.TIM_OutputNState=
	  TIM_OCInitStruct.TIM_OutputState= TIM_OutputState_Enable;
	  TIM_OCInitStruct.TIM_Pulse= period/2; //百分之50占空比
		 	
	TIM_OC1Init(TIM1, &TIM_OCInitStruct);
	
	TIM_CtrlPWMOutputs(TIM1, ENABLE);
	
	
	//开启中断:
//	TIM_ITConfig( TIM1, TIM_IT_CC1, ENABLE);
	
	TIM_Cmd( TIM1, ENABLE);      //使能
	
}

三、配置ADC

ADC1 : PA0 PA1

3.1 开时钟
3.2配置引脚
3.3 转换通道数为2,连续关闭,定时器1通道1比较触发,开启扫描模式(因为开启了2个通道)
3.4使能ADC_DMA通道转换
3.5 配置每个通道转换顺序和采样时间
3.6 复位ADC
3.7校准ADC
3.8 ADC 外部触发使能 (定时器触发才能有效)
ADC_ExternalTrigConvCmd(ADC1, ENABLE);
代码如下(示例):

void adc1_init()
{
	u16 adc_temp;
	ADC_InitTypeDef ADC_InitStruct;
	GPIO_InitTypeDef  GPIO_InitStruct;
	//1.开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);// 72/6=12
	//2.配置引脚   PA0为模拟输入
			
	GPIO_InitStruct.GPIO_Pin=  GPIO_Pin_0|GPIO_Pin_1;          // 通道0 和通道1 
	GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
	
	GPIO_Init(GPIOA, &GPIO_InitStruct);   //&x
	
	ADC_InitStruct.ADC_ContinuousConvMode= DISABLE;//关闭连续转换
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStruct.ADC_ExternalTrigConv=  ADC_ExternalTrigConv_T1_CC1;// 重点  time1  通道1的比较
	ADC_InitStruct.ADC_Mode= ADC_Mode_Independent;
	ADC_InitStruct.ADC_NbrOfChannel= 2;
	ADC_InitStruct.ADC_ScanConvMode= ENABLE;
	ADC_Init(ADC1,  &ADC_InitStruct);
	
		/* 使能ADC1对应的DMA */
	ADC_DMACmd(ADC1, ENABLE);
	

	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_1Cycles5);
	ADC_Cmd(ADC1, ENABLE);
	
// 复位和校准ADC	
	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1));  //为0说明复位完成
	ADC_StartCalibration(ADC1);
	while( ADC_GetCalibrationStatus( ADC1)); //为0说明校准完成
	
// 软件触发转换  等待转换完成	
//	 ADC_SoftwareStartConvCmd( ADC1, ENABLE);


//    while(!ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC) );
//	 adc_temp=ADC_GetConversionValue(ADC1);
	  
//	  printf("ADC的电压为 %d \r\n",adc_temp);
     ADC_ExternalTrigConvCmd(ADC1, ENABLE);
					
}

四、配置DMA

4.1 配置DMA 的 到ADC的数据寄存器的地址
4.2配置DMA搬运数据目标地址
4.3设置转换数目为2,因为两个通道
4.4配置转换字节为半字
4.5 配置连续转换

#define ADC1_DR_Address ((uint32_t)0x40012400+0x4C)//ADC数据外设基地址
 // * @返回值:无
//  */
void DMA_ADC_Configure(void)
{
	/* 定义DMA初始化结构体 */
	DMA_InitTypeDef  DMA_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure; 
	
	/* 打开DMA时钟 */
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
	
	/* 外设基地址 */
	DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
	/* RAM基地址 */
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
	/* 传输方向,外设为源地址 */
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
	
	/* 缓冲区大小,即一次传输的数据量,范围0~65536,此处为1 */
	DMA_InitStructure.DMA_BufferSize = 2;
	/* 外设和RAM地址不自增 */
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
	
	/*外设和RAM数据宽度,AD为12位,因此宽度为半字(16位)*/
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
	
	/* 传输模式,循环传送 */
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
	/* 优先级高 */
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;
	/* 非内存到内存传输 */
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
	
	/* 完成配置 */
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);
	
	/* 允许传输完成中断 */
	DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
	
	/* 开启DMA */
	DMA_Cmd(DMA1_Channel1, ENABLE);	


//	/* 允许DMA中断 */
//  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//	NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//	NVIC_Init(&NVIC_InitStructure);			

}

完整参考程序

#include "stm32f10x.h"

#include "stdio.h"

__IO uint16_t ADCConvertedValue[2];

u8 DMA_ADC_OK;



/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

void timer1(u16 period,u16 prescaler)
{
      /*
	
	1.开启APB1时钟   72MHz
	2.配置定时器6    TimeInit()  72预分配,0-65535     1000000us/50000us =CNT=20         定时时间/中断溢出时间=计数值
	3.中断配置       分组,优先级 。开启中断源
	4.中断服务函数   计数值, 1us  ,计数20次后让一个LED取反
	*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_OCInitTypeDef  TIM_OCInitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
	
	//TIM_TimeBaseInitStruct.TIM_ClockDivision=
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=period-1;//50000-1;
	TIM_TimeBaseInitStruct.TIM_Prescaler=prescaler-1;// 72-1;
	//TIM_TimeBaseInitStruct.TIM_RepetitionCounter=
	
	
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
	
	 //TIM_OCInitStruct.TIM_OCIdleState=	 
	// TIM_OCInitStruct.TIM_OCNIdleState=
	  TIM_OCInitStruct.TIM_OCMode= TIM_OCMode_PWM1;
	  TIM_OCInitStruct.TIM_OCPolarity= TIM_OCPolarity_High;
	//  TIM_OCInitStruct.TIM_OCNPolarity=
	//  TIM_OCInitStruct.TIM_OutputNState=
	  TIM_OCInitStruct.TIM_OutputState= TIM_OutputState_Enable;
	  TIM_OCInitStruct.TIM_Pulse= period/2; //百分之50占空比
		 	
	TIM_OC1Init(TIM1, &TIM_OCInitStruct);
	
	TIM_CtrlPWMOutputs(TIM1, ENABLE);
	
	
	//开启中断:
	TIM_ITConfig( TIM1, TIM_IT_CC1, ENABLE);
	
	TIM_Cmd( TIM1, ENABLE);      //使能
	
}



void adc1_init()
{
	u16 adc_temp;
	ADC_InitTypeDef ADC_InitStruct;
	GPIO_InitTypeDef  GPIO_InitStruct;
	//1.开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);// 72/6=12
	//2.配置引脚   PA0为模拟输入
			
	GPIO_InitStruct.GPIO_Pin=  GPIO_Pin_0|GPIO_Pin_1;          // 通道0 和通道1 
	GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
	
	GPIO_Init(GPIOA, &GPIO_InitStruct);   //&x
	
	ADC_InitStruct.ADC_ContinuousConvMode= DISABLE;//启动连续转换
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStruct.ADC_ExternalTrigConv=  ADC_ExternalTrigConv_T1_CC1;
	ADC_InitStruct.ADC_Mode= ADC_Mode_Independent;
	ADC_InitStruct.ADC_NbrOfChannel= 2;
	ADC_InitStruct.ADC_ScanConvMode= ENABLE;
	ADC_Init(ADC1,  &ADC_InitStruct);
	
		/* 使能ADC1对应的DMA */
	ADC_DMACmd(ADC1, ENABLE);
	

	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);
	ADC_Cmd(ADC1, ENABLE);
	
// 复位和校准ADC	
	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1));  //为0说明复位完成
	ADC_StartCalibration(ADC1);
	while( ADC_GetCalibrationStatus( ADC1)); //为0说明校准完成
	
	ADC_ExternalTrigConvCmd(ADC1, ENABLE);
	
 软件触发转换  等待转换完成	
//	 ADC_SoftwareStartConvCmd( ADC1, ENABLE);


//    while(!ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC) );
//	 adc_temp=ADC_GetConversionValue(ADC1);
//	  
//	  printf("ADC的电压为 %d \r\n",adc_temp);
					
}

#define ADC1_DR_Address ((uint32_t)0x40012400+0x4C)//ADC数据外设基地址
 // * @返回值:无
//  */
void DMA_ADC_Configure(void)
{
	/* 定义DMA初始化结构体 */
	DMA_InitTypeDef  DMA_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure; 
	
	/* 打开DMA时钟 */
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
	
	/* 外设基地址 */
	DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
	/* RAM基地址 */
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
	/* 传输方向,外设为源地址 */
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
	
	/* 缓冲区大小,即一次传输的数据量,范围0~65536,此处为1 */
	DMA_InitStructure.DMA_BufferSize = 2;
	/* 外设和RAM地址不自增 */
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
	
	/*外设和RAM数据宽度,AD为12位,因此宽度为半字(16位)*/
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
	
	/* 传输模式,循环传送 */
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
	/* 优先级高 */
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;
	/* 非内存到内存传输 */
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
	
	/* 完成配置 */
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);
	
	/* 允许传输完成中断 */
//	DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
	
	/* 开启DMA */
	DMA_Cmd(DMA1_Channel1, ENABLE);	


//	/* 允许DMA中断 */
//  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//	NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//	NVIC_Init(&NVIC_InitStructure);			

}
void usart1_init()
{

//PA9  TX  PA10 RX   USART1
	
	
	GPIO_InitTypeDef GPIO_InitStruct;
	USART_InitTypeDef USART_InitStruct;
	
	NVIC_InitTypeDef NVIC_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);//1.开时钟
	
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;//发送
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;//接收
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	
	
	USART_InitStruct.USART_BaudRate=115200;
	USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
	USART_InitStruct.USART_Parity=USART_Parity_No;
	USART_InitStruct.USART_StopBits=USART_StopBits_1;
	USART_InitStruct.USART_WordLength=USART_WordLength_8b;
	
	USART_Init(USART1, &USART_InitStruct);//2.初始化串口 
	
	USART_Cmd(USART1, ENABLE);//3.是能串口
	
	USART_SendData(USART1, '4');
	
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)!=1);
	
	
	USART_SendData(USART1, '1');
		while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)!=1);
	
	
	USART_SendData(USART1, 0X41);
		while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)!=1);
	USART_SendData(USART1, 41);
		while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)!=1);
	
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE );// 4.接受完成中断
	
	
	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 5.配置中断分组
	 NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
	 NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
	 NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;	 
	 
   NVIC_Init(&NVIC_InitStruct);//配置中断优先级
	

}

int fputc(int ch,FILE *f)
{

	   USART_SendData(USART1, (u8)ch);
	   while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));
	   return ch;
}

u16 ADC_channel_0()
{
     u16 temp;
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
	// 软件触发转换  等待转换完成	
	 ADC_SoftwareStartConvCmd( ADC1, ENABLE);
     while(!ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC) );
	 temp=ADC_GetConversionValue(ADC1);
	return temp;

}


u16 ADC_channel_1()
{
     u16 temp;
		ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);
	// 软件触发转换  等待转换完成	
	 ADC_SoftwareStartConvCmd( ADC1, ENABLE);
     while(!ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC) );
	 temp=ADC_GetConversionValue(ADC1);
	return temp;

}


//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
  	//设置指定ADC的规则组通道,一个序列,采样时间
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC通道,采样时间为239.5周期	  			    
  
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能	
	 
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

	return ADC_GetConversionValue(ADC1);	//返回最近一次ADC1规则组的转换结果
}

u16 Get_Adc_Average(u8 ch,u8 times)
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t<times;t++)
	{
		temp_val+=Get_Adc(ch);
		Delay_ms(5);
	}
	return temp_val/times;
} 	 

 


int main()
{
	u16 ad_temp;
	timer1(1000,72);
	usart1_init();
	printf("串口初始化成功 \r\n");	
	
	adc1_init();//复位一次读取一次电压
	DMA_ADC_Configure();


	while(1)
	{
		
		if(DMA_ADC_OK || 1)// 修改为检查 timer1的 ch1捕捉中断,要么用溢出中断更新 ADC通道数据,就可以显示完整正弦波波形数据
		{
				printf("ADC_channel_0的电压为 %d \r\n",ADCConvertedValue[0]);
				printf("ADC_channel_1的电压为 %d \r\n",ADCConvertedValue[1]);
			  DMA_ADC_OK=0;
			Delay_ms(1000);
		
		}
	
//			ad_temp=ADC_channel_0();
//		
//		  printf("ADC_channel_0的电压为 %d \r\n",ad_temp);
		
//		 ad_temp=ADC_channel_1();
//		
//		  printf("ADC_channel_1的电压为 %d \r\n",ad_temp);
		
		
	
	}


}

/**
  * @简介:DMA1通道1中断服务程序
  * @参数: 延时毫秒数
  * @返回值:无
  */
/*void DMA1_Channel1_IRQHandler(void)
{
	/* 检测DMA1 Channel1 传输完成中断 */
	if(DMA_GetITStatus(DMA1_IT_TC1))
	{
		/* 传输完成标志置1 */
		DMA_ADC_OK = 1;
		/* 清除中断 */
		DMA_ClearITPendingBit(DMA1_IT_GL1);
	}
}*/






//#include "stm32f10x.h"
//int main(void)
//{
 1.//时钟
 2.//功能配置   
//    //LED0  PA8
// //   sbit led0=P1^0;
//    
//    /*
//    
//1. PC5 上拉输入   
//2. 时钟  
//3.数据寄存器    
//    
//    
//    
//    */
//    
//    GPIO_InitTypeDef GPIO_InitStructure;
//    
//    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
//    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
//    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
//    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
//    GPIO_Init(GPIOA, & GPIO_InitStructure);
//    
//    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
//    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
//    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
//    GPIO_Init(GPIOD, & GPIO_InitStructure);
// //key0  
//    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
//    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
//    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
//    GPIO_Init(GPIOC, & GPIO_InitStructure); 
//    
//     //key1  
//    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;
//    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
//    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
//    GPIO_Init(GPIOA, & GPIO_InitStructure); 


//    
//    while(1)       
//    {
//             if(GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_5)==0)
//             {
//              
//                    GPIO_ResetBits(GPIOA, GPIO_Pin_8);   //亮          
//                  
//             }
//             else
//             {
//                    GPIO_SetBits(GPIOA, GPIO_Pin_8);//灭
//                
//             
//             }
//             if(GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_15)==0)
//             {
//              
//                    
//                    GPIO_ResetBits(GPIOD, GPIO_Pin_2);
//             }
//             else
//             {
//              
//                    GPIO_SetBits(GPIOD, GPIO_Pin_2);
//             
//             }
//             
//             
//             
//    }
//}



五、实验结果

在这里插入图片描述

总结

学习使人快乐!
音乐使人愉悦!
日积月累使人充实和自信!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值