蓝桥杯嵌入式模块大全

一.串口通信 

extern放在main.h中

需要初始化

//define
uint8_t RX[20];
uint8_t TX[20];
uint8_t Recount=0;
extern DMA_HandleTypeDef hdma_usart1_rx;
//main
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_Receive_DMA(&huart1,RX,20);
//back function

void Rec_Control()
{
   HAL_UART_Transmit_DMA(&huart1,RX,strlen((char*)TX));
}
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
     Recount = 20 - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
	 Rec_Control();
	 Recount = 0;
	 HAL_UART_Receive_DMA(&huart1,RX,20);
}  
//check function
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)
{
	 __HAL_UART_CLEAR_IDLEFLAG(&huart1);
	 HAL_UART_DMAStop(&huart1);
	 HAL_UART_IdleCpltCallback(&huart1);
}

二.

ADC

double R_37=0;
double R_38=0;
uint8_t str[20];
void Get_R37()
{
     HAL_ADC_Start(&hadc2);
	 HAL_ADC_PollForConversion(&hadc2,10);
	 int temp1 = HAL_ADC_GetValue(&hadc2);
	 R_37 = temp1*3.3/4096;
	 HAL_ADC_Stop(&hadc2);
}
void Get_R38()
{
     HAL_ADC_Start(&hadc1);
	 HAL_ADC_PollForConversion(&hadc1,10);
	 int temp2 = HAL_ADC_GetValue(&hadc1);
	 R_38 = (temp2*3.3)/4096;
}
void Show()
{
	 Get_R37();
	 Get_R38();
     sprintf((char*)str,"     R37  %.2fV",R_37);
	 LCD_DisplayStringLine(Line4,str);
	 sprintf((char*)str,"     R38  %.2fV",R_38);
	 LCD_DisplayStringLine(Line5,str);
}

DAC

开头要填写开始函数

	HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);
	HAL_DAC_Start(&hdac1,DAC_CHANNEL_2);

结束要有Stop函数

void Set_Value(float r39,float r40)
{
     int temp1 = (r39*4096)/3.3;
	 int temp2 = (r40*4096)/3.3;
	
	 HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,temp1);
	 HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_2,DAC_ALIGN_12B_R,temp2);
	 HAL_DAC_Stop(&hdac1,DAC1_CHANNEL_1);
	 HAL_DAC_Stop(&hdac1,DAC1_CHANNEL_2);
}

DAC的一生

配置的时候只需要选择一个就够了

void DAC_Value(uint16_t r39,uint16_t r40)
{
     HAL_DAC_Start(&hdac1,DAC1_CHANNEL_1);
	 HAL_DAC_Start(&hdac1,DAC1_CHANNEL_2);
	 
	 int temp1 = r39*4096/3.3;
	 int temp2 = r40*4096/3.3;
	 HAL_DAC_SetValue(&hdac1,DAC1_CHANNEL_1,DAC_ALIGN_12B_R,temp1);
	 HAL_DAC_SetValue(&hdac1,DAC1_CHANNEL_2,DAC_ALIGN_12B_R,temp2);
	
	 HAL_DAC_Stop(&hdac1,DAC1_CHANNEL_1);
	 HAL_DAC_Stop(&hdac1,DAC1_CHANNEL_2);
}

三.PWM

 PWM-OUT的一生

配置的时候开启时钟源以及输出通道,配置参数

void Change_Fre(uint16_t Fre)
{
     htim3.Init.Prescaler = Fre;
	 HAL_TIM_Base_Init(&htim3);
}
void PWM_Control()
{
     HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
	 __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,500);
	 Change_Fre(499);
	 HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_2);
}
void Change_Fre()
{
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 79;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 500;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
}

IN

单边沿检测,只看频率

HAL_TIM_IC_Start_IT(&htim16,TIM_CHANNEL_1);
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
      ccl_value = __HAL_TIM_GET_COUNTER(&htim16);
	  __HAL_TIM_SetCounter(&htim16,0);
	  f39 = 1000000/ccl_value;
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
      ccl_value = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);
	  f39 = 1000000/ccl_value;
	
	  int temp = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2);
	  duty = temp*100/ccl_value;
}

 

四,RTC

获取日期和时间的都写上,否则会出现错误

获取时间

void Get_Time()
{
	 HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN);
	 HAL_RTC_GetAlarm(&hrtc,&alarm,RTC_ALARM_A,RTC_FORMAT_BIN);
	 HAL_RTC_GetDate(&hrtc,&date,RTC_FORMAT_BIN);
}

常规时间展示

void time()
{
     RTC_DateTypeDef date;
	 RTC_TimeTypeDef time;
	 HAL_RTC_GetDate(&hrtc,&date,RTC_FORMAT_BIN);
	 HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN);
     sprintf((char*)TX,"    %d-%d-%d   ",date.Year,date.Month,date.Date);
	 LCD_DisplayStringLine(Line0,TX);
	 sprintf((char*)TX,"    %d:%d:%d   ",time.Hours,time.Minutes,time.Seconds);
	 LCD_DisplayStringLine(Line1,TX);
}

 暂停&&重启RTC

__HAL_RCC_RTC_DISABLE();
__HAL_RCC_RTC_ENABLE();

重新设定时间

void Set_Time()
{
	 __HAL_RCC_RTC_DISABLE();
     HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN);
	 HAL_RTC_GetAlarm(&hrtc,&alarm,RTC_ALARM_A,RTC_FORMAT_BIN);
	 time.Hours++;
	 alarm.AlarmTime.Hours++;
	 __HAL_RCC_RTC_ENABLE();
}
void Set_Time()
{
  RTC_TimeTypeDef sTime = {0};
  sTime.Hours = 14;
  sTime.Minutes = 32;
  sTime.Seconds = 12;
  sTime.SubSeconds = 0x0;
  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
  {
    Error_Handler();
  }
}

 选中的时间部分高亮

 LCD_DisplayChar(Line4,320-(16*4),'R');
 LCD_DisplayChar(Line4,320-(16*5),'T');
 LCD_DisplayChar(Line4,320-(16*6),'C');
 LCD_DisplayChar(Line4,320-(16*7),':');
 LCD_SetTextColor(Red);
 LCD_DisplayChar(Line4,320-(16*8),time.Hours/10+'0');
 LCD_DisplayChar(Line4,320-(16*9),time.Hours%10+'0');
 LCD_SetTextColor(White);
 LCD_DisplayChar(Line4,320-(16*10),':');
 LCD_DisplayChar(Line4,320-(16*11),time.Minutes/10+'0');
 LCD_DisplayChar(Line4,320-(16*12),time.Minutes%10+'0');
 LCD_DisplayChar(Line4,320-(16*13),':');
 LCD_DisplayChar(Line4,320-(16*14),time.Seconds/10+'0');
 LCD_DisplayChar(Line4,320-(16*15),time.Seconds%10+'0');

五.EEPROM

void Write(unsigned char address,unsigned char info)
{
     I2CStart();
	 I2CSendByte(0xa0);
	 I2CWaitAck();
	
	 I2CSendByte(address);
	 I2CWaitAck();
	 I2CSendByte(info);
	 I2CWaitAck();
	 I2CStop();
}
uint8_t Read(unsigned char address)
{
     I2CStart();
	 I2CSendByte(0xa0);
	 I2CWaitAck();
	 I2CSendByte(address);
	 I2CWaitAck();
	 I2CStop();
	
	 I2CStart();
	 I2CSendByte(0xa1);
	 I2CWaitAck();
	 unsigned char val = I2CReceiveByte();
	 I2CStop();
	 return val;
}

第一次上电 

void Init()
{
     if(Read(0x00)!=20)
	 {
	     HAL_Delay(10);Write(0x00,20);HAL_Delay(10);
		   Write(0x01,51);HAL_Delay(10);
	 }  
	 else if(Read(0x00)==20)
	 {
	     HAL_Delay(10);
		   value = Read(0x01);HAL_Delay(10);
		   Write(0x01,value+1);HAL_Delay(10);
	 }
}	

六.按键扫描

#define B1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define B2 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define B3 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)
#define B4 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
typedef enum
{
	key_check,
	key_press,
	key_release,
}Key_State;
Key_State keystate = key_check;
uint16_t key_count=0;
uint16_t key_scan=0;
uint16_t key_flag=0;
uint16_t key_time=20;
uint16_t key_value=0;
//PART1--KEY
void Key_Scan()
{
	if(key_scan==1)
	{
			 switch (keystate)
			 {
				 case key_check:
				 {
						 if(B1==GPIO_PIN_RESET|B2==GPIO_PIN_RESET|B3==GPIO_PIN_RESET|B4==GPIO_PIN_RESET)
						 {
								keystate = key_press;
						 }
				 }
				 break;
				 case key_press:
				 {
							  if(B1==GPIO_PIN_RESET){keystate = key_release;key_value=1;}
						 else if(B2==GPIO_PIN_RESET){keystate = key_release;key_value=2;}
						 else if(B3==GPIO_PIN_RESET){keystate = key_release;key_value=3;}
						 else if(B4==GPIO_PIN_RESET){keystate = key_release;key_value=4;}
				 }
				 break;
				 case key_release:
				 {
						 if(B1==GPIO_PIN_RESET|B2==GPIO_PIN_RESET|B3==GPIO_PIN_RESET|B4==GPIO_PIN_RESET)
						 {
								 key_time = key_time+10;
						 }
						 else
						 {
								keystate = key_check;
								key_flag=1;
						 }
				 }
				 break;
			 }
	}
}
void Key_Control()
{
   if(key_flag==1)
	 {
	      key_flag=0;
		  if(key_value==1)
			{
			   key_value=0;
				 lcd_state++;
			}
			else if(key_value==2)
			{
			   key_value=0;
				 if(lcd_state%3==1)
				 {
				    rtc_high++;				 
				 }

			}
			else if(key_value==3)
			{
			   key_value=0;
			}
			else if(key_value==4)
			{
			   key_value=0;
			}
	 }
}

七.LCD

void LCD_Show()
{
   if(lcd_show==1)
	 {
	      lcd_show=0;
		  if(lcd_state%2==0)
			{
			   
			}
			else
			{
			
			}
	 }
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 蓝桥杯嵌入式Keil的支持包是为了方便嵌入式软件开发而设计的。Keil作为一款常用嵌入式开发工具,具有强大的功能和稳定的性能,可以帮助开发者快速而高效地进行嵌入式软件的编写和调试。 蓝桥杯嵌入式Keil的支持包提供了对多种嵌入式开发板的支持,包括常见的STM32、51系列单片机等。通过使用这些支持包,开发者可以直接在Keil的开发环境中进行项目配置和编写代码,无需额外的多余设置。 使用蓝桥杯嵌入式Keil的支持包,开发者可以充分发挥Keil的优势,如强大的调试功能、直观的界面设计等,提高开发效率和软件质量。同时,这些支持包还提供了丰富的示例代码和开发文档,帮助开发者更好地理解和使用嵌入式开发板的各种功能,快速上手。 蓝桥杯嵌入式Keil的支持包不仅支持单片机的基本功能,如GPIO控制、定时器、中断等,还支持各种外设模块的驱动,如UART、SPI、I2C等。这些支持包对于参加蓝桥杯嵌入式竞赛的选手来说尤为重要,因为它们能够大大简化开发过程,降低学习和开发的门槛。 总之,蓝桥杯嵌入式Keil的支持包是一个为嵌入式软件开发者提供便利的工具,它充分发挥了Keil的优势,提供了对多种嵌入式开发板的支持,使得软件开发更加高效和简便。通过使用这些支持包,开发者可以更好地应对蓝桥杯嵌入式竞赛的挑战,提升自己的技能水平。 ### 回答2: 蓝桥杯嵌入式keil的支持包是蓝桥杯竞赛扩展嵌入式开发环境和工具的一项重要功能。蓝桥杯是中国IT领域的一项重要竞赛,旨在培养和选拔优秀的计算机人才。而嵌入式开发则是计算机领域的一个重要分支,专门用于设计和开发嵌入式系统。 Keil是一款广泛应用于ARM嵌入式系统开发的集成开发环境(IDE),它提供了丰富的开发工具和支持包来简化嵌入式软件的开发过程。蓝桥杯嵌入式keil支持包是为了配合蓝桥杯嵌入式竞赛而开发的一套针对特定开发需求的支持工具。 蓝桥杯嵌入式keil的支持包主要有以下几个特点和功能:首先,它提供了完整的开发环境,包括Keil MDK集成开发环境、编译器、调试器等。这些工具能够帮助参赛选手更高效地进行软件开发和调试。 其次,蓝桥杯嵌入式keil的支持包还包含了一些专门为竞赛设计的特殊功能。例如,它提供了一套完整的蓝桥杯嵌入式竞赛项目模板,该模板包含了常用的功能代码和设置,可以极大地简化竞赛项目的初始化工作。 此外,蓝桥杯嵌入式keil的支持包还提供了一些与竞赛相关的实用工具和示例代码,这些工具和示例代码可以帮助选手更好地理解竞赛规则和要求,提高编程能力和竞赛成绩。 总之,蓝桥杯嵌入式keil的支持包为参加蓝桥杯嵌入式竞赛的选手提供了一套高效、全面的开发环境和工具,帮助他们更好地完成竞赛项目,培养和选拔优秀的嵌入式系统开发人才。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝本生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值