从搞不懂蓝桥杯干嘛的到能完成几乎所有任务的2天速成(我自己)
适合和我一样平时还是会用STM32的水一下蓝桥杯省二省三(大概率省三,就抱两天佛脚咋和人家练习过的大佬比)
后天就比赛了,分享一下自己整理的配置给同样抱佛脚的同学,来不及写具体一点了
总之就是,学会我接下来发的基础配置,拿到题把它们配置好,然后写个逻辑完成这些功能就完事了(逻辑一般就是按键有什么功能显示什么就完事了)
注意配置一个,测试一个
基础配置可以从CubeMX里从0配,也可以直接打开比赛的时候给的资源包的液晶屏的CubeMX文件,直接配置其他文件
这里我用的LL库,部分代码会方便一点,和HAL库区别不大(抱佛脚背就完事了)
1.CUBEMX里配置引脚:
-
按键:PA0 PB0-2 input
-
灯:PC8-15 PD2 output
-
屏幕:用屏幕LCD自带
-
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
基本这些功能会写,题就没什么问题啦,我写的不清楚的可以自己再查一下,我去赶紧看看客观题是什么了。。。