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 引脚。 6 N2 g4 Y3 F b* [. H7 o
# P( r0 q' o4 V% M$ |! m
STM32G431开发板的周边外设比较少,为了便于人际交互最先考虑的是为其配上一个显示屏,以利于信息的观察。 为了较少地占用系统资源,这里采用的是I2C接口的双色OLED屏,考虑到STM32G431开发板配有Arduino接口,就将OLED屏放到Arduino接口上来使用,从而能够不必连线就解决问题。
! X+ }7 y Y6 g, Q9 o
OLED屏与MCU大的连接关系为: SCL---PA5 SDA---PA6
$ g0 @ i5 ^0 `
控制相关引脚输出高低电平的语句定义为: #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) ; a( S. o! [. R/ d: E7 M
#defineOLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_RESET)
$ S+ E, n( W- Z/ @7 o% l: P9 w' [
实现引脚输出功能配置的函数为: - void GPIO_OLED_INIT(void)) l7 V2 o: W: P0 u" V( B
- {
9 {. {% p% W1 |$ n+ V, | - __HAL_RCC_GPIOA_CLK_ENABLE();5 k0 [7 c n+ A9 ~
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;+ r( J Y$ ]4 e: e% W
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
$ @7 _8 W# J4 b: j6 ~% I+ j+ t - GPIO_InitStruct.Pin = GPIO_PIN_5;
( v" k( R1 N0 F7 F: b/ ? - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
) F# e1 x- b% C" @ - GPIO_InitStruct.Pin = GPIO_PIN_6;9 _$ L# a7 g! w8 S2 b
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);* v8 b$ ]& I5 ~" P
- }
复制代码 D) z& ]0 @! X: O: l4 }% |, J
由于STM32G431的主频速度比较高,故直接移植程序代码是有问题的,需要添加相应的延时函数来辅助解决。 修改后的辅助显示函数为: - void IIC_Start()* ?1 }! Z4 ?: Y# _; |2 e
- {
* `- S4 T; z" p. D7 @& c: L - OLED_SCLK_Set();
9 a8 s: A8 r9 f7 |3 _- v - Delay(1);
9 m. |+ f! }: `0 I' l; E" C0 u+ m - OLED_SDIN_Set();6 _2 f4 ~7 X1 s. \8 T+ a k) n& L3 A
- Delay(1);
1 x d/ L6 d- b* [1 v* M6 g - OLED_SDIN_Clr();8 H ?1 F4 W( R6 R
- Delay(1);
2 H7 A( w+ A% i - OLED_SCLK_Clr();
! M R. R6 w J - Delay(1);
6 ^; ]6 b! w7 S - }
1 m# p0 G1 r1 E7 X3 h v( Z( G+ x - ! H$ W( S: _" M" G
- void IIC_Stop()
: u/ O+ U) P7 G8 D0 z8 @$ [ - {
: s! r9 H: X) H/ `5 E& K- L* i - OLED_SCLK_Set();" n; e5 T/ Q1 F
- Delay(1);
! g, W Y2 y& ]/ X1 D - OLED_SDIN_Clr();
/ b8 ?6 ?- s8 e - Delay(1);0 W) J. z/ a9 G6 i: u# E4 B2 W
- OLED_SDIN_Set();
1 A! V* G4 I6 y) F' K* h$ g! l - Delay(1);& e' P1 m% f5 _4 d: S9 j
- }
! n2 [: ^: ^$ m7 m% o) C - 0 T- y, T9 Z4 |$ d9 R/ L
- void IIC_Wait_Ack()
& q' w' d+ B. z7 V3 I; O" y - {9 K/ u0 L$ ^6 ?& f7 C+ o
- OLED_SCLK_Set();1 k' w" d9 o. ^& N
- Delay(1);
3 s' U" h$ V6 | E. F* \- \8 ] - OLED_SCLK_Clr();
* W( z" y) y# m) S. Q! f t - Delay(1);7 k; `( z8 x$ E" |! P
- }
复制代码 : Z8 W: E. n% A0 ^, d$ J6 e' R
实现下图显示效果的主程序为: - int main(void)6 w+ F5 U: u3 r1 k; Z6 k7 \; \0 c
- {& {& q% I/ h2 A
- HAL_Init();( o( z% Z" p: Y1 s; O: O4 d% a
- SystemClock_Config(); R/ ^& v( g( J; m4 ]: m" l3 T
- GPIO_OLED_INIT();: J% k. V6 M5 v7 v
- OLED_Init();/ I3 h# ]8 P' d; N2 u" ]- w3 i- e
- OLED_Clear();
1 G8 L0 C/ X6 W2 i6 ` - OLED_ShowString(10,2,"STM32G431",16);, _) l+ {$ e0 w( x( `
- OLED_ShowString(10,4,"OLED TEST",16);
j- q2 ?6 Z& {" C- m& [* r - OLED_ShowCHinese(79,2,9);( O4 p: d" X" m* y0 Z5 o! b a
- OLED_ShowCHinese(95,2,10);) Q4 v# V# I' G( b% i( e
- OLED_ShowCHinese(111,2,11);4 P/ m3 G E! h: p. o
- while (1);
$ t( B9 c1 O" `6 i8 e1 j7 p8 l - }
复制代码
9 Q9 L: t+ N( I
; `4 q# I q) i% M9 w6 g* O$ DOLED屏显示效果 ! Y3 {7 `. e7 n/ n
9 e: @4 |0 ~4 j J
|
感谢支持!!!