导图社区 蓝桥杯嵌入式
每一步都有截图,详细说明,本人网上四处收集写的好的代码为己所用,已取得省一。有需要的赶紧收藏吧!
编辑于2024-04-12 23:54:08蓝桥杯
环境配置
芯片选择
sys
路径也要中文
配置
led的控制
引脚配置gpio_output
gpio配置
普通点亮灯
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_9);//反转函数 HAL_Delay(500); HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET); HAL_Delay(1000); HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET); HAL_Delay(1000);
函数亮灯
uint8_t led_sta=0x00; void LED_Disp(uint8_t dsLED) { HAL_GPIO_WritePin(GPIOC ,GPIO_PIN_All,GPIO_PIN_SET );//所有LED熄灭(1小写) HAL_GPIO_WritePin(GPIOC ,dsLED <<8,GPIO_PIN_RESET);//左移8位:控制C8-15引脚,值为1的点亮 HAL_GPIO_WritePin(GPIOD ,GPIO_PIN_2,GPIO_PIN_SET );//开锁存器 HAL_GPIO_WritePin(GPIOD ,GPIO_PIN_2,GPIO_PIN_RESET );//关锁存器 } void LED_Chg(uint8_t num,uint8_t sta) { uint8_t pos=0x01<<(num-1); led_sta =(led_sta &(~pos ))|(pos *sta ); LED_Disp (led_sta ); } LED_Disp (0x00);//led初始化 LED_Chg (3,1);//点亮第三个灯 LED_Chg (3,0);//关闭第三个灯
按键
按键中断
配置
PB1和PA1不能同时使用
子主题
子主题
子主题
子主题
子主题
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin ==GPIO_PIN_0 ) { LED_Chg (1,1); HAL_Delay(500); LED_Chg (1,0); HAL_Delay(500); } if(GPIO_Pin ==GPIO_PIN_1 ) { LED_Chg (2,1); HAL_Delay(500); LED_Chg (2,0); HAL_Delay(500); } if(GPIO_Pin ==GPIO_PIN_2 ) { LED_Chg (3,1); HAL_Delay(500); LED_Chg (3,0); HAL_Delay(500); } }
中断函数里面前面delay的优先级因该在中断前面
按键消抖
四个全都选input
struct Bkeys { uint8_t age; uint8_t flag; }; struct Bkeys bkey[5]={0,0}; uint8_t key_read() { if(HAL_GPIO_ReadPin (GPIOB ,GPIO_PIN_0 )==0)return 1; else if(HAL_GPIO_ReadPin (GPIOB ,GPIO_PIN_1 )==0)return 2; else if(HAL_GPIO_ReadPin (GPIOB ,GPIO_PIN_2 )==0)return 3; else if(HAL_GPIO_ReadPin (GPIOA ,GPIO_PIN_0 )==0)return 4; else return 0; } void key_sery() { uint8_t key_sta=key_read (); if(key_sta !=0) { bkey[key_sta ].age ++; if(bkey[key_sta ].age==2)bkey[key_sta].flag=1; } else { for(int i=0;i<5;i++)bkey[i].age =0; } }
key_sery();//放在定时器里面
if(bkey [1].flag==1) { LED_Chg (1,1); LED_Chg (2,0); sprintf(text ," hdios %10d ",1); LCD_DisplayStringLine(Line2,(uint8_t *) text ); bkey [1].flag=0;//最后一定要归零 }
lcd显示
配置
手册上所有的都配置ouput
官方里面的文件添加进去
代码
#include "lcd.h" #include "stdio.h"//声明
LCD_Init();//lcd初始化
lcd.h里面找
LCD_Clear(Blue );//设置整个屏幕颜色 LCD_SetTextColor(Yellow );//设置文字颜色 LCD_SetBackColor(Red );//设置文字背景颜色
char text[30]; sprintf(text ," hdios "); LCD_DisplayStringLine(Line2,(uint8_t *) text );
定时器中断
配置
打开定时器
打开中断
代码
HAL_TIM_Base_Start_IT(&htim6);//打开中段
HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//中断函数
pwm
配置
代码
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3 );//打开pwm通道定时器2通道3
__HAL_TIM_SET_AUTORELOAD (&htim2,250);//设置重装载值 __HAL_TIM_SetCompare (&htim2,TIM_CHANNEL_3,100 );//设置预分配系数
rtc时钟
配置
代码
RTC_TimeTypeDef time; RTC_DateTypeDef date; HAL_RTC_GetTime(&hrtc, &time,RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN); sprintf(text ," shijian:%d:%d:%d ",time.Hours,time .Minutes ,time .Seconds ); LCD_DisplayStringLine(Line8,(uint8_t *) text );
ADC采样
配置
子主题
代码
HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED );//ADC初始化
float adc_read(ADC_HandleTypeDef *hadc) { uint16_t adc_val; float adc_f; HAL_ADC_Start (hadc ); adc_val =HAL_ADC_GetValue (hadc ); adc_f =adc_val *3.3f/4095.0f; return adc_f; }
函数
float adc_data_PB15;
定义
adc_data_PB15 =adc_read (&hadc2 ); sprintf(text ," PB15:%.4fV",adc_data_PB15 ); LCD_DisplayStringLine(Line4,(uint8_t *) text );
while1里面显示
串口通信
配置
波特率配置9600
代码
#include "string.h"
后面使用strlen函数
sprintf(usart_tx ," PB15:%.4fV \r\n",adc_data_PB15 ); HAL_UART_Transmit(&huart1,(uint8_t*)usart_tx,strlen(usart_tx),50);
向串口发送
HAL_UARTEx_ReceiveToIdle_IT(&huart1,(uint8_t *)usart_rx, 50);//重复接收
串口接收在while(1)前面
char usart_tx[50]; char usart_rx[50]; char passwrd[3]={'1','2','3'};
串口接收前面的函数定义
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { char old_pswd[10]; char new_pswd[10]; sscanf (usart_rx,"%3s-%3s",old_pswd ,new_pswd ); if(strcmp (old_pswd ,passwrd )==0) { for(int i=0;i<3;i++)passwrd [i] =new_pswd [i] ; sprintf(text ," new:%s ",passwrd ); LCD_DisplayStringLine(Line1,(uint8_t *) text ); } else { sprintf (text ,"Fail "); LCD_DisplayStringLine(Line1,(uint8_t *) text ); } HAL_UARTEx_ReceiveToIdle_IT(&huart1,(uint8_t *)usart_rx, 50);//重复接收 }
串口接收 最后记得要重复接收
串口和中断有it