主题
🔧 功能篇 · 电赛单片机不翻页速通手册
🔧 功能篇 — 单片机核心外设功能速通:GPIO、PWM、ADC、IRQ、Timer、UART、I2C、SPI。
GPIO
5:38【功能·GPIO】不翻页!速通!电赛教程
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
6:00【功能·PWM】不翻页!速通!电赛教程
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
4:39【功能·ADC】不翻页!速通!电赛教程
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
4:06【功能·IRQ】不翻页!速通!电赛教程
javascript
// 示例伪代码
// 中断服务函数
void IRQ_Handler() {
digitalToggle(LED); // 中断触发时翻转LED
}
int main() {
// 初始化部分
pinMode(IRQ_PIN, INPUT); // 设置中断引脚为输入
setInterrupt(IRQ_PIN, RISING_EDGE, IRQ_Handler); // 配置上升沿触发
while(1) { /* 其他任务 */ } // 主循环
}Timer
4:59【功能·TIMER】不翻页!速通!电赛教程
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
4:45【功能·UART】不翻页!速通!电赛教程
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
5:08【功能·I2C】不翻页!速通!电赛教程
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
4:23【功能·SPI】不翻页!速通!电赛教程
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);
}