zoukankan      html  css  js  c++  java
  • 第九届蓝桥杯-嵌入式比赛体会与备赛经验

    原文地址: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] = ''; //加入数组结束符
    39             RXOVER  = 1;//置位接受完成标志位
    40             //等待下一帧数据来临
    41             Rx_flag = 0;//恢复等待回车符
    42             Rx_ipos = 0;//存储位置复位
    43         }
    44         else
    45         {
    46             //接收到0x0d的情况下,却没有接收到0x0a,数据帧不完整,丢弃该帧
    47             Rx_flag = 0;//恢复等待回车符
    48             Rx_ipos = 0;//存储位置复位
    49         }
    50     }
    51 }

    关于x24c02,timer(PWM,捕获),RTC,ADC,DAC,EXIT等考到的知识点,都较为常用,且这部分例程还可以。再次不在展开了。

    有不理解或想了解其他的,请留言。。。此贴完

  • 相关阅读:
    跟踪内核启动过程CONFIG_DEBUG_LL【转自】
    为什么可能导致睡眠的函数都不能在中断上下文中使用呢?【转】
    可重入和不可重入【转】
    中断中处理延时及一些函数的调用规则(中断调i2c驱动有感)--中断中的延迟delay与printk函数的冲突【转】
    Linux时间子系统之八:动态时钟框架(CONFIG_NO_HZ、tickless)【转】
    仿照linux dpm机制,实现自己的dpm【转】
    (二)内核锁的使用之信号量【转】
    linux dpm机制分析(下)【转】
    linux dpm机制分析(上)【转】
    python写一段脚本代码自动完成输入(目录下的所有)文件的数据替换(修改数据和替换数据都是输入的)【转】
  • 原文地址:https://www.cnblogs.com/NickQ/p/8721317.html
Copyright © 2011-2022 走看看