跳过正文
  1. 文章/

键盘 PCB 设计

·591 字·3 分钟
作者
Yang Hu

功能亮点
#

最初我想做一块分体键盘,但由于已经有了一块分体板(crkbd),做一块类似 Arteus/Reviunge 的一体板更有意义。

设计采用激进式行列错位(与我的分体设计相同的列错位),列方向倾斜 15 度。

其他功能:

  • OLED 状态显示
  • RGB 底部灯
  • 音频
  • 编码器

STM32 设计考量
#

由于 F072 缺货,将使用 F411。

在 QMK 中配置 STM 芯片的技巧:https://discord.com/channels/440868230475677696/440870965728116754/839978277489082370

查找使用特定芯片的键盘的代码片段:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 % git grep 'MCU\s*=\s*STM32F411' keyboards/
 keyboards/handwired/onekey/blackpill_f411/rules.mk:MCU = STM32F411
 keyboards/handwired/onekey/blackpill_f411_tinyuf2/rules.mk:MCU = STM32F411
 keyboards/handwired/pill60/blackpill_f411/rules.mk:MCU = STM32F411
 keyboards/handwired/riblee_f411/rules.mk:MCU = STM32F411
 keyboards/matrix/m20add/rules.mk:MCU = STM32F411
 keyboards/matrix/noah/rules.mk:MCU = STM32F411
 keyboards/tkw/grandiceps/rules.mk:MCU = STM32F411
 keyboards/tkw/stoutgat/v2/f411/rules.mk:MCU = STM32F411
 keyboards/zvecr/zv48/f411/rules.mk:MCU = STM32F411

外设的 DMA 通道
#

I2C、SPI、ADC、DAC 等外设使用 DMA 通道。PWM 也可以使用 DMA 以获得更好的性能,例如用于 LED 驱动器。STM32F072 有 7 个 DMA 通道(详情见参考手册)。选择外设时需要谨慎,避免 DMA 通道冲突。

QMK 对以下功能使用 DMA:

  • WS2812 LED:PWM 驱动使用 DMA+PWM
  • 音频:DAC 驱动使用 DMA;PWM 驱动不使用 DMA
  • OLED:使用 I2C,I2C 使用 DMA 通道

F072 DMA 详情
#

F072 只有一个 DMA 控制器(DMA1),有 1 个通道,7 个流。

  • I2C1:使用 DMA 流 6/7(或 2/3)(需要魔法启动代码进行配置)
  • DAC1/2:使用 DMA 流 3 和 4
  • SPI1:流 2/3
  • SPI2:流 4/5 或 6/7
  • TIM3_CH1:流 4
  • TIM1_CH1:流 2

F411 DMA 详情
#

F411 有 2 个 DMA 控制器,每个有 8 个通道,每通道 8 个流。

我设计中 DMA 使用情况汇总:

|———–|————|——-|———————|———————-|

功能QMK 驱动引脚外设DMA 通道
OLEDI2CPB6/7I2C1DMA1-Chan1-Stream5/6
音频PWMPA8TIM1_CH1 + TIM6 GPTN/A
RGB LEDPWMPB1TIM3_CH4DMA1-Chan5-Stream2
RGB(备选)SPI1PB5SPI1DMA2-Chan3-Stream2/3
———–——————-——————————————-

音频驱动
#

两种选择:DAC 和 PWM。DAC 会占用一个或两个 DMA 通道;PWM 不使用 DMA。

使用 DAC 的音频
#

使用两个引脚可以提供更高的电压幅度和更大的音量。

1
2
3
4
5
6
7
8
// 音频配置
#define AUDIO_PIN A4
#define AUDIO_PIN_ALT A5
#define AUDIO_PIN_ALT_AS_NEGATIVE
#define A4_AUDIO
#ifndef STARTUP_SONG
#    define STARTUP_SONG SONG(STARTUP_SOUND)
#endif  // STARTUP_SONG

使用 PWM 的音频
#

  • 使用任意定时器的 PWM 输出方波,仅支持单引脚模式。

TIM3_CH1 为例(用 tim6 作为音频状态定时器):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
//halconf.h:
#define HAL_USE_PWM                 TRUE
#define HAL_USE_PAL                 TRUE
#define HAL_USE_GPT                 TRUE
#include_next <halconf.h>

// mcuconf.h:
#include_next <mcuconf.h>
#undef STM32_PWM_USE_TIM1
#define STM32_PWM_USE_TIM1                  TRUE
#undef STM32_GPT_USE_TIM6
#define STM32_GPT_USE_TIM6                  TRUE

//config.h:
// 使用引脚 C6(TIM3_CH1) PWM
#define AUDIO_PIN A8
#define AUDIO_PWM_PAL_MODE 1
#define AUDIO_PWM_DRIVER PWMD1
#define AUDIO_PWM_CHANNEL 1
#define AUDIO_STATE_TIMER GPTD6

OLED
#

I2C:使用 I2C1(引脚 B6/7)。参考

注意:I2C 引脚需要上拉电阻(4.7kOhm)。

魔法修复
#

对于 F072,正确使用 I2C1 需要额外配置。详情见 discord

示例代码
#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 示例配置:https://github.com/qmk/qmk_firmware/blob/master/keyboards/xelus/kangaroo/config.h
// 将 I2C1_SCL_PAL_MODE 和 I2C1_SDA_PAL_MODE 设为 1(引脚 B6/7)

#define I2C1_TIMINGR_SCLDEL 3U
#define I2C1_TIMINGR_SDADEL 1U
#define I2C1_TIMINGR_SCLH     3U
#define I2C1_TIMINGR_SCLL   9U

void board_init(void) {
  SYSCFG->CFGR1 |= SYSCFG_CFGR1_I2C1_DMA_RMP;
  SYSCFG->CFGR1 &= ~(SYSCFG_CFGR1_SPI2_DMA_RMP);
}

背光 RGB
#

使用 PWM 的 RGB 驱动
#

使用 PWM 和 DMA。这里使用引脚 B1 上的 TIM3_CH4 作为输出,通过上拉电阻连接到 5V(B1 是 5V 容忍引脚)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// rules.mk
RGBLIGHT_DRIVER = WS2812
// config.h
#define RGB_DI_PIN B1
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 4
#define WS2812_EXTERNAL_PULLUP
#define WS2812_PWM_PAL_MODE 2
#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
#define WS2812_DMA_CHANNEL 5

使用 SPI 的 RGB 驱动
#

使用 SPI2(B15)。参考

1
2
3
4
#define WS2812_SPI SPID2
#define WS2812_SPI_MOSI_PAL_MODE 0
#define WS2812_SPI_MOSO_PAL_MODE 0
#define WS2812_SPI_SCK_PAL_MODE 0

元器件选择
#

使用此网站搜索 JLCPCB 零件,查看 SMD 贴片服务的可用性和价格。

汇总:

|—————-|—————|———–|————————————-|—————————————|

元件型号JLCPCB 料号数量备注
MCUSTM32F072CBU6C925041
稳压器XC6206P332MRC544613.3V 固定输出
BJTMMBT3904C205261用于复位电路,需加电阻
二极管1N4148C81598用于按键和复位按钮
保险丝JK-MSMD050C369167用于 USB 总线电压保护
肖特基二极管SS14C2480用于稳压器之间
蜂鸣器KLJ-1625C201041SMD 压电蜂鸣器

MCU
#

使用 STM32 MCU,比 Pro Micro 上的 atmega 更强大。atmega32u4 是 8 位处理器,只有 32K 存储。相比之下,ARM 芯片是 32 位的,程序存储更大(F072C8 有 64K,F072CB 有 128K,F411 有 256K/512K Flash 和 128K SRAM)。

F4 系列没有内置 EEPROM 模拟器,需要外部 EEPROM 芯片,否则某些功能无法使用,例如 bootmagic 和板载设置(默认层等)。

复位按钮电路
#

要复位(并进入 bootloader),需要同时触发 NRST 和 BOOT0 引脚。我使用中间那种方案,需要一个晶体管。

保险丝
#

Ferris 使用的型号缺货,在 LCSC 上找到了规格相近的 C369167。

肖特基二极管
#

使用 JLCPCB 基础件 SS14,规格为"40V 1A 550mV @ 1A",与 Ferris 使用的 RB060MM-30 接近。

电阻和电容
#

全部使用 0603 封装。

TODO
#

下次设计需要改进的地方:

  • 给 I2C 引脚加 4.7k 上拉电阻
  • 使用 8MHz 晶振代替 25MHz。参考