ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

十二届蓝桥杯 嵌入式 备考总结

2021-05-01 11:58:17  阅读:274  来源: 互联网

标签:HAL 嵌入式 蓝桥 TIM LCD 备考 key return now


前些天参加了蓝桥杯嵌入式比赛省赛,没太在意这个竞赛,备考三天,遗憾省二,有点心疼自己的报名费。谨作记录,方便明年去刷分。

今年嵌入式可以使用新版开发板,但据我观察考点里大家都用的是旧版的板子(我去的比较晚,快九点才到考场)。考试时考点提供了CubeMx,我也就使用Cube配置Hal库完成了比赛。

事实上由于我已经很长时间没怎么使用过Stm32,标准库已经忘得差不多了,是考前三天看了看Hal库相关知识,就直接莽了,至于客观题,我并没有花什么时间去准备,因为感觉这个东西考的知识面还是比较广,认真准备的话还是得花个好几天,但我那些天实在是太忙啦,加上不想多为这个比赛费神,就没去准备客观题,最后也没去对答案,但有时间的话去准备准备客观题的话,后面还是很有希望拿省一的,毕竟排在我前面的那个人刚好就是省一,,鬼鬼,这么一说我运气好差哦。

比较难受的是,考点没有提供旧版F1平台的HAL库例程,只提供了标准库例程,然后就只能我自己建立工程,过程中由于没有LCD的HAL库例程,浪费了二三十分钟时间(考试中我尝试将新版平台的LCD例程移植到旧版,未能成功,后发现是两块板子连接LCD的引脚不同,遂放弃,改为将F1的LCD标准库代码修改成HAL库代码,过程中花费了许多时间,导致后面写逻辑代码的时间不够了)。

五个小时的考试时间说短不短,但我在开考的时候浪费了许多时间在硬件配置调试上面,后面中午又饿了在吃自己带的午餐,导致最后在进行串口数据调试之后,就没有时间再去完成车辆数目的统计与调试了。下次,emmm,下次未必会再报这个比赛,报名费也太贵了,学校又不报销!!!!!

/************************************************************************************************************************/

hal库工程建立:
1:SYS里面配置DEBUG JTAG(4 wire)
2: RCC HSE配为Crystal, 系统时钟记住配置成72M
3: LCD所有的Pin都是GPIO OutPut
4: PB4 配为 OutPut HIGH,关闭蜂鸣器
5:error: L6236E: No section matches selector - no section to be FIRST/LAST. 往工程里添加启动文件
6:#define COL(X) (319-(X)*16+16)  //用于LCD列显示,LCD_DisplayChar(Line9,COL(19),'0');
7: 24C02使用应当调用 I2CInit();
8: 手撸驱动代码
    
// 24C02读取一字节
unsigned char x24c02_read(unsigned char address)
{
   unsigned char i;
   I2CStart(); 
   I2CSendByte(0xa0);I2CWaitAck(); 
   I2CSendByte(address);I2CWaitAck(); 
   I2CStart();
   I2CSendByte(0xa1); I2CWaitAck();
   i=I2CReceiveByte(); I2CWaitAck();
   I2CStop();
   delay1(500);
   return(i);
}
//  24C02写入一字节
void x24c02_write(unsigned char address,unsigned char info)
{
   I2CStart(); 
   I2CSendByte(0xa0); I2CWaitAck(); 
   I2CSendByte(address);    I2CWaitAck(); 
   I2CSendByte(info); I2CWaitAck(); 
   I2CStop();
   delay1(65000);
}

9:ADC DMA转换   Continuous Conversion Mode: Enable  DMA Request Settings: Circular  Sampling time: 41.5 Cycles
   转换数据一定要用数组存储
   HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc_data,1);//开启ADC DMA转换
   
10:  消抖程序
//思路参考自正点原子的例程
void key_sacn(unsigned char mode)
{
    static unsigned char key_up=1;//按键松开标志位,默认松开
    if(mode) key_up=1;//连按功能
    if((KEY1==0||KEY2==0||KEY3==0||KEY4==0)&&key_up==1) //按下按键且之前是松开的进入逻辑
    {
    
         HAL_Delay(10);
            key_up=0;    //按键已经按下,标志位复位,这一步很重要
        if(KEY1==0)
            {
            key_now++; 
                return; //return is perfect!
            }
        else if(KEY2==0)
            {
            key_now++; 
                return;
            }
        else if(KEY3==0) 
            {
            key_now++; 
                return;
            }
        else if(KEY4==0) 
            {
            key_now++; 
                return;
            }
    }
    else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1&&key_up==0)
    {
        key_up=1;   // 判断松开和按下需要平级
      //  key_now = 0;
        return;
    }
}

11: 定时器中断:
 TIM2-5为通用定时器
 Clock Source: Internal, Clock Prtscaler: 7199   72M/(7199+1)=10000HZ
Counter Mode: Up                   
Counter Period:  4999           (4199+1)/10000 = 0.5S = 500MS
CKD : No Division 
auto-reload-preload : Enable
在Cube中使能定时器全局中断
HAL_TIM_PeriodElapsedCallback() //中断回调函数
HAL_TIM_Base_Start_IT(&htim2);  //开启定时器中断

12:串口中断接收和发送
 HAL_UART_RxCpltCallback() //接收中断回调,在接收完设定数目数据后回调,在里面设一个接收完成标志位
 HAL_UART_Receive_IT(&huart2,rx_husart2.data, 10); //设置接收中断,每接收完设定数目后,需重新执行该函数,在主循环中据接收完成标志位重设该函数
 HAL_UART_Transmit_IT(&huart2,rx_husart2.data, 10); //串口中断发送函数
 
13:PWM Generate:  Internal Clock ,71(主频-1),499   72M/72/500=2KHZ,频率2KHZ,可设占空比0-499
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
  __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_3,200);
  
  
14:输入捕获  Input Capture direct mode  ,  Clock Prtscaler: 71   Counter Period:  0xffff    auto-reload-preload : Enable
 
    HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_2);      //IC; InputCapture

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if(htim==&htim4)
    {
        time_pre=time_now;
        time_now=HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_2);
        
          time_us+=(time_now-time_pre);
        count++;
        if(count%2)
         __HAL_TIM_SET_CAPTUREPOLARITY(&htim4, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);
        else
         __HAL_TIM_SET_CAPTUREPOLARITY(&htim4, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING);

    }
    
}

15:

 
 
 
 
 

 

/************************************************************************************************************************/

 

标签:HAL,嵌入式,蓝桥,TIM,LCD,备考,key,return,now
来源: https://blog.csdn.net/qq_39979120/article/details/116328047

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有