今天是周末,我们刚刚结束了蓝桥杯的省赛。现在是身心疲惫啊。早上 6点25 闹钟刚响就爬起来了,这是这学期以来第一次这么早起,算上整个寒假还有上个学期,可以说是大半年来起的最早的一次了。加上我昨天晚上没睡好,原因很复杂,中途起来一次换了内衣,很尴尬。多的不说,草草收拾完就出门了,按规定时间刚刚好赶上校车。这是我第一次参加这种比赛吧,省级的,要到别的学校去的。但是说实话一点感觉也没有,在车上就是想再睡一次,没办法旁边的同学都拿出自己的笔记来背,我也最后再看了自己总结的网易云笔记。心想只要不出什么意外不会有问题的。大概是8点刚过我们就到扬州大学了,果然是别人的大学,看起来就是比我们学校好看。老师给我们分了这半天的干粮之后我们就进去了,不过这个分的夹心面包也太难吃了。我们等待了大概十五分钟才进场的。我的乖乖,嵌入式总共十个人,我们学校就占了一大半。就是由于人少,我们被安排到另一个机房了。碰到鼠标想到的第一件事就是翻资料,找 keil。结果出乎意料,委员会并没有像去年那样给例子程序,给的是官方库和一个LCD的参考程序,还有一个去年题目的答案,不过咋一看资料也不缺什么了。当我还在庆幸还好前两天把去年的题模拟做了一遍的时候,出事情了!官方给的keil的版本古远,4.11版!这是什么年代的东西,首先没有自动排版,当你换行它不会给你空两个空格,当你想使用TAB的时候它又是四个空格,当你语句结束敲反括号的时候,它不会自动删除前面的空白,哇,实在令人捉急,我这个强迫症啊,我可以说整个比赛5小时,我至少花了半个小时在排版上。比赛开始,我很熟练的下载题目并且解压缩,很快拿到题目。旁边的人还在纠结理论题在哪做的时候我已经上传完三道题了。这个理论题对我来说还是挺难的,这种东西平时又用不到,谁会去记啊,我写stm32这么久了,就没认真数过ADC有几个外通道有几个内通道,还好可以直接翻看手册。还有就是数电和模电的知识,考前也正好都没看。大概用了 20 分钟才把理论题做完,可能大概也是凉了。进入编程题,我想着进来第一件事新建一个自己的工程,把名字、文件路径都指定成自己想要的,因为我自己模拟的时候也是这样做的。于是问题就来了,4.11的建立工程和4.74,5.24的根本不同,或者说有区别,4.11版的选好 RBT6 之后给的汇编程序和以前的不一样,我也根本没见过,这就尴尬了,很着急,解决不了。结果没办法了,我只好用现有工程来改造了,我首先想到的是用官方给的 Test 工程,这说白了就是去年国赛的题目,在我印象中好像所有模块都用上了吧,除了那个万恶的蜂鸣器。说到蜂鸣器不得不吐槽,他们单片机组的蜂鸣器也太吵了,整个比赛下来就没停过,这边响完那边接着响。用着 Test 写好了 LCD 的主界面,和按键扫描,编译通过,下载也都出来了。挺顺利,然后当我写完 TIM2 的中断程序的时候,问题来了,去年的题,这个 Test 压根没用上中断!本来想着自己加上去吧,才发现这个 Test 用的不知道哪来的 LIB ,原来的固件库 *.c 的文件全打不开,按 F12 也跳不过去程序定义。心想完了,这可怎么办,没办法啊。只能再换工程,自己建是不可能了,建了也编译不通过。当时也没犹豫,直接就复制了给的 LCD 例子工程,经过一番折腾,让它大概变成自己想要的模样,也用上了自己最喜欢的 BSP 来管理模块。时间真的过的很快,我才刚开始写逻辑部分,先说一下我写模块的顺序,LCD, EEPROM, KEY, TIM, RTC, PWM, LED。我刚开始逻辑部分,后面几个老师就开始用午餐了,那香味......没办法,忍了吧。可能因为比较着急,时间过去一半了,加之肚子不舒服,膀胱也难受,我写逻辑部分并不是那么顺畅,写一点忘一点,又回去补。前前后后测试了好多次,主要的还是这次的省赛加入了短按和长按的区别,这个区别的加入,就意味着逻辑部分由原来4个点,变成了现在7个点,其中按键1不需要长按。还有一个问题就是它需要存储时间,印象中时间应该是32位的,比赛的时候不记得了,全弄成16位的了,而且存储的时候,给的例子是一次存储8位数据的,这意味着16位和8位之间又要进行转换了,对于当时的我,无疑是巨大的挑战。就算是平时我也要思路非常清晰才能完全理顺。就这样,这个地方成为了我最大的遗憾,它让我的存储EEPROM这一块没有做好,按键加加满回零这个地方也没有写出来。前面的都大概测试的差不多之后,放弃了一些,决定把最后的 PWM 和 LED 写出来,当时剩下大概1个半5小时。PWM 实在是写了太多次了,要去哪复制都太清楚了,复制粘贴修改运行。很快完成,但是波形没有出来,哇,好难受。由从头检查了一遍,并且又把频率占空比计算了一次,再运行,示波器上还是没出来波形,于是我在想是不是我不会用这个示波器了,我平时做 PWM 都是从这个引脚输出,到另一个引脚测量的啊。弄了半个小时,我决定把该写的程序写上,测试就不测试了。赶紧写 LED 模块,LED 模块这个地方可是我特别注意过的,之前在这里碰过壁。由于 LED 和 LCD 的数据线用了相同的引脚,在 LCD 运行的时候会影响到 LED。这个当然,官方给出了解决办法,就是用了一个锁存器,具体型号可以看原理图。我练习的时候发现,我写的 LED 之所以会被影响,是因为我每次点亮或者熄灭 LED 灯都是一个个来的,比如当我点亮 LED1 的时候,人家 LCD 也在传数据,改变了其他引脚的电平,这就出现了为什么 LED 总不受控制的感觉。我给出的解决方法是,每次控制都控制所有的 LED 亮灭,用 uint8_t 来初始一个数,转换成二进制并通过移位与上1,来判断灯的亮灭。结果符合设想。LED 很听话,这个模块可能是我做的最有信心的一个了。至此蓝桥杯已经结束,自己吐槽了这么多,结果也别太在意了吧。哦对了,我还要吐槽的是 XP 系统,当我把窗口最小化的时候,鼠标是动不了的,这又得浪费多少时间啊,用了 XP 才发现原来win10 是这么好用的系统。自己吐槽了这么多,其实最大的问题还是自身的问题,嵌入式并不是我想的那样只要调用库函数,改改已有的程序。一个合格的嵌入式工程师,我认为是能够熟练的写底层,也能灵活的使用库函数,根据自己的逻辑来编写程序,切勿浅尝辄止。这五个小时做没做出来并不能代表什么,这是比赛又不是实际应用,学习嵌入式就是能够自己设计硬件自己编写软件来实现想要的功能,而不仅仅局限于比赛。对于能够调用官方的程序来实现,我觉得这也是一种技能,也不是这样并不好,别人写好让你用的东西为什么不用呢?刨根问底,未雨绸缪。喜欢和工程师交流,也想要成为合格的工程师。最后给出的比赛建议就是① 自己平时模拟的时候要用 4.11版本的。② 数电模电的知识一定要掌握好。③ 一定要多写些逻辑,意思就是多模拟整套题,能写好一个程序用好一个模块并不代表能写好整个程序。④ 知识掌握不好,比赛将是一种煎熬。⑤ 有机会多用用示波器。