成绩已经出来了,很难受没有得奖,本来预计能拿到二等,结果连三等都没混上,思前想后只有两种可能:
①我自己提交的axf文件出了问题 ②题目太简单,这届实力太强
复查结果出来了,确认是自己犯了低级错误,提交的axf文件无效,放在这里,希望自己和后来者引以为戒
虽然没得奖,但这也是一次难忘的经历,15天的强训,中午也在实验室敲代码,还有一个小伙伴和我一起学习,互相讨论,没得奖虽有遗憾,但也不后悔,希望自己总结经验教训,留足时间,细致检查。我的第十一届蓝桥杯正式落幕,明年再战。
记忆版本
研究生组的试题与大学组的区别
主观题(程序设计)部分在大学组的基础上:增加了数据显示界面按下B3交换PA6、PA7输出PWM波形频率
客观题(选择)部分在大学组的基础上:加了5个选择,共15个选择题
【主观题部分-编程】
目的:让PA6、PA7输出固定频率,不同占空比的PWM波形
初始输出状态为:
(1)PA6输出100Hz,占空比10%的PWM波形
(2)PA7输出200Hz,占空比10%的PWM波形
占空比调节方法:根据电压值自动控制占空比,或根据按键手动控制占空比
【LCD模块】
设计界面有数据显示界面、参数显示界面,背景为黑色、字体为白色
数据显示界面显示:电压值、工作模式
参数显示界面显示:PA6占空比、PA7占空比
【LED模块】
使用LED灯作为状态指示
自动模式下,LD2亮;手动模式下,LD2灭
数据显示界面下,LD1亮;参数显示界面下LD1灭
【Timer模块】
扫描按键时间不大于10ms
adc采样间隔不大于0.1s
【KEY模块】
按下B1,切换数据显示界面和参数显示界面
参数显示界面下,按下B2,增加PA6输出PWM波的占空比,步进值10%,调节范围10%~90%,当增加到90%后,下一次按下回到10%
参数显示界面下,按下B3,增加PA7输出PWM波的占空比,步进值10%,调节范围10%~90%,当增加到90%后,下一次按下回到10%
按下B4,切换自动模式和手动模式
数据显示界面下,按下B3,交换PA6和PA7输出PWM波形的频率
【ADC模块】
采集电位器R37(PB0)的电压值,作为自动控制PWM波形的调节参数
【PWM模块】
使用TIM3的通道1(PA6)、通道2(PA7)输出PWM波形,频率固定,占空比可调节
PWM控制策略
自动模式:占空比转换公式,VR37 = 3.3 * D,其中,VR37为电压值,D为占空比
(1)电压值为0V时,PA6、PA7持续输出低电平
(2)电压值为3.3V时,PA6、PA7持续输出高电平
(3)电压值在0~3.3V之间,输出电压值对应的占空比波形
手动模式:通过按键调节PA6、PA7输出波形的占空比
系统上电后默认为数据显示界面,工作模式为自动模式,默认参数为PA6频率100Hz,占空比10%,PA7频率200Hz,占空比10%
系统性能要求:
按键消抖处理,按键响应时间不大于10ms
adc刷新时间不大于0.1s
输出频率精度误差范围±5%
输出占空比精度误差范围±5%
.......
main.c
/*
程序说明: 第十一届蓝桥杯大赛嵌入式-第二场
软件环境: Keil uVision 4.11
硬件环境: CT117E嵌入式竞赛板(代码兼容ILI932X系列、uc8230液晶控制器)
日 期: 2020年10月22日
作 者:乐观的lishan
*/
#include "stm32f10x.h"
#include "lcd.h"
#include "stdio.h"
#include "led.h"
#include "timer.h"
#include "key.h"
#include "adc.h"
#include "pwm.h"
u32 TimingDelay = 0;
u8 data_buf[20];
u8 Mode = 0;
u8 Figure = 0;
u16 adc_value = 0;
float volt_value = 3.02;
u8 flag_manu_pwm = 0;
u8 flag_auto_pwm = 0;
u8 PA6_Duty_Para = 10;
u8 PA7_Duty_Para = 10;
u8 PA6_Freq_Para = 100;
u8 PA7_Freq_Para = 200;
void Delay_Ms(u32 nTime);
void Show_Data(void);
void Show_Para(void);
void LCD_Show(void);
void PWM_Control(void);
//Main Body
int main(void)
{
SysTick_Config(SystemCoreClock/1000);
Delay_Ms(200);
STM3210B_LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
LED_Init();
TIM4_Init();
ADC_Channel_8_Init();
KEY_Init();
LED_Control(LD1,1);
LED_Control(LD2,1);
//测试PWM波输出
// TIM3_PWM_OCToggle();
// TIM3_PWM_CH1(100,0.1);
// TIM3_PWM_CH2(200,0.1);
//测试持续输出高、低电平
// TIM3_Normal();
// GPIO_ResetBits(GPIOA, GPIO_Pin_6);
// GPIO_SetBits(GPIOA, GPIO_Pin_7);
while(1)
{
LCD_Show();
PWM_Control();
if(flag_10ms)
{
flag_10ms = 0;
KEY_Read();
KEY_Process();
}
if(flag_80ms)
{
flag_80ms = 0;
adc_value = ADC_GetConversionValue(ADC1);
volt_value = adc_value * 3.3 / 4095;
}
}
}
//
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void LCD_Show(void)
{
if(Figure) //参数界面
{
Show_Para();
}
else //数据界面
{
Show_Data();
}
}
void Show_Data(void)
{
LCD_DisplayStringLine(Line0, " Data");
sprintf((char*)data_buf, " V:%.2fV", volt_value);
LCD_DisplayStringLine(Line2, data_buf);
if(Mode) //手动模式
{
LCD_DisplayStringLine(Line4, " Mode:MANU");
}
else
{
LCD_DisplayStringLine(Line4, " Mode:AUTO");
}
//验证AD采集数字量
// sprintf((char*)data_buf, " AD:%4d", adc_value);
// LCD_DisplayStringLine(Line6, data_buf);
}
void Show_Para(void)
{
LCD_DisplayStringLine(Line0, " Para");
sprintf((char*)data_buf, " PA6:%2d%%", PA6_Duty_Para);
LCD_DisplayStringLine(Line2, data_buf);
sprintf((char*)data_buf, " PA7:%2d%%", PA7_Duty_Para);
LCD_DisplayStringLine(Line4, data_buf);
//验证频率变化情况
// sprintf((char*)data_buf, " PA6:%3dHz", PA6_Freq_Para);
// LCD_DisplayStringLine(Line6, data_buf);
//
// sprintf((char*)data_buf, " PA7:%3dHz", PA7_Freq_Para);
// LCD_DisplayStringLine(Line7, data_buf);
}
void PWM_Control(void)
{
if(Mode) //手动模式
{
if(flag_manu_pwm == 0)
{
flag_manu_pwm = 1;
flag_auto_pwm = 0;
TIM3_PWM_OCToggle();
}
else
{
TIM3_PWM_CH1(PA6_Freq_Para, PA6_Duty_Para/100.f);
TIM3_PWM_CH2(PA7_Freq_Para, PA7_Duty_Para/100.f);
}
}
else
{
if(adc_value <= 6) //电压0V
{
flag_auto_pwm = 0;
flag_manu_pwm = 0;
TIM3_Normal();
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
GPIO_ResetBits(GPIOA, GPIO_Pin_7);
}
else if(adc_value >= 4095-6 && adc_value <= 4095) //电压3.3V
{
flag_auto_pwm = 0;
flag_manu_pwm = 0;
TIM3_Normal();
GPIO_SetBits(GPIOA, GPIO_Pin_6);
GPIO_SetBits(GPIOA, GPIO_Pin_7);
}
else //电压0~3.3V
{
if(flag_auto_pwm == 0)
{
flag_auto_pwm = 1;
flag_manu_pwm = 0;
TIM3_PWM_OCToggle();
}
else
{
TIM3_PWM_CH1(PA6_Freq_Para, adc_value/4095.f);
TIM3_PWM_CH2(PA7_Freq_Para, adc_value/4095.f);
}
}
}
}
key.c
/*
程序说明: CT117E嵌入式竞赛板KEY驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT117E嵌入式竞赛板(代码兼容ILI932X系列、uc8230液晶控制器)
日 期: 2013-10-9
*/
#include "key.h"
#include "lcd.h"
#include "led.h"
u8 ReadData = 0;
u8 key1_press = 0;
u8 key2_press = 0;
u8 key3_press = 0;
u8 key4_press = 0;
u8 key1_time = 0;
u8 key2_time = 0;
u8 key3_time = 0;
u8 key4_time = 0;
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void KEY_Read(void)
{
ReadData = ~(KEYPORT);
if(ReadData == 0x01){++key1_time;}
else if(ReadData == 0x02){++key2_time;}
else if(ReadData == 0x04){++key3_time;}
else if(ReadData == 0x08){++key4_time;}
if(ReadData == 0)
{
if(key1_time > 0){key1_press = 1;}
else if(key2_time > 0){key2_press = 1;}
else if(key3_time > 0){key3_press = 1;}
else if(key4_time > 0){key4_press = 1;}
}
}
void KEY_Process(void)
{
if(key1_press)
{
if(Figure)
{
Figure = 0; //数据界面
LED_Control(LD2,1);
}
else
{
Figure = 1; //参数界面
LED_Control(LD2,0);
}
LCD_Clear(Black);
}
else if(Figure && key2_press)
{
PA6_Duty_Para += 10;
if(PA6_Duty_Para > 90)
{
PA6_Duty_Para = 10;
}
}
else if(Figure && key3_press)
{
PA7_Duty_Para += 10;
if(PA7_Duty_Para > 90)
{
PA7_Duty_Para = 10;
}
}
else if(Figure == 0 && key3_press)
{
u8 temp;
temp = PA7_Freq_Para;
PA7_Freq_Para = PA6_Freq_Para;
PA6_Freq_Para = temp;
}
else if(key4_press)
{
if(Mode)
{
Mode = 0; //自动
LED_Control(LD1,1);
}
else
{
Mode = 1; //手动
LED_Control(LD1,0);
}
}
if(ReadData == 0)
{
key1_time = 0; key2_time = 0; key3_time = 0; key4_time = 0;
key1_press = 0; key2_press = 0; key3_press = 0; key4_press = 0;
}
}
使用Keil软件的逻辑分析仪
按下Ctrl+F5,进入调试模式
测试输出固定频率、占空比的PWM波形
测试持续输出高低电平
示波器测试
图中测试结果:
频率:200Hz,占空比:40.00%
完整的测试视频: 第十一届蓝桥杯大赛省赛嵌入式第二场试题_哔哩哔哩_bilibili
视频测试
【客观题部分-选择】
客观题部分共15个选择题
(11)一般嵌入式系统设计时不追求的目标是()
A.低功耗 B.低成本 C.实时性 D.高性能
(12)以下可作为高速数据缓存的器件是()
A.Flash B.DRAM C.EEPROM D.SRAM
(13)
(14)
(15)以下是典型的文件格式的有()
A.NTFS B.FAT32 C.DOS D.EXT
仅供参考:
(1)B (2)B (3)A (4)B (5)C
(6)A (7)AB (8)BD (9)B (10)B
(11)D (12)D (13) (14) (13)ABD