#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <stm32c0xx.h>
// 1. 极其精简的配置
Adafruit_SSD1306 d(128, 64, &Wire, -1);
void UART_Init() {
RCC->IOPENR |= 1;
RCC->APBENR1 |= (1 << 17);
GPIOA->MODER &= ~(3 << 4); GPIOA->MODER |= (2 << 4);
GPIOA->AFR[0] &= ~(0xF << 8); GPIOA->AFR[0] |= (1 << 8);
USART2->BRR = 417;
USART2->CR1 |= 9;
}
void p(const char *s) { // 缩减函数名以节省空间
while (*s) {
while (!(USART2->ISR & (1 << 7)));
USART2->TDR = *s++;
}
}
void setup() {
UART_Init();
// 硬件寄存器初始化
RCC->APBENR2 |= (1 << 20);
GPIOA->MODER |= 3;
ADC1->CHSELR |= 1; ADC1->CR |= 1;
while (!(ADC1->ISR & 1));
RCC->APBENR2 |= (1 << 11);
GPIOA->MODER &= ~(3 << 16); GPIOA->MODER |= (2 << 16);
GPIOA->AFR[1] &= ~0xF; GPIOA->AFR[1] |= 2;
TIM1->PSC = 47; TIM1->ARR = 1000;
TIM1->CCMR1 |= 0x68; TIM1->CCER |= 1;
TIM1->BDTR |= 0x8000; TIM1->CR1 |= 1;
d.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}
void loop() {
ADC1->CR |= 4;
while (!(ADC1->ISR & 4));
uint32_t v = ADC1->DR;
TIM1->CCR1 = (v * 1000) >> 12; // 使用位移代替除法
// 2. 极其精简的显示逻辑
d.clearDisplay();
d.setCursor(0, 0);
d.setTextColor(1);
d.print(v); // 只显示数字
// 发送最简单的数据包
char m[10];
utoa(v, m, 10); // 使用更轻量的 utoa 代替 sprintf
p(m); p("\n");
d.display();
for(volatile int i=0; i<50000; i++);
}