第十三届蓝桥杯嵌入式省赛题目相对于第十二届较为简单,没有那么多串口的数据处理以及判断!
第十三届省赛主要是制作一个可由串口设置密码的密码锁。本实验中,我们将用到LED模块、按键模块、串口模块、定时器的PWM模块以及官方会提供源码的LCD模块。
文末有小编写的代码
一、CubeMX配置
1.使能外部高速时钟:
2.配置时钟树:
3.GPIO输出
4.GPIO输入
5. TIM定时器
5.1 TIM2输出PWM脉冲
设置默认Pluse为50,即占空比为50%
5.2 TIM4实现定时5s
5.3 TIM3定时器实现微妙(us)延迟
6.USART(通信)
USART串口接收数据,我使用两种方法实现,大家选取其中一种即可!
1.定长接收数据
2,不定长接收数据+DMA方式
此种方法的核心是空闲中断!
二、代码实现
2.1 main函数实现
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM2_Init();
MX_USART1_UART_Init();
MX_TIM3_Init();
MX_TIM4_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
led(1,0);
led(2,0);
led(3,0);
led(4,0);
led(5,0);
led(6,0);
led(7,0);
led(8,0);
HAL_UART_Receive_IT(&huart1, buff, 7);
HAL_TIM_Base_Start_IT(&htim4);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Key_handle();
lcd();
if(key4_count>=3&&led_flag==0)
{
led(2,1);
delay_us(50000);
delay_us(50000);
led(2,0);
delay_us(50000);
delay_us(50000);
}
}
/* USER CODE END 3 */
}
2.2 lcd函数实现
void lcd()
{
if(pass_flag==1)
{
show_output();
if(systick-PWMTick>5000)
{
led