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 引脚。 e- m' J! d( A' W2 g) p$ @3 b* I
2 J: [, \7 ~* n' Z+ A# c8 q3 {STM32G431开发板的周边外设比较少,为了便于人际交互最先考虑的是为其配上一个显示屏,以利于信息的观察。 为了较少地占用系统资源,这里采用的是I2C接口的双色OLED屏,考虑到STM32G431开发板配有Arduino接口,就将OLED屏放到Arduino接口上来使用,从而能够不必连线就解决问题。 R `! Z) L4 b
OLED屏与MCU大的连接关系为: SCL---PA5 SDA---PA6 ) Y+ e2 C s% y% j
控制相关引脚输出高低电平的语句定义为: #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)
' U8 b; ^# M2 S( F#defineOLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_RESET)
- y& [ }: I3 E( \
实现引脚输出功能配置的函数为: - void GPIO_OLED_INIT(void)
' X' c, |- i5 n) d - {
. y D7 y, G& n! } - __HAL_RCC_GPIOA_CLK_ENABLE();
% C0 g9 x, {. a- I1 K9 P - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;* z0 U$ ?) U% ^9 u* ?0 X0 B/ O% W
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;! L; U; |0 u3 B/ e$ ?& U1 z+ I k
- GPIO_InitStruct.Pin = GPIO_PIN_5;
5 j3 B3 f I1 i - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
8 r+ f* W2 `) O. O - GPIO_InitStruct.Pin = GPIO_PIN_6;, K' |4 I$ Y# T& F
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);+ m/ h# f6 q+ @& U$ i2 Y" M5 `
- }
复制代码 , u7 ?# v" f, ~: w2 c7 t
由于STM32G431的主频速度比较高,故直接移植程序代码是有问题的,需要添加相应的延时函数来辅助解决。 修改后的辅助显示函数为: - void IIC_Start()' y- M% s1 g A9 K
- {
: O8 y( _, J, |# t# j/ _/ | - OLED_SCLK_Set();
5 ?, F+ Q7 s! E - Delay(1);
4 L0 [) E! k0 ~1 R. |2 ` - OLED_SDIN_Set();$ k: d9 |! Z- L9 G. \' M
- Delay(1);2 Y, T* Y$ J( O U x7 S$ r M
- OLED_SDIN_Clr();
2 }7 d. M" X, G9 x - Delay(1);
. D9 [! Y2 ^9 [9 r, V - OLED_SCLK_Clr();7 Z7 {) K4 H" ~: X7 \. @/ l
- Delay(1);
* ^& s2 L) S# c - }/ C6 I2 S/ _5 f7 A
- 1 M1 l) K: o* u( A
- void IIC_Stop()
: n* y. p: l3 G% `' r. D, v - {$ y' u/ Q4 U& z
- OLED_SCLK_Set();$ K- N% T7 d" K# C" X' r
- Delay(1);, }7 g/ w0 k" J: s4 O6 V. Y/ {/ W
- OLED_SDIN_Clr();# G5 o( U2 [2 ]
- Delay(1);! Q- u8 q& W; D. V" B
- OLED_SDIN_Set();2 M/ w7 c4 g+ F
- Delay(1);, A" t" L; k( c; W. a: x- h9 t
- }
' N b: W( C5 c) r4 z1 L! B6 Y
F. K- y. @! v. P J. q- void IIC_Wait_Ack()
% F( U5 G2 Z% N% z3 L! h! W* y - {
0 W- i' Z! k \% i: d - OLED_SCLK_Set();" F$ M' r& @, b- X/ l
- Delay(1);
! z% u- z$ R' `5 Y - OLED_SCLK_Clr();
: o' `2 w* L6 w$ m. H - Delay(1);
4 c" j4 u6 t' G4 F( p$ m - }
复制代码 + k, N3 J# G9 I0 X
实现下图显示效果的主程序为: - int main(void)
) P1 D m1 \, } - {6 A3 U6 W. U0 i7 v) y$ g6 Y
- HAL_Init();( J- ^( e3 e2 ^% Q4 A, g& A0 ^
- SystemClock_Config();
/ d7 ~. W m/ N; b7 l- o - GPIO_OLED_INIT();
/ ~7 d# K9 z7 n! U' |) P' D - OLED_Init();
6 E% n6 ]: W1 N J - OLED_Clear();
5 V" E ], n$ g7 Z0 B) N% `( X - OLED_ShowString(10,2,"STM32G431",16);* L+ x. j. F# i& B$ k8 ^6 l
- OLED_ShowString(10,4,"OLED TEST",16);
7 {2 w E/ y0 v - OLED_ShowCHinese(79,2,9);; F1 G: _$ j( v) }. c0 `0 [( }
- OLED_ShowCHinese(95,2,10);
3 j# r) B& @3 W" I2 L6 R - OLED_ShowCHinese(111,2,11);3 V+ A8 G5 B0 [5 H! G7 }3 G5 }
- while (1);
& r' y- P# r& M3 l. \ - }
复制代码 " T7 n- s" W9 I5 p: {# ^' n& n
* Z8 K4 I5 ]! l P+ B3 t
OLED屏显示效果 ; s6 l1 e. [& B$ W/ X: d, i+ A
* l0 b# D* X1 r
|
感谢支持!!!