(自用)蓝桥杯准备(需要写的基础)

c 复制代码
要写的文件
led_app
lcd_app
key_app
adc_app
usart_app
scheduler
LHF_SYS

一、外设引脚配置

1. 按键引脚

按键引脚配置如下:

  • B1:PB0
  • B2:PB1
  • B3:PB2
  • B4:PA0

2. LCD引脚

LCD引脚配置如下:

  • GPIO_Pin_9 /* PB.9 */
  • GPIO_Pin_8 /* PB.8 */
  • GPIO_Pin_5 /* PB.5 */
  • GPIO_Pin_10 /* PB.10 */

3. LED引脚

LED引脚配置如下:

  • PC8-PC15

4. USART引脚

USART引脚配置如下:

  • A9(USART1_TX)
  • A10(USART1_RX)

5. 板上电阻

板上电阻R37和R38连接到:

  • PB15
  • PB12

二、关键函数

1. LCD显示函数

c 复制代码
void LcdSprintf(uint8_t Line, char *format, ...)
{
    char String[21];
    va_list arg;
    va_start(arg, format);
    vsprintf(String, format, arg);
    va_end(arg);
    LCD_DisplayStringLine(Line, String);
}

使用说明:

  • Line:指定LCD显示的行号。
  • format:格式化字符串,类似于printf的用法。
  • 该函数通过va_list和vsprintf实现可变参数的格式化显示。

2. 按键状态检测

c 复制代码
key_val = key_read();
key_down = key_val & (key_old ^ key_val);
key_up = ~key_val & (key_old ^ key_val);
key_old = key_val;

使用说明:

  • key_read():读取当前按键状态。
  • key_down:检测按键按下事件。
  • key_up:检测按键释放事件。
  • key_old:保存上一次按键状态,用于对比。

3. ADC电压采集

c 复制代码
uint32_t GetAdcVoltage(HAL_ADC_HandleTypeDef *hadc)
{
    HAL_ADC_Start(hadc);
    uint32_t adc = HAL_ADC_GetValue(hadc);
    return adc * 3.3 / 4096;
}

使用说明:

  • HAL_ADC_Start(hadc):启动ADC转换。
  • HAL_ADC_GetValue(hadc):获取ADC转换后的值。
  • 由于ADC精度为12位,参考电压为3.3V,因此通过公式adc * 3.3 / 4096计算实际电压值。

4. 串口通信

(1)中断方式

如果忘记使用DMA,可以直接使用中断方式:

  • 配置引脚A9(USART1_TX)和A10(USART1_RX)。
(2)DMA方式

使用DMA接收串口数据:

c 复制代码
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, uart_rx_dma_buffer, sizeof(uart_rx_dma_buffer));
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);

使用说明:

  • HAL_UARTEx_ReceiveToIdle_DMA:配置DMA接收串口数据,直到接收到空闲信号。
  • __HAL_DMA_DISABLE_IT:禁用DMA的半传输中断。
(3)标准输入输出重定向

为了在STM32上使用标准输入输出函数(如printf和scanf),需要重定向fputc和fgetc函数:

c 复制代码
int fputc(int ch, FILE* str)
{
    HAL_UART_Transmit(&huart1, (uint8_t *) &ch, 1, 10);
    return ch;
}

int fgetc(FILE *fp)
{
    uint8_t ch = 0;
    HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
    return ch;
}

使用说明:

  • fputc:将字符通过串口发送。
  • fgetc:从串口接收字符。
相关推荐
UIU1143 小时前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
爱聊灵光的维C1 天前
C语言初阶:关于函数设计的详细讲解和注意事项
c语言·开发语言·青少年编程·蓝桥杯·学习方法
GG.WinGel4 天前
三元组中心问题
java·数据结构·算法·青少年编程·蓝桥杯
GG.WinGel5 天前
质数数目(蓝桥杯练习题)
java·数据结构·算法·青少年编程·蓝桥杯
Tsuki_tl6 天前
【优选算法 — 双指针】经典例题题解+算法总结
算法·蓝桥杯·力扣·刷题·双指针·1024程序员节·优选算法
十二8 天前
【洛谷题解】P1115 最大子段和(前缀和 + 维护最小前缀)
数据结构·c++·算法·蓝桥杯
青少儿编程课堂10 天前
2026蓝桥杯青少组:校园飞鸟穿越赛解析
蓝桥杯·scratch·少儿编程·图形化编程·蓝桥杯青少组
aqiu11111112 天前
蓝桥杯真题复盘:Fibonacci 数列与黄金分割(C++ 算法详解)
c++·算法·蓝桥杯
aqiu11111113 天前
题目总结:[P8752 [蓝桥杯 2021 省 B2] 特殊年份]
蓝桥杯
青少儿编程课堂13 天前
2026蓝桥杯青少组:校园防疫大作战解析
蓝桥杯·scratch·少儿编程·图形化编程·蓝桥杯青少组