锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

嵌入式理论考试代码整理

时间:2023-09-09 11:07:02 电位器turn

通用函数和模块

延迟停顿函数(软件延迟)

void Delayms(uint16_t N) { 
          uint32_t i;  for (i=0;i<(8000*N);i ); } 

蜂鸣器

实验例程P81页
在这里插入图片描述

//PC0控制 void Beep(void) { 
          //GPIO_SetBits(GPIOC,GPIO_Pin_0);  GPIOC->ODR|=(1<<0);  Delayms(n);  //GPIO_ResetBits(GPIOC,GPIO_Pin_0);  GPIOC->ODR&=~(1<<0); } 

简单按键电路

实验教程P76页

GPIO初始化部分:

void GPIO_KEYLED_Init(void) { 
           GPIO_InitTypeDef GPIO_InitStructure;  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);    //PD11,12  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12;  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   GPIO_Init(GPIOD, &GPIO_InitStructure);       //PC13  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50Mz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	
	GPIO_Init(GPIOC, &GPIO_InitStructure);  
	//PA0
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	
	GPIO_Init(GPIOA, &GPIO_InitStructure); 
	
	//初始化对应端口的引脚
}

直流电机控制

实验例程p82

#define IA(x) ((x) ? (GPIO_SetBits(GPIOE, GPIO_Pin_8)) : (GPIO_ResetBits(GPIOE, GPIO_Pin_8)))
#define IB(x) ((x) ? (GPIO_SetBits(GPIOE, GPIO_Pin_9)) : (GPIO_ResetBits(GPIOE, GPIO_Pin_9)))

双色LED发光二极管

0灭1亮!!!!!!
实验例程p77

#define LEDR(x) ((x) ? (GPIO_SetBits(GPIOB, GPIO_Pin_1)) : (GPIO_ResetBits(GPIOB, GPIO_Pin_1)))
#define LEDG(x) ((x) ? (GPIO_SetBits(GPIOB, GPIO_Pin_2)) : (GPIO_ResetBits(GPIOB, GPIO_Pin_2)))

APB1和APB2

APB1:

APB2:


AHB

DMAAHB上面


GPIO

汇编作为函数的操作

具体背景实验例程p131页汇编,怎么调用看书上p113页

__asm LED10()
{ 
        
	LDR R0,=0x4001140C
	LDRH R1,[R0]
	LDR R2,=0xFFFFFFFB
	AND R1,R1,R2
	STRH R1,[R0]
	BX LR
}

__asm LED11()
{ 
        
	LDR R0,=0x4001140C
	LDRH R1,[R0]
	LDR R2,=0x00000004
	ORR R1,R1,R2
	STRH R1,[R0]
	BX LR
}

跑马灯++

实验例程P133
关键代码,主函数

int main(void)
{ 
        
static u8 KEY=0;	
u8 i=0;
//u16 Pinx[4]={GPIO_Pin_2,GPIO_Pin_3,GPIO_Pin_4,GPIO_Pin_7};
int P[4]={ 
        2,3,4,7};
	SystemInit();     		/* 系统初始化 */
	GPIO_KEYLED_Init();		/* GPIO初始化 */
	while (1)
	{ 
        	
	if ((GPIOD->IDR&(1<<11))==0) 			 { 
        KEY=1;Beep();}
	else{ 
        if ((GPIOD->IDR&(1<<12))==0) { 
        KEY=2;Beep();}
	else { 
        if ((GPIOC->IDR&(1<<13))==0) { 
        KEY=3;Beep();}
	if ((GPIOA->IDR&(1<<0))==0)  			 { 
        KEY=4;Beep();}}}
	
		if(KEY==0){ 
        //GPIO_ResetBits(GPIOD,Pinx[i]); /* LEDi+1亮 */
					GPIOD->ODR&=~(1<<P[i]);
					Delayms(n);													/* 延时n ms */
					//GPIO_SetBits(GPIOD,Pinx[i]); /* LEDi+1灭 */
					GPIOD->ODR|=(1<<P[i]);
					Delayms(n);
				  i++;
					if (i>=4) i=0;	}
			else { 
        //GPIO_ResetBits(GPIOD,Pinx[KEY-1]);/* LED[KEY-1]亮 */
				  GPIOD->ODR&=~(1<<P[KEY-1]);
					Delayms(n);													/* 延时n ms */
					//GPIO_SetBits(GPIOD,Pinx[KEY-1]); /* LED[KEY-1]灭 */
				  GPIOD->ODR|=(1<<P[KEY-1]);
					Delayms(n);		}
	}
}

定时器组件

TIMx更新方式定时实验

void NVIC_Configuration(void)
{ 
        
	
	NVIC_InitTypeDef NVIC_InitStructure;
	
	/* Set the Vector Table base location at 0x08000000 */
	NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
}

TIMx初始化

void TIM_Configuration(void)
{ 
        

	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
							 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3, ENABLE);

	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0	;/*不能少!对于TIM1,TIM8高级定时器必须把重新计数器清零,否则TIM1定时器不准确,利用它可以重新不同的定时次数达到不同定时*/
	/* Time base configuration */
	TIM_TimeBaseStructure.TIM_Period = 10*1000-1; //1000ms
	TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/10000-1;//0;
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

	/* Time base configuration */
	TIM_TimeBaseStructure.TIM_Period = 10*500-1; //500ms
	TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/10000-1;//0;
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;	
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

	/* Time base configuration */
	TIM_TimeBaseStructure.TIM_Period = 10*200-1; //200ms
	TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/10000-1;//0;
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	
	
	/* 使能更新中断 */
	TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
	
	/* 启动中断 */
	TIM_Cmd(TIM1, ENABLE);
	TIM_Cmd(TIM2, ENABLE);
	TIM_Cmd(TIM3, ENABLE);
}

TIMx比较方式定时实验

TIMx初始化

u16 CCR1_Val = 10*2000;	/*定时2000ms*/
u16 CCR2_Val = 10*1000;	/*定时100ms*/
u16 CCR3_Val = 10*400;	/*定时400ms*/
u16 CCR4_Val = 10*200;	/*定时200ms*/

void TIM_Configuration(void)
{ 
        

	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
								 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	/* Time base configuration */
	TIM_TimeBaseStructure.TIM_Period =65535;
	TIM_TimeBaseStructure.TIM_Prescaler =(SystemCoreClock/10000)-1;/*预分频系数*/
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
		
	/* Output Compare Timing Mode configuration: Channel1 */
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;	/*输出定时模式*/
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;/*输出禁止,这里仅比较,不输出*/
	
	TIM_OCInitStructure.TIM_Pulse = CCR1_Val;											/*比较脉冲个数*/
	TIM_OC1Init(TIM3, &TIM_OCInitStructure);
	
	
	/* Output Compare Timing Mode configuration: Channel2 */
	TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);
	
	/* Output Compare Timing Mode configuration: Channel3 */
	TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
	TIM_OC3Init(TIM3, &TIM_OCInitStructure);
	
	//TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
	TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
	TIM_OC4Init(TIM3, &TIM_OCInitStructure);
	
	
	
	/* TIM Interrupts enable */
	TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 |TIM_IT_CC4, ENABLE);
	
	/* TIM3 enable counter */
	TIM_Cmd(TIM3, ENABLE);
}

中断服务函数:

void TIM3_IRQHandler(void)
{ 
        
	uint16_t capture = 0;
	if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
	{ 
        
		TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);		/*是比较中断,清楚中断标志*/
		
   			GPIOD->ODR ^= 1<<2;						/*LED1(PD2)*/
		capture = TIM_GetCapture1(TIM3);	 /*取当前计数值*/
		TIM_SetCompare1(TIM3, capture + CCR1_Val);	/*写新比较值到比较寄存器*/
	}
	else if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
	{ 
        
		TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
		
   			GPIOD->ODR ^= 1<<3;	/*LED2(PD3)*/
		capture = TIM_GetCapture2(TIM3);
		TIM_SetCompare2(TIM3, capture + CCR2_Val);
	}
	else if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
	{ 
        
		TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
		
   			GPIOD->ODR ^= 1<<4;	/*LED3(PD4)*/
		capture = TIM_GetCapture3(TIM3);
		TIM_SetCompare3(TIM3, capture + CCR3_Val);						   
	}
	else if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
	{ 
        
		TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
		
   			GPIOD->ODR ^= 1<<7;	/*LED4(PD7)*/
		capture = TIM_GetCapture4(TIM3);
		TIM_SetCompare4(TIM3, capture + CCR4_Val);						   
	}
	
}

TIM_SetCompare :

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)
{ 
        
  /* Check the parameters */
  assert_param(IS_TIM_LIST8_PERIPH(TIMx));
  /* Set the Capture Compare1 Register value */
  TIMx->CCR1 = Compare1;
}

/** * @brief Sets the TIMx Capture Compare2 Register value * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. * @param Compare2: specifies the Capture Compare2 register new value. * @retval None */
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2)
{ 
        
  /* Check the parameters */
  assert_param(IS_TIM_LIST6_PERIPH(TIMx));
  /* Set the Capture Compare2 Register value */
  TIMx->CCR2 = Compare2;
}

/** * @brief Sets the TIMx Capture Compare3 Register value * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. * @param Compare3: specifies the Capture Compare3 register new value. * @retval None */
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3)
{ 
        
  /* Check the parameters */
  assert_param(IS_TIM_LIST3_PERIPH(TIMx));
  /* Set the Capture Compare3 Register value */
  TIMx->CCR3 = Compare3;
}

PWM实验例程

主函数

int main(void)
 { 
        	
	 
	uint16_t Pulse=7200*0.5;				//占空比50% 周期7200 1ms
	SystemInit();
	PWM_GPIO_Init();		    		//PWM输出口PB8,初始化
	Init_TIMER();					    //定时器4初始化
	Init_PWM(Pulse);			  //PWM的通道3初始化设置 
	GPIO_Configuration();
	TIM2_Cap_Init(0xffff,72-1);	/*以1MHZ的频率计数,初始化TIM2定时器*/
	LCD_Init();					
	Welcome(); 				   
	LED1(1);LED2(1);LED3(1);LED4(1);
	while(1)
	{ 
        		
 		if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_11)==0)   //KEY1按下
		{ 
        
			Pulse+=100;									   //占空比+100
			if(Pulse>=7200-1) Pulse=1;
			TIM_SetCompare3(TIM4,Pulse);  //写入定时器4的通道3的占空比值
		}
	
		
		if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==0)   //KEY2按下
		{ 
        
			Pulse-=100;					//占空比-100
			if((Pulse<1)||(Pulse>7200))   Pulse=7200-1;
			TIM_SetCompare3(TIM4,Pulse); //写入定时器4的通道3的占空比值
		}
			Delay_ms(100);
			LCD_ShowNum(80,190,Pulse,8,16);		/*显示总的脉冲个数*/
			LCD_ShowNum(80,230,Pulse*100/7200,8,16);    /*显示总的脉冲个数*/
}
}



TIM2_Cap_Init:

void TIM2_Cap_Init(u16 arr,u16 psc)
{ 
        	 
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_ICInitTypeDef  TIM2_ICInitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /*使能TIM2时钟*/
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/*使能GPIOA时钟*/
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;    	/*PA0 引脚*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   /*PA0 上拉输入*/ 
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA,GPIO_Pin_0);						 
	
	/*初始化定时器2 TIM2 */
	TIM_TimeBaseStructure.TIM_Period = arr;    /*设定计数器自动重装值 */
	TIM_TimeBaseStructure.TIM_Prescaler =psc;  /*预分频器*/
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;	/*设置时钟分割:TDTS = Tck_tim*/
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /*TIM向上计数模式*/
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 		
  
	
	TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; 								
  	TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;			
  	TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;	
  	TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;						
  	TIM2_ICInitStructure.TIM_ICFilter = 0x00;													
  	TIM_ICInit(TIM2, &TIM2_ICInitStructure);
	
	
	NVIC_InitStructure.NVIC_IRQChannel  

相关文章