原文地址:http://www.cnblogs.com/NickQ/p/8721317.html
说起蓝桥杯,相信很多电子类的学生,应该很熟悉了吧。。。上周日,我也去湖北工业大学参与了一下。说起这次经历,我还是觉得有点惋惜,但还是觉得应该写出来。
先说比赛体会吧。。
关于考点(湖北工业大学考点), 个人觉得,湖工承办的这次比赛还是比较出色的,但也有以下几点瑕疵。
1、未设带队老师休息点。赛前,我们在赛场外候场时,偶然碰到某个学校的两个带队老师与工作老师询问休息点,才得之此事。
2、比赛环境未准备充分。以嵌入式比赛为例,比赛计算机未为考生准备PDF阅读器,导致部分考生浪费很长时间寻找安装包,安装阅读器环境。而且安装阅读器环境版本较低。其次,部分考生计算机嵌入式开发板的驱动未安装或未安装成功(包括我在内),赛前工作人员未尽到安装和调试的义务。这导致比赛开始后,寻找老师解决问题时,耗费了大量时间。--- 以我为例,我尝试过自己安装驱动,失败后,共计来了3名老师尝试安装驱动,都只是在重复简单的安装步骤,未果后。老师建议换机,但苦于没有空闲机器了。老师尝试重启后,问题才得以解决(注意:比赛过程,考生不允许重启计算机,重启可能会丢失之前数据)。这个过程花费了我将近四十分钟比赛时长(共5小时)。
3、比赛监考设置存在问题。以本赛场为例,有两名学生做监考,且比赛注意事项都由学生朗读,声音小且模糊,导致我们后排附近的考生听不清,带来很多不必要的麻烦,比如提交答案的网址,解压密码等听不清,需要再次单独询问。
以上三点,就是我发现的一些问题,个人认为这是考点未尽到义务的地方。真诚希望湖工以后可以注意下这几点,同时也希望湖工越来越好。。
关于比赛过程
1、 一般是提前20分钟进场,考生检查开发板,示波器是否有明显损坏,检查电脑环境,如解压软件,PDF阅读器,串口驱动和下载器驱动,keil等。 检查提供的资料,是否可用。(快速检查,不然20分钟一般检查不完,当然一般没问题,但有问题的话要及时反映,这一般需要很长时间才能解决。如上所诉)。
2、考场监考员宣读比赛细则,注意事项。考生按考点给的网址,登录考试系统。(如果听不清,一定要要求其讲清楚,不然之后没听清会很麻烦。)
3、阅读考试系统说明,如提交方式等,下载试题。(试题是加密的压缩包)
4、考试开始后,考点给出试题解压密码。(试题是PDF版本的,分客观题和程序题两个文件分开的)
5、作答,并提交答案。(建议先做简答,做完后在考试系统上提交答案,然后在做程序题。答案可提交多次,以最后一次为准。)
6、程序题需要在开发板上有程序,还要按考试系统要求提交源码到考试系统。
注:考试时间以考试系统倒计时为准。。
关于自己
我得承认,我的能力及心态是有问题的。以上指出考点存在的问题并不是掩盖自己的不足。我确实存在很多问题,比如我竟然忘了初始化NVIC优先级,分配TIM优先级等等。所以考完回来,我就一直在检讨,但详细的就不说了。
言归正传,重点说我的心态吧。起初,因为考试系统网址和解压密码听不清,看不清,有点心烦。等平静下来却发现提供的LCD例程无法下载,驱动显示黄色感叹号。多次尝试无果,寻找老师,老师当时不在现场,只能找当时的学生监考,他们表示这需要去找老师,这时心情已经低入谷底。当然期间老师也是换了又换,无法解决,等问题真正解决了,看了时间又觉得时间又不够了。后来也仅实现了部分功能。
当然,解决最后问题的那个老师,也提过要给我补部分比赛时长。被我自己拒绝了,可能是当时心态已蹦,已经想要放弃了吧。事后想想,还确实挺后悔的。
总之,放弃的是自己,后悔的也是自己。心态调整的不好,且不能怨天尤人,只能慢慢从经历中反思,提高自己的能力。。
不管怎么说,我还是参与了,我也和其他同学努力了那么久。关于备赛经验,我想我还是可以提供点参考的。
对于嵌入式的开发板CT117E,还是值得仔细对待的。
关于LED驱动
我想,可能大家都会觉得LED没什么可说的了,只是简单地IO操作。但是我想说,No,这里有个陷阱。而且我觉得如果想参加蓝桥杯嵌入式并用过这个开发板的人,应该都会碰到。
这个问题就是,LED与LCD,PC8-15端口公用的问题。不考虑这个问题的后果就是,LCD和LED同时使用时,如果操作了LCD后,再去控制一个LED,可能会出现没被控制的LED,被莫名其妙的点亮或熄灭。
原因为何?能解决么?怎么解决?
原因:LCD和LED同时使用时,如果操作了LCD后,会导致pc8-15上的电平改变,如果此时控制某个LED灯,更新锁存器,会造成被LCD改变的电平也同步到LED灯造成误触发。
可以解决,解决的原理是,每次更新LED时,将PC8-PC15的引脚状态都更新到合适电平后,再更新锁存器。
提供我自己的代码,方法不止这一种,仅供参考。
1 //LED灯控制函数 2 //注意:第一次调用此函数时,务必需要控制所有灯,即LED_Control(GPIO_Pin_All,0);或 LED_Control(GPIO_Pin_All,1); 3 //原因是:保证LED状态标记变量和当前LED状态同步 4 //LED:被控制LED所连接的STM32引脚,如GPIO_Pin_8,GPIO_Pin_All 5 //LED_Status:新的状态,0:灭 1:亮 6 void LED_Control(uint16_t LED, uint8_t LED_Status) 7 { 8 static u16 temp = 0; //16bit,静态的LED状态标记变量,保存LED的状态 9 10 if(LED_Status == 0) 11 { 12 temp = temp | LED; //更新LED状态标记变量,将某一位值(受控LED对应的)置高电平 13 } 14 else 15 { 16 temp = temp & (~LED); //更新LED状态标记变量,将某一位值(受控LED对应的)置低电平 17 } 18 19 GPIO_Write(GPIOC, temp); //将LED状态标记变量写出,改变LED状态 20 21 GPIO_SetBits(GPIOD, GPIO_Pin_2); 22 GPIO_ResetBits(GPIOD, GPIO_Pin_2); //状态锁存 23 }
关于蜂鸣器
为保证考试环境安静,感觉蜂鸣器一般考试时不会涉及,。但作为一个考点--引脚重映射,也可能会考。
以下三句话就是引脚重映射(注意AFIO时钟使能)
1 GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE); //PB4 重映射 2 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); 3 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
PB4与PA13,PA14,PA15,PB3一样属于SWJ接口IO,有多种分配方式
如下图,任意一种可用的重映射方式都可以。即上述三句,任用其中一句。(注意:SWJ重映射,可能导致下载时需要按一次复位键,才可以)
关于按键
按键例程,写的较为简单,未消都,也不能保证按键次数。
因此,按键例程不具有参考意义。建议理解使用正点原子提供的按键例程方案(只讨论方案,这绝不是广告,资料可免费,免注册在开源电子网下载,http://www.openedv.com/thread-12895-1-1.html)。
原理是:检测到按键按下时,返回一次键值,并置位标志,不在返回有效键值。直到检测到按键被释放后,才会复位标志位,继续下一次按键扫描并返回键值。这样就保证了一次按键按下,只有一次有效键值被返回。
关于uart
串口就是一个简单地外设,配置较为简单。再此只强调已回车结束的接受中断。
1 #define RX_MAX 20 2 extern uint8_t USART_RXBUF[RX_MAX + 1]; //接受数组 3 uint8_t RXOVER = 0; //接受完成标志 4 5 void USART2_IRQHandler(void) 6 { 7 u8 Rx_temp = 0;//临时接受 8 static u8 Rx_ipos = 0; //数组数据位置标志 9 static u8 Rx_flag = 0; //接收到回车(0x0d)等待换行符(0x0a)的标志 10 11 if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //判断中断线 12 { 13 Rx_temp = USART_ReceiveData(USART2); //接受数据 14 USART_ClearITPendingBit(USART2, USART_IT_RXNE); //清中断标志 15 16 if(!Rx_flag) //未接收到回车符 17 { 18 //判断接受的数据是什么 19 if(Rx_temp != 0x0d && Rx_temp != 0x0a) 20 { 21 //普通数据,接受 22 USART_RXBUF[Rx_ipos++] = Rx_temp; 23 } 24 else if(Rx_temp == 0x0d) 25 { 26 //回车符,开始等待换行符以确认结束信号的到来 27 Rx_flag = 1; 28 } 29 else 30 { 31 //换行符,此情况下无回车符,数据不合法,丢弃该帧 32 Rx_ipos = 0; //将位置复位,即丢弃该帧数据 33 } 34 } 35 else if(Rx_temp == 0x0a) 36 { 37 //接收到0x0d的情况下,接受到0x0a,数据正确合法,接受完成 38 USART_RXBUF[Rx_ipos] = '