蓝桥杯嵌入式抱佛脚速成

从搞不懂蓝桥杯干嘛的到能完成几乎所有任务的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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值