蓝桥杯嵌入式抱佛脚速成

从搞不懂蓝桥杯干嘛的到能完成几乎所有任务的2天速成(我自己)

适合和我一样平时还是会用STM32的水一下蓝桥杯省二省三(大概率省三,就抱两天佛脚咋和人家练习过的大佬比)

后天就比赛了,分享一下自己整理的配置给同样抱佛脚的同学,来不及写具体一点了

总之就是,学会我接下来发的基础配置,拿到题把它们配置好,然后写个逻辑完成这些功能就完事了(逻辑一般就是按键有什么功能显示什么就完事了)

注意配置一个,测试一个

基础配置可以从CubeMX里从0配,也可以直接打开比赛的时候给的资源包的液晶屏的CubeMX文件,直接配置其他文件

这里我用的LL库,部分代码会方便一点,和HAL库区别不大(抱佛脚背就完事了)

1.CUBEMX里配置引脚:

  1. 按键:PA0 PB0-2 input

  2. 灯:PC8-15 PD2 output

  3. 屏幕:用屏幕LCD自带

  4. ADC:PB15 12 ADC_IN,左边Analog勾选对应通道(single)

实际直接用LCD自带只需要:

PA0 PB0-2 input PD2output

2.配置时钟

实际直接用LCD自带不用改

最后都是80MHZ就行

 

3.project

记得选择Code-gennerated .c.h

4.生成项目

5.按键扫描

背下这个代码(注意防连按

if(LL_GPIO_IsInputPinSet(GPIOB,GPIO_PIN_0)==0)
    {
        LL_mDelay(20);
        if(LL_GPIO_IsInputPinSet(GPIOB,GPIO_PIN_0)==0)
        {
            while(LL_GPIO_IsInputPinSet(GPIOB,GPIO_PIN_0)==0);
//注意;防连按
            return 1;
        }
    }
return 0;

按下为值,松手变0

完整为

int KEY_Scan(void)
{
    if(LL_GPIO_IsInputPinSet(GPIOB,GPIO_PIN_0)==0)
    {
        LL_mDelay(20);
        if(LL_GPIO_IsInputPinSet(GPIOB,GPIO_PIN_0)==0)
        {
            while(LL_GPIO_IsInputPinSet(GPIOB,GPIO_PIN_0)==0);
            return 1;
        }
    }
    if(LL_GPIO_IsInputPinSet(GPIOB,GPIO_PIN_1)==0)
    {
        LL_mDelay(20);
        if(LL_GPIO_IsInputPinSet(GPIOB,GPIO_PIN_1)==0)
        {
            while(LL_GPIO_IsInputPinSet(GPIOB,GPIO_PIN_1)==0);
            return 2;
​
        }           
        
    }
    if(LL_GPIO_IsInputPinSet(GPIOB,GPIO_PIN_2)==0)
    {
        LL_mDelay(20);
        if(LL_GPIO_IsInputPinSet(GPIOB,GPIO_PIN_2)==0)
        {
            while(LL_GPIO_IsInputPinSet(GPIOB,GPIO_PIN_2)==0);
            return 3;
​
        }
    }
    if(LL_GPIO_IsInputPinSet(GPIOA,GPIO_PIN_0)==0)
    {
        LL_mDelay(20);
        if(LL_GPIO_IsInputPinSet(GPIOA,GPIO_PIN_0)==0)
        {
            while(LL_GPIO_IsInputPinSet(GPIOA,GPIO_PIN_0)==0);
            return 4;
​
        }
    }
    return 0;
}

6.点灯

灯是Set灭Reset亮,PD2是暂存器,拉高就没法改变了

(1)一定要再while(1)前对灯初始化

LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_ALL);
LL_GPIO_SetOutputPin(GPIOD,GPIO_PIN_2);
LL_mDelay(10);
LL_GPIO_ResetOutputPin(GPIOD,GPIO_PIN_2);

(2)在while(1)里写个呼吸灯试试

    LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_ALL);
    LL_GPIO_ResetOutputPin(GPIOC,GPIO_PIN_8);
    LL_GPIO_SetOutputPin(GPIOD,GPIO_PIN_2);
    LL_mDelay(10);
    LL_GPIO_ResetOutputPin(GPIOD,GPIO_PIN_2);
        LL_mDelay(100);
    LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_ALL);
    LL_GPIO_SetOutputPin(GPIOC,GPIO_PIN_8);
    LL_GPIO_SetOutputPin(GPIOD,GPIO_PIN_2);
    LL_mDelay(10);
    LL_GPIO_ResetOutputPin(GPIOD,GPIO_PIN_2);
        LL_mDelay(100);

每次点灯某一个灯前记得全部拉高一下!!!

不然容易出现莫名全亮症状

(3) 点亮某个灯(传入值)

首先要写一个数组

uint32_t LED_arry[8]={LL_GPIO_PIN_8,LL_GPIO_PIN_9,LL_GPIO_PIN_10,LL_GPIO_PIN_11,LL_GPIO_PIN_12,LL_GPIO_PIN_13,LL_GPIO_PIN_14,LL_GPIO_PIN_15};

把LL_GPIO_PIN_x转换成数组[x-1]

然后就可以点亮传入值

void LED_liang(int x)
{
    LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_ALL);
    LL_GPIO_ResetOutputPin(GPIOC,LED_arry[x-1]);
    LL_GPIO_SetOutputPin(GPIOD,GPIO_PIN_2);
    LL_mDelay(10);
    LL_GPIO_ResetOutputPin(GPIOD,GPIO_PIN_2);
​
}

7. PWM

(1)先选中芯片里特定引脚(题目会给),注意都选通道一

(2)打开该通道

(3)配置频率

TIM17要求200Hz

本来是80MHz,即80 000 000

200 * Period * Prescaler=80 000 000

我习惯周期Period统一用1000好写

所以Prescaler=400

 

TIM3要求100Hz

同理

 

(4)选择LL库,生成

 

(5)主函数里对TIM初始化

(这函数好难背啊,TIM17 还多一句)

    LL_TIM_CC_EnableChannel(TIM3,LL_TIM_CHANNEL_CH1);
    LL_TIM_EnableCounter(TIM3);
    
    LL_TIM_CC_EnableChannel(TIM17,LL_TIM_CHANNEL_CH1);
    LL_TIM_EnableCounter(TIM17);
    TIM17->BDTR=1<<15;//MOE主输出使能

(6)写个占空比即可输出想要的PWM波

TIM3->CCR1=占空比(eg.500,就是1000的一半)

7.ADC

1.首先要用GetValue获取ADC值

uint16_t Get_ADC(void)
{
    uint16_t adc=0;
    HAL_ADC_Start(&hadc2);
    adc=HAL_ADC_GetValue(&hadc2);
    return adc;
}   

2.在主函数写

Volt=Get_ADC()*3.3/4096;

把ADC转换成电压

Volt是float,直接在Get_ADC里转数据类型会错

8.串口配置

1.CUBEMX里先找到Connectivity里的USART1

MODE选择Asyn....

2.NVIC里勾选USART->中断

3.

if(LL_USART_IsActiveFlag_RXNE(USART1)!=0)
{
​
 Res= LL_USART_ReceiveData8(USART1);
​
}

【LL_USART_IsActiveFlag函数需要手动在main.h里添加

#include "stm32g4xx_ll_usart.h"】

配置是这样,但是具体还有更麻烦的收发数据处理,抱佛脚人还没整理完

9. IIC

把官方给的文件加进自己的工程

 然后自己写两个函数

uint8_t AT24C02_Read(uint8_t Adrr)
{
	u8 temp = 0;
	
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();

	I2CSendByte(Adrr);
	I2CWaitAck();

	I2CStart();
	I2CSendByte(0xa1);
	I2CWaitAck();

	temp = I2CReceiveByte();
	I2CWaitAck();

	I2CStop();

	return temp;
}

void AT24C02_Write(uint8_t Adrr, uint8_t Data)
{
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	
	I2CSendByte(Adrr);
	I2CWaitAck();
	
	I2CSendByte(Data);
	I2CWaitAck();
	
	I2CStop();
	
	
}

就可以用它们将参数保存到 E2PROM

10.RTC

HAL_RTC_GetTime(&hrtc,&Time_1,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&Data_1,RTC_FORMAT_BIN);
​
sprintf(text_tring3,"Time:%.2d:%.2d:%.2d",Time_1.Hours,Time_1.Minutes,Time_1.Seconds);

11.TIM

 

基本这些功能会写,题就没什么问题啦,我写的不清楚的可以自己再查一下,我去赶紧看看客观题是什么了。。。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 概念定义:拖延症是一种心理疾病,它指的是一种持久性的行为模式,其特征是延迟完成任务。操作定义:拖延症指的是一种行为模式,即由于对任务难度过大、对成功没有自信、害怕失败、缺乏目标明确、缺乏合理计划等心理原因,导致有重要任务时无法及时开始或完成任务的行为。 ### 回答2: 拖延症是指个体在执行任务或完成计划中出现无法控制、无故延迟、拖拉拖延等行为的一种心理特征。它是指个体在本应采取行动的时候,却选择拖延、推迟或逃避行动,并且在拖延行为中感受到痛苦和内疚。拖延症的概念定义可以简化地理解为“不愿意立即行动、选择推迟或逃避行动,并在此过程中感受到负面情绪”。 对于拖延症的操作定义,可以从以下几个方面进行描述: 1. 时间管理困难:拖延症患者往往遇到时间管理上的困难,难以合理规划任务的时间和安排工作的优先级,导致任务堆积和拖延现象的发生。 2. 决策困难:拖延症患者在面临选择和做出决策时常常感到犹豫不决、犹豫不前,难以果断做出决策,进而导致任务的拖延。 3. 感受到痛苦和焦虑:拖延症患者在推迟或逃避行动时,常常会感到内疚、焦虑、压力和痛苦,但却无法有效摆脱这种负面情绪。 4. 完美主义倾向:拖延症患者中存在一部分人具有完美主义倾向,他们希望达到完美的标准,因此害怕出现失败或不完美的情况,对待任务时常常放大困难和要求,从而拖延行动。 5. 自我控制困难:拖延症患者常常在自我控制方面存在困难,无法有效地管理自己的情绪和动力,导致拖延行为的发生。 总而言之,拖延症指的是个体在行动中存在延迟、逃避、无法控制的特征,同时在此过程中感受到焦虑、压力和内疚等负面情绪。拖延症的操作定义主要包括时间管理困难、决策困难、痛苦和焦虑感受、完美主义倾向以及自我控制困难等方面。 ### 回答3: 拖延症是一种心理现象,指的是个体在面对任务时持续使用非理性的行为,无法有效地进行自我控制和时间管理,导致任务被推迟或未完成的现象。 操作定义是对拖延症概念的具体描述,包括拖延行为的特点和表现。拖延症的操作定义可以包括以下几个方面: 1. 任务的推迟:拖延症的主要特点是个体常常推迟开始任务的时间,即使任务的截止日期逼近,也无法迅速启动。个体可能会用其他没有紧迫性的活动或娱乐来替代初步的任务,以逃避任务的压力。 2. 临时抱佛脚:拖延症的个体常常在任务截止前的最后一刻才开始工作,临时抱佛脚,急于完成任务。这种行为常常导致工作效率低下,产生质量问题,并增加了心理的压力。 3. 决策困难:在面临多个任务或活动选择时,拖延症个体常常陷入决策困难。他们往往会花费大量的时间和精力去思考选择,而无法做出有效的决策。 4. 时间管理问题:拖延症个体常常无法正确管理时间。他们可能过度估计完成任务所需的时间,导致任务超时;或者无法合理分配时间,导致任务错过截止日期。 5. 消极情绪和自我指责:拖延症个体常常会感到内疚、紧张、焦虑和自我指责,因为他们意识到自己的拖延行为会带来负面后果,但又无法改变这种行为。 总之,拖延症是一种特定的心理现象,操作定义包括任务的推迟、临时抱佛脚、决策困难、时间管理问题以及消极情绪和自我指责等表现。对于这种现象,个体可以通过制定有效的时间管理策略、建立自我激励机制以及寻求专业帮助等方式来应对和改善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值