跳到内容

🔧 功能篇 · 电赛单片机不翻页速通手册

🔧 功能篇 — 单片机核心外设功能速通:GPIO、PWM、ADC、IRQ、Timer、UART、I2C、SPI。

← 返回整体说明 · 📦 模块篇 · 🧮 算法篇


GPIO

【功能·GPIO】不翻页!速通!电赛教程5:38

【功能·GPIO】不翻页!速通!电赛教程

电导不是韩导5206播放

json
// 示例伪代码
// 1. 设置GPIO为输出模式
pinMode(GPIO_PIN, OUTPUT);    // 设置为输出

// 2. 更改输出电平
digitalWrite(GPIO_PIN, HIGH); // 输出高电平
delay(1000); // 延时1000ms
digitalWrite(GPIO_PIN, LOW);  // 输出底电平
go
// 示例伪代码
// 1. 设置GPIO为输入模式,并启用内部上拉电阻
setPinMode(GPIO_PIN, INPUT);       // 设为输入模式
setPullUp(GPIO_PIN);               // 启用上拉电阻

// 2. 读取引脚状态(默认HIGH,按下按钮接地变LOW)
if (readDigitalPin(GPIO_PIN) == LOW) {
        print("Valid Press!");     // 触发
    }
}

PWM

【功能·PWM】不翻页!速通!电赛教程6:00

【功能·PWM】不翻页!速通!电赛教程

电导不是韩导4249播放

java
// 示例伪代码
// 1. 初始化PWM(选择引脚、频率、分辨率)
pwmPin = GPIO_PIN_X;          // 选择支持PWM的引脚(如PA8/PIN9)
pwmFrequency = 1000;          // 设置PWM频率(Hz,如1kHz)
pwmResolution = 8;            // 设置分辨率(比特数,如8位=0~255)

setPinMode(pwmPin, PWM_OUTPUT); // 设置引脚为PWM输出模式
initPWM(pwmPin, pwmFrequency, pwmResolution); // 初始化PWM硬件

// 2. 固定占空比(0%~100%对应0~最大值)
setPWMDutyCycle(pwmPin, 50);  // 设置占空比为50%

// 3. 动态占空比
while (1) {
    for (duty = 0; duty <= 100; duty += 10) {
        setPWMDutyCycle(pwmPin, duty);  // 渐变占空比(呼吸灯效果)
        delay(100);
    }
}

ADC

【功能·ADC】不翻页!速通!电赛教程4:39

【功能·ADC】不翻页!速通!电赛教程

电导不是韩导2873播放

go
// 示例伪代码
// 1. 配置ADC引脚为模拟输入
adc_configure_pin(PIN_A0);   // 设置A0为模拟输入

// 2. 初始化ADC硬件(自动使用默认设置)
adc_init();                  // 启用ADC

// 3. 读取一次原始值
raw_value = adc_read(PIN_A0); // 获取0-4095原始值

print("ADC值: %d", raw_value); // 直接输出结果

IRQ

【功能·IRQ】不翻页!速通!电赛教程4:06

【功能·IRQ】不翻页!速通!电赛教程

电导不是韩导2682播放

javascript
// 示例伪代码

// 中断服务函数
void IRQ_Handler() {
    digitalToggle(LED);  // 中断触发时翻转LED
}

int main() {
    // 初始化部分
    pinMode(IRQ_PIN, INPUT);          // 设置中断引脚为输入
    setInterrupt(IRQ_PIN, RISING_EDGE, IRQ_Handler);  // 配置上升沿触发

    while(1) { /* 其他任务 */ }       // 主循环
}

Timer

【功能·TIMER】不翻页!速通!电赛教程4:59

【功能·TIMER】不翻页!速通!电赛教程

电导不是韩导2114播放

javascript
// 示例伪代码

// 中断服务函数
void Timer_IRQHandler() {
    digitalToggle(LED);  // 中断触发时翻转LED
}

// 主函数初始化
int main() {
    // 1. 初始化周期定时器(1ms中断)
    Timer_Init(TIM1, PERIODIC, 1000Hz);  // 1ms周期
    NVIC_SetIRQHandler(TIM1_IRQn, Timer_IRQHandler);

    // 或者2. 初始化超时定时器(3s单次中断)
    Timer_Init(TIM2, ONESHOT, 3000ms);
    NVIC_SetIRQHandler(TIM2_IRQn, Timer_IRQHandler);

    while(1);  // 所有操作由中断完成
}

UART

【功能·UART】不翻页!速通!电赛教程4:45

【功能·UART】不翻页!速通!电赛教程

电导不是韩导2215播放

javascript
// 示例伪代码

// 1.初始化
void UART_Init() {
    // 1. 配置TX/RX引脚(伪代码)
    pinMode(UART_TX_PIN, ALT_FUNC);  // 设为复用功能
    pinMode(UART_RX_PIN, ALT_FUNC);

    // 2. 核心参数配置
    uart_setup(port:1, baud:115200, data:8, parity:none, stop:1);
}

// 2.主函数,发送或接收UART数据
int main() {
    UART_Init();          // 初始化(含引脚)
    UART_Send("Hello");   // 发送
    char c = UART_Read(); // 接收
}

I2C

【功能·I2C】不翻页!速通!电赛教程5:08

【功能·I2C】不翻页!速通!电赛教程

电导不是韩导2550播放

javascript
// 示例伪代码
void I2C_Init() {
    // 1. 配置I2C引脚(SCL/SDA)
    pinMode(I2C_SCL_PIN, ALT_FUNC_OPEN_DRAIN);  // 开漏输出
    pinMode(I2C_SDA_PIN, ALT_FUNC_OPEN_DRAIN);

    // 2. I2C参数配置
    i2c_setup(port:0, speed:400kHz);  // 标准模式(100kHz)或快速模式(400kHz)
}

int main() {
    I2C_Init();
    // 1. 向0x27地址的设备发送指令0xFE(示例:LCD清屏)
    I2C_WriteCommand(dev_addr:0x27, cmd:0xFE);
    // 2. 向0x68地址的设备读取6字节(示例:LCD清屏)
        I2C_Read_Reg(dev_addr:0x68, reg:0x3B, buf, len:6);
}

SPI

【功能·SPI】不翻页!速通!电赛教程4:23

【功能·SPI】不翻页!速通!电赛教程

电导不是韩导2692播放

javascript
// 示例伪代码
void SPI_Init() {
    // 1. 配置SPI引脚(SCK/MOSI/MISO)
    pinMode(SPI_SCK_PIN, ALT_FUNC);   // 时钟线
    pinMode(SPI_MOSI_PIN, ALT_FUNC); // 主机输出
    pinMode(SPI_MISO_PIN, ALT_FUNC); // 主机输入

    // 2. 配置片选引脚(两个设备)
    pinMode(CS1_PIN, OUTPUT);  // 设备1片选
    pinMode(CS2_PIN, OUTPUT);  // 设备2片选
    digitalWrite(CS1_PIN, HIGH); // 初始不选中
    digitalWrite(CS2_PIN, HIGH);

    // 3. SPI参数配置
    spi_setup(port:0, mode:0, speed:1MHz); // 模式0,1MHz时钟
}
// ===== 发送指令 ===== //
void SPI_WriteCommand(uint8_t cs_pin, uint8_tcmd) {
    digitalWrite(cs_pin, LOW);    // 选中设备
    spi_write(cmd);               // 发送指令
    digitalWrite(cs_pin, HIGH);   // 释放设备
}
// ===== 读取数据 ===== //
void SPI_ReadData(uint8_t cs_pin, uint8_t reg, uint8_t *buf, uint8_tlen) {
    digitalWrite(cs_pin, LOW);
    spi_write(reg);              // 先发送寄存器地址
    spi_read(buf, len);          // 连续读取数据
    digitalWrite(cs_pin, HIGH);
}

int main() {
    SPI_Init();
    uint8_t data[6];

    // 1. 向设备1(CS1)发送指令0xFE
    SPI_WriteCommand(CS1_PIN, 0xFE);

    // 2. 从设备2(CS2)的0x3B寄存器读取6字节
    SPI_ReadData(CS2_PIN, 0x3B, data, 6);
}