STM32G431是一款 STM32G4 系列的入门级芯片,它内嵌了运行频率为 170 MHz 的 Arm Cortex-M4内核,支持 FPU 和 DSP 指令,属混合信号微控制器。 该系列芯片具有: •2 个高速12 位 ADC(采样率 4 M/秒) •4 个 12 位 DAC(采样率 15 M/秒) •4 个高速比较器(17 纳秒) •3 个高速运放(具有可编程增益) •ART、CCM SRAM 和数算加速器 •单存储区 Flash存储容量范围为 32 到 128 KB,封装为 32 到 100 引脚。
* z( z# }6 [7 \2 p
4 @7 u& h3 E) y; T: ySTM32G431开发板的周边外设比较少,为了便于人际交互最先考虑的是为其配上一个显示屏,以利于信息的观察。 为了较少地占用系统资源,这里采用的是I2C接口的双色OLED屏,考虑到STM32G431开发板配有Arduino接口,就将OLED屏放到Arduino接口上来使用,从而能够不必连线就解决问题。
% w Q* y# D. B8 Q, V
OLED屏与MCU大的连接关系为: SCL---PA5 SDA---PA6
; c! f& Y3 K0 L9 [- O' c) q
控制相关引脚输出高低电平的语句定义为: #defineOLED_SCLK_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_SET) #defineOLED_SCLK_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_RESET) #defineOLED_SDIN_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_SET) 3 K6 u( v# [3 A: j
#defineOLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_RESET)
, k6 t) Q2 M k3 j+ U3 n* S/ h! M$ n, p
实现引脚输出功能配置的函数为: - void GPIO_OLED_INIT(void)9 Z4 |$ q: X+ q4 a
- {
1 E& W0 ]+ C2 ]: e: g! Y - __HAL_RCC_GPIOA_CLK_ENABLE();+ f- L" n( F5 y N- e; ^4 I
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
0 b) W [) F/ k2 G8 q( P# L - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;0 C l# |$ P& V
- GPIO_InitStruct.Pin = GPIO_PIN_5;
9 t1 B+ f5 b9 {5 [& m! U) ~" l; s8 N - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); " F& K0 X% d; i
- GPIO_InitStruct.Pin = GPIO_PIN_6;. \: ~7 Y. S6 ^( X
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
; n% j4 d4 U+ D' K - }
复制代码 ! n7 F. B' k" [1 ]9 l- I. i
由于STM32G431的主频速度比较高,故直接移植程序代码是有问题的,需要添加相应的延时函数来辅助解决。 修改后的辅助显示函数为: - void IIC_Start()
" n) X3 G7 g( P: \6 W8 S- C2 n - {) J, g5 C: W$ }% b; k+ O! r7 J p9 `9 [
- OLED_SCLK_Set();
5 F' ^8 `# u4 m5 e% a m: x - Delay(1);9 k+ y& j1 [6 c9 W, T: x9 p
- OLED_SDIN_Set();
2 j9 B, _, y4 b) I - Delay(1);+ q1 j9 `3 ]3 K4 S4 c
- OLED_SDIN_Clr();/ n: Y! N; A- s2 C6 u! U
- Delay(1);
0 v6 |6 ?8 O$ \- l - OLED_SCLK_Clr();. T( E2 g/ P! Y; p5 t
- Delay(1);5 Z6 d+ t& R( T2 v
- }
M8 w1 |/ K2 P6 c" t - 7 v' \0 Y7 C8 S; b& ` j( A2 z5 I
- void IIC_Stop()7 T6 l8 [* [9 A- q0 D
- {
3 U+ _ }% a7 ?. h$ Z/ P% |4 g" r - OLED_SCLK_Set();
, T8 q! N$ I& P: | - Delay(1);
* w% ?9 u# U- j2 i. _/ Z - OLED_SDIN_Clr();
: ^) } F% F8 j& H0 y - Delay(1);
. f: y+ I/ x1 u- c - OLED_SDIN_Set();2 ^4 m8 N! D5 K) T5 @3 s j0 x
- Delay(1);5 H( k0 p* C# f5 R. u0 n
- }* y- ~! _- ^- L' A1 c; ?
- 5 d9 t$ }; c5 C1 Z* `2 C
- void IIC_Wait_Ack()
0 V E/ v& c4 L- P - {# X/ s4 h& _: m1 ?( T$ O# z& o$ S
- OLED_SCLK_Set();6 e/ u7 e5 @( A
- Delay(1);
4 r) [1 ?6 U# J" ^+ K$ Z# T0 B - OLED_SCLK_Clr();
% e2 t9 s' N# r+ i* _$ Z- z - Delay(1);
7 a, y/ G6 S6 u c8 r$ C# Q v( S - }
复制代码
$ H5 S$ e6 W) G实现下图显示效果的主程序为: - int main(void)
2 D f$ `0 e% W* A" E' k/ k - {, a" y3 L. p: |1 @& ?) P9 W2 N7 h
- HAL_Init();
5 h& H5 q7 c) t8 y - SystemClock_Config(); Q6 g# N. K/ [- n8 n$ C
- GPIO_OLED_INIT();
) }- v7 v2 t6 G7 k3 U, C - OLED_Init();* }! d' O) W: ~( K0 D; |
- OLED_Clear();
! `' P2 g' E$ I% b" ? - OLED_ShowString(10,2,"STM32G431",16);: F u5 M" P" K6 M. n
- OLED_ShowString(10,4,"OLED TEST",16);
3 w5 d+ _ z' L0 M: c* w/ C - OLED_ShowCHinese(79,2,9);: |8 T; Z6 d, g+ q
- OLED_ShowCHinese(95,2,10); |; n; Y7 o' R4 e
- OLED_ShowCHinese(111,2,11);
% `2 \1 Z+ j4 C! y6 } - while (1);( G! h+ d& X2 [! c, ?( h$ L
- }
复制代码 ( _, Z7 t$ d' y/ O+ |
3 z1 s' c3 q! W6 H7 F7 @: }+ F
OLED屏显示效果 4 u7 _% Y( B. T, Z: @% ^
! }" \/ Q/ D6 p2 y4 c1 w |
感谢支持!!!