蓝桥杯嵌入式比赛经验分享
比了两届蓝桥杯,最后以国二收场,也算心满意足!
一.我的蓝桥杯
我复习蓝桥杯,是1月份开始的,由于中间还要搞"毕业设计" "大学生创新创业作品展示""互联网+创新创业大赛""帮朋友做毕业设计 ""搞一些小项目赚钱""考掉计算机四级"……初赛复习时间40天左右,国赛复习时间7天(主要原因感觉国一没戏)。没时间复习的同学,不要太紧张!
二.教程
一家叫做"大科工作室"的淘宝店的资料不错,为了获奖钱还是要花的!
一般网上的蓝桥杯的教程,都带有防录屏的能力,在使用的时候会有很多不便。比如复制代码
三.我的程序
我写的第7届决赛的程序:链接:https://pan.baidu.com/s/1WU3doeiucjEMnyLQ5wH2lw 提取码:cm4f
在初赛前一个星期写的,为了满足5小时完成程序的要求,程序写的不怎么样!还望见谅。
四.比赛的时候,你有可能会遇到几个问题:
1.是边写程序边测试,还是写完程序再测试(我选择后者)
2.是自己建立工程,还是使用官方提供的例程工程(我选择后者)
3.比赛开始才写代码,还是先偷偷的写(我选择后者)
4.遇到解决不了的问题怎么办(千差万别)
(一)iic出错(单片机赛项)
(二)开发板损坏(有的时候损坏的很诡异,你是相信自己,还是相信开发板。一次机会哦!)
(三)电脑电源出问题,没有保存文件(在我同一考场有人有过)
(四)遇到自己没有预案的题型(比如第九届考的长按与短按)
(五)选择题太多不会的
(六)外设改变(如第九届AD按键,资料与实际上使用的电阻不同)
……解决好了省一等奖,解决不好省三等奖
五:经验
蓝桥杯嵌入式比赛提供STM32固件库3.5,如果玩STM32使用比如STM32CUBEMX需要一段时间适应,毕竟STM32固件库3.5已经是7,8年前的东西了!
在…/project/STM32F10X_StdPeriph_Examples下是ST官方提供的例程库,比赛时可直接复制里面的程序。
ctrl + c & ctrl + v在比赛的程序量里占70%左右吧!
六.学习"大科"写下的学习笔记
PWM大项
两路PWM |
||||
样式 |
输出 |
检测 |
||
不同频率/占空比 |
不同占空比 |
不同频率/占空比 |
不同频率 |
|
使用文件 |
OCInactive |
PWM_Output |
InputCapture |
InputCapture |
修改 |
|
|
||
不足 |
|
|
|
管脚 |
定时器 |
通道 |
PA1 |
TIM2 |
CH2 |
PA2 |
TIM2 |
CH3 |
PA3 |
TIM2 |
CH4 |
PA4 |
ADC |
IN4 |
PA5 |
ADC |
IN5 |
PA6 |
TIM3 |
CH1 |
PA7 |
TIM3 |
CH2 |
AD大项 |
||||
AD按键 |
AD变位器 |
两路AD |
光敏电阻 |
|
使用文件 |
AnalogWatchdog |
AnalogWatchdog |
RegSimul_DualMode |
AnalogWatchdog |
修改 |
||||
通道 |
5 |
8 |
4/5 |
4 |
通道数 |
1 |
1 |
2 |
4? |
不足之处 |
||||
注意点 |
--0 100--1 400--2 800--3 1200--4 1600--5 2000--6 2400--7 3000--?
接PA5 第9届的比例不是这个了 |
接PA4/PA5 |
接PA4 |
|
读取格式 |
u16 Get_ADCs(u8 channel) { u16 ADC_Val = 0; ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_239Cycles5); ADC_SoftwareStartConvCmd(ADC1,ENABLE); while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); ADC_Val = ADC_GetConversionValue(ADC1); ADC_ClearFlag(ADC1, ADC_FLAG_EOC); ADC_SoftwareStartConvCmd(ADC1, DISABLE); return ADC_Val; } |
IIC大项 |
||
样式 |
AT24C02 |
三轴传感器 |
位置 |
0xA0/0xA1 |
0x38/0x39 |
不足 |
在于初始化写数据 LIS302DL_Write(CTRL_REG1,0x47); //DR=0,加速度的采集频率为 200Hz; //PD=1,LIS302DL工作在普通功耗模式; //FS=0,最大测量范围为 2g(2.3g),灵敏度为 18mg/LSB(16.2),受温度影响为 0.01%, 在0加速度时.飘移为 40mg; //STP=0,STM=0,表示 LIS302DL 工作在普通模式,即非自检模式; //Zen=1,表示使能 Z 轴方向加速度采集; //Yen=1,表示使能 Y 轴方向加速度采集; //Xen=1,表示使能 X 轴方向加速度采集; LIS302DL_Write(CTRL_REG2,0x00); //SIM=0,表示 SPI 口为 4 总线;(这个要先看cs决定) //BOOT=0,表示不要刷新存储器的内容,为普通模式; //FDS=0,表示禁用高通滤器; //HP_FF_W_U2=0, 禁用自由落体/唤醒高通滤波器 2; //HP_FF_W_U1=0, 禁用自由落体/唤醒高通滤波器 1; //HP_coeff2=0,HP_coeff1=0,DR=0, 表示自由落体/唤醒高通滤波器的输出截止频率为 2Hz; LIS302DL_Write(CTRL_REG3,0xC1); //IHL=1,表示在中断发生时,中断脚(INT1 和 INT2)输出低电平; //PP_OD=1,表示中断脚开漏输出; //I2CFG2=0,I2CFG1=0,I2CFG0=0,表示 INT2 脚输出低电平; //I1CFG2=0,I1CFG1=0,I1CFG0=1,表示 INT1 脚是根据自由落体/唤醒 1 寄存器的输出而发生变化; LIS302DL_Write(FF_WU_THS_1,0x28); //DCRM=0,表示在不再有中断发生时,持续时间计数器会被复位到初值; //THS0~THS6,用来设置自由落体/唤醒的下限值--720mg; LIS302DL_Write(FF_WU_DURATION_1,40); //当 DR=1 时,加速度的采集频率为 ; LIS302DL_Write(FF_WU_CFG_1,0x10); //AOI=1,表示所有中断事件相或后输出; //LIR=0,表示将中断请求不锁存; //ZHIE=0,表示在 Z 输出寄存器的值大于 Z 轴的设置值时,将不会使能 Z 轴中断; //ZLIE=1,表示在 Z 输出寄存器的值小于 Z 轴的设置值时,将不使能中断请求; //YHIE=0,表示在 Y 输出寄存器的值大于 Y 轴的设置值时,将不会使能 Y 轴中断; //YLIE=1,表示在 Y 输出寄存器的值小于 Y 轴的设置值时,将不会使能 Y 轴中断; //XHIE=1,表示在 X 输出寄存器的值大于 X 轴的设置值时,将不会使能 X 轴中断; //XLIE=0,表示在 X 输出寄存器的值小于 X 轴的设置值时,将不会使能 X 轴中断;
|
其他
温度传感器 |
|
调用文件 |
官方文件ds18b20 |
注意点 |
ds18b20_read()后8位小数只要前3位 z = (ds18b20_read()& 0x07FF); x = z/16.; |
数码管 |
|
调用文件 |
|
注意点 |
|
温湿度传感器 |
|
调用文件 |
官方文件dht11 |
注意点 |
dht11_read();32位数据只要每个16位前8位 前8位湿度, 后8位温度 |
LED |
|
调用文件 |
IOToggle |
注意点 |
|
串口 |
|
调用文件 |
Interrupt/IrDA |
注意点 |
|
按键 |
|
调用文件 |
|
注意点 |
|
RTC |
|
调用文件 |
初始化:LSI_Calib 其他: Calendar |
注意点 |
|
蜂鸣器 |
|
调用文件 |
JTAG_Remap |
注意点 |
|
滤波算法 |
u16 Get_Filter(u8 channel) { u16 tmp; u8 i = 0,j = 0; for(i=0; i<ADC_BUFF_LEN; i++){ adc_buff[i] = Get_ADCs(channel); } for(i=0; i<=ADC_BUFF_LEN/2; i++){ for(j=0; j< ADC_BUFF_LEN-i-1; j++){ if(adc_buff[j+1] < adc_buff[j]){ tmp = adc_buff[j+1]; adc_buff[j+1] = adc_buff[j]; adc_buff[j] = tmp; } } } if(ADC_BUFF_LEN % 2 == 0){ return(adc_buff[ADC_BUFF_LEN/2-1] + adc_buff[ADC_BUFF_LEN/2])/2; }else{ return(adc_buff[ADC_BUFF_LEN/2]); } } |
希望诸位在蓝桥杯比赛中取得好成绩!