蓝桥杯嵌入式第十二届省赛真题二

题目

CubeMX配置

引脚配置

ADC2(PB15)配置

题目中要求使用R37电位器,将PB15配置为ADC2_IN15

输入捕获(PA1配置)

PA1对应TIM2->CH2,将TIM2->CH2配置为直接输入捕获模式即可

脉冲输出(PA7)

PA7使用TIM17->CH1,打开PWM Generation CH1即可

代码实现

初始化

//led:

void led_disp(uchar dsled)
{
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOC,dsled<<8,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

//key:

struct keys{
    unsigned char judge_sta;//判断进程
    bool key_sta;//按键进程
    bool single_flag; //判断按键是否按下
    unsigned int key_time;//判断按下时间
};

struct keys key[4]={0,0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM4)
    {
        key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
        key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
        key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
        key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
        for(int i=0;i<4;i++)
        {
            switch(key[i].judge_sta)
            {
                case 0:
                {
                    if(key[i].key_sta==0)
                    {
                        key[i].judge_sta=1;
                        key[i].key_time=0;
                    }
                }
                break;
                case 1:
                {
                    if(key[i].key_sta==0)
                    {
                        key[i].judge_sta=2;
                        key[i].single_flag=1;
                    }
                    else
                        key[i].judge_sta=0;
                }
                break;
                case 2:
                {
                    if(key[i].key_sta==1)
                        key[i].judge_sta=0;
                }
                break;
                }
            }
    }
}

//adc:

double getADC(ADC_HandleTypeDef *pin)
{
    uint adc;
    HAL_ADC_Start(pin);
    adc=HAL_ADC_GetValue(pin);
    return adc*3.3/4096;
}

//输入捕获(PA1)
double ccr1_vala=0,ccr1_valb=0;
uint frq1=0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
        if(htim->Instance==TIM2)
	{
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)//中断源选择直接输入的通道
		{
		ccr1_vala=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2)+1;
		__HAL_TIM_SetCounter(htim,0);//计时值清零
		frq1=(80000000/80)/ccr1_vala;
		HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);
		}
	}
}

按键功能

//key按键函数key_pro

void key_pro(){
    //B1标志位为1切换界面并重置标志位
    if(key[0].single_flag==1){
        view=!view;
        LCD_Clear(Black);
        key[0].single_flag=0; 
    }
    //初始界面为数据界面(view=1),数据界面时B2,B3失效
    if(view==1){    
        key[1].single_flag=0;
        key[2].single_flag=0;
    }
    //在参数界面(view=0)时按下B2,R增加2 
    if(view==0&&key[1].single_flag==1&&R<=8){  
        R+=2;
        LCD_Clear(Black);
        key[1].single_flag=0; 
    }
    if(R>=10) key[1].single_flag=0;
    if(R<=2) key[2].single_flag=0;
    //在参数界面(view=0)时按下B3,R减少2 
    if(view==0&&key[2].single_flag==1&&R>=4){
        R-=2;
        LCD_Clear(Black);
        key[2].single_flag=0; 
    }
}

LCD显示

//lcd显示函数disp_pro

void disp_pro(){
    //数据界面(view=1)
    if(view==1){
    LCD_DisplayStringLine(Line1, (uchar *)"       Data");
        
    sprintf(text,"   FRQ:%dHz",frq1);
    LCD_DisplayStringLine(Line3, (uint8_t *)text);
        
    sprintf(text,"   R37:%.2fV",getADC(&hadc2));
    LCD_DisplayStringLine(Line5, (uint8_t *)text);
    }
    //参数界面(view=0)
    if(view==0){
    LCD_DisplayStringLine(Line1, (uchar *)"       Para:");
        
    sprintf(text,"      R:%d",R);
    LCD_DisplayStringLine(Line3, (uint8_t *)text);
    }
}

LED显示

//led显示函数led_proc

void led_pro()
{
    double VR37=getADC(&hadc2);
    //led_times用于B4按键的开关灯,初始led_times=1
    if(led_times==1)
    { 
        //数据界面
        if(view==1)
        {
            if(VR37<1|VR37>=3)
            {
                if(frq1<1000|frq1>=5000)
                    led_disp(0x01);
                if(frq1>=1000&&frq1<5000)
                    led_disp(0x09);
            }
            if(VR37>=1&&VR37<3)
            {
                if(frq1<1000|frq1>=5000)
                    led_disp(0x05);
                if(frq1>=1000&&frq1<5000)
                    led_disp(0x0d);
            }
        }
        //参数界面
        if(view==0)
        {
            if(VR37<1|VR37>=3)
            {
                if(frq1<1000|frq1>=5000)
                    led_disp(0x02);
                if(frq1>=1000&&frq1<5000)
                    led_disp(0x0a);
            }
            if(VR37>=1&&VR37<3)
            {
                if(frq1<1000|frq1>=5000)
                    led_disp(0x06);
                if(frq1>=1000&&frq1<5000)
                    led_disp(0x0e);
            }
        }
        //在led_times=1时按下B4按键,led_times变为2且重置标志位
        if(key[3].single_flag==1)
        {
            led_times=2;
            key[3].single_flag=0;
        }
    }
    //led_times=2时关闭所有led
    if(led_times==2)
    {
        led_disp(0x00);
        //再次按下B4按键回到led_times=1并重置标志位
        if(key[3].single_flag==1)
        {
            led_times=1;
            key[3].single_flag=0;
        }
    }
}

脉冲输出

//脉冲输出函数pa7_Control

void pa7_Control(void){
    pa7_frq = ccr1_vala * R;
    htim17.Init.Period = pa7_frq;
    HAL_TIM_Base_Init(&htim17);
    pa7_duty = pa7_frq *getADC(&hadc2)/3.30;
    __HAL_TIM_SET_COMPARE(&htim17,TIM_CHANNEL_1,pa7_duty);
}

注意事项

    HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);
    HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);//直接测量捕获

    HAL_TIM_Base_Start_IT(&htim2);
    HAL_TIM_Base_Start_IT(&htim4);
    
    __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);//设置初始pwm频率

主函数

    while (1)
    {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
       
        led_pro();//led显示函数
        key_pro();//key按键功能
        disp_pro();//lcd显示函数
        pa7_Control();//pa7脉冲输出
    }
  /* USER CODE END 3 */

 

 

<think>嗯,用户想了解第十二届蓝桥杯嵌入式组的相关内容,包括比要求、试题情况以及备考资料。首先,我需要回忆一下用户提供的四个引用内容,看看有没有相关信息。引用[3]和[4]提到了第十二届蓝桥杯嵌入式组的题目和备考资料,引用[2]是第十三的经验,但可能部分备考方法通用。用户可能正在准备参加蓝桥杯嵌入式组的比,需要知道比的具体要求,比如使用的开发板、外设模块、编程环境等。试题方面,用户可能想知道题型、考点,比如串口通信、定时器、传感器应用等。备考资料方面,用户可能需要推荐学习资源、历年真题、代码库等。 接下来,我需要从引用中提取相关信息。引用[3]提到第十二届题目主要考察串口实现和工程思维,引用[4]详细介绍了LED、按键、串口等模块的配置步骤,还有GitHub的代码库。引用[2]虽然是大学生参加第十三的经验,但提到备考三个月,练习历年真题,这可能对第十二届也有参考价值。此外,用户提供的引用中没有直接的第十二届通知,但引用[1]是关于第十三的,可能结构类似,比如由哪个部门承办,需要校内选拔等,但用户明确问的是第十二届,所以可能需要避免混淆,但可以提及一般流程。 在回答结构上,应该分比要求、试题解析、备考资料三个部分。每个部分下再细分,比如比要求包括硬件平台、编程环境、评分标准等。试题解析可以举例子,比如第十二届的串口通信题目。备考资料可以推荐官方资料、GitHub代码库、练习方法等。同时,需要确保所有数学公式和代码块符合格式要求,比如行内公式用$...$,代码用```包裹。 需要检查是否有遗漏的信息,比如是否有关于比时间、报名方式的信息,但根据引用内容,可能没有第十二届的具体通知,所以可能需要用通用信息替代,或者建议参考最近的通知。另外,用户可能关心如何高效备考,所以需要强调练习历年真题和模块化训练的重要性。 最后,生成相关问题,确保问题与用户查询相关,比如往试题解析、模块学习顺序、常见错误等。同时,引用标识要正确对应,比如引用[3]和[4]用于试题和备考部分。</think>### 第十二届蓝桥杯嵌入式组相关内容解析 #### 一、比要求 1. **硬件平台** 蓝桥杯嵌入式组比通常基于指定开发板(如STM32F103系列),需掌握外设模块(LED、按键、LCD、定时器、ADC、串口等)的配置与应用[^4][^3]。 2. **编程环境** 要求使用Keil uVision5(C语言开发),需熟悉STM32标准库或HAL库,并掌握CubeMX工具快速生成初始化代码[^2]。 3. **评分标准** 功能实现完整度、代码规范性和工程结构是评分重点,部分题目需通过串口输出数据或与上位机交互[^3]。 #### 、试题特点 1. **典型题型** - **串口通信**:如第十二届需实现串口收发解析数据,结合逻辑控制外设(如LED、LCD显示)。 - **传感器应用**:可能涉及温度传感器、光敏电阻等模拟信号采集与处理。 - **定时器中断**:需配置PWM输出或输入捕获功能。 2. **工程思维考察** 题目通常要求模块化设计,例如: ```c // 示例:LED初始化代码(引用自备考资料) void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); } ``` #### 三、备考资料推荐 1. **官方资源** - 蓝桥杯官网提供往题和评分标准(需校内指导教师获取)[^1]。 2. **开源资料** - GitHub代码库(如引用[4]提到的仓库)包含模块配置模板和真题实现。 - 参考往选手经验:如第十二届强调“工程思维”,需注重代码结构清晰和功能模块解耦。 3. **学习路径建议** - **基础阶段**:掌握GPIO、定时器、中断、串口等模块配置。 - **进阶阶段**:完成近5年真题,重点练习串口协议解析和外设协同控制。 - **模拟训练**:使用开发板全功能实现,限制时间(建议3小时内完成)[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值