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" I9 \6 \+ i2 M# l/ o. O
! y Z5 ~* C% [STM32G431开发板的周边外设比较少,为了便于人际交互最先考虑的是为其配上一个显示屏,以利于信息的观察。 为了较少地占用系统资源,这里采用的是I2C接口的双色OLED屏,考虑到STM32G431开发板配有Arduino接口,就将OLED屏放到Arduino接口上来使用,从而能够不必连线就解决问题。 0 O9 G. i- N ^4 B* E! c
OLED屏与MCU大的连接关系为: SCL---PA5 SDA---PA6 7 N+ l3 a- B- _2 t; 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)
4 G8 x' n( j8 Z+ I2 R: c9 O#defineOLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_RESET) 7 I N4 L# f: l5 N7 b6 h: x' E7 [7 Q
实现引脚输出功能配置的函数为: - void GPIO_OLED_INIT(void): C6 o" b" _; P& L7 u: H+ Q0 p
- {* w) M' Z) |+ G* K
- __HAL_RCC_GPIOA_CLK_ENABLE();: X3 S8 U4 `1 j3 `
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
; v) N- N* X# D8 f - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
8 l4 \0 v* z$ ]( r6 t) j - GPIO_InitStruct.Pin = GPIO_PIN_5; y7 A, S2 N# |$ m; o, T! K
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
7 z3 V* {$ w2 J5 I* v' k - GPIO_InitStruct.Pin = GPIO_PIN_6; Q3 l# \2 U5 X3 f! o+ E
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);& ~/ Z1 }0 _7 F/ ]: C5 j A6 n3 p
- }
复制代码 # u- u) A* [5 ]9 A* F, {% _. X* P
由于STM32G431的主频速度比较高,故直接移植程序代码是有问题的,需要添加相应的延时函数来辅助解决。 修改后的辅助显示函数为: - void IIC_Start()) F9 H0 H2 {1 j
- {: ]6 C1 u5 w( N; |6 w
- OLED_SCLK_Set();
) m; t4 ]0 r- r9 V: Q @ W - Delay(1);
! q, p3 y. ~$ C - OLED_SDIN_Set();
5 I4 \. N- s) c$ u - Delay(1);
# I+ R4 o8 V, a6 ^: T$ c - OLED_SDIN_Clr();+ m4 e W t0 k- B+ ?
- Delay(1);! @1 \0 E8 M9 L
- OLED_SCLK_Clr(); N) Z+ |- \/ p7 x3 ~ V1 j
- Delay(1);: x# v( ^3 I6 K0 D
- }5 B; @! Z1 N& o' t- r- R- f. W" u
9 J9 N) x$ P1 {+ |; e6 l- void IIC_Stop()5 `' ^7 H& R' j2 |6 [) E
- {
0 j0 U# [; U/ e- u! R* L2 b - OLED_SCLK_Set();
. H* X Z1 O3 t) q0 P5 E - Delay(1);
0 G% |( R0 D8 W- C- x - OLED_SDIN_Clr();5 ?4 q7 [6 i- |
- Delay(1);" |, w' E6 I- @7 B
- OLED_SDIN_Set();7 n, ~. E5 D3 N8 F! a
- Delay(1);
/ z& W/ l+ S. A( j" E0 @ - }
/ Q( {3 G6 F- t- w - 3 Q/ R: L. |" N8 W- N8 v* ^# ]; [
- void IIC_Wait_Ack()
+ t8 p4 e% C0 b - {
! s6 s# ]4 l# D# m3 u+ j! U - OLED_SCLK_Set();. e" p; N' n: z4 T
- Delay(1);0 L0 c- [* j I8 s
- OLED_SCLK_Clr();
- ?4 q' X, g7 f! | - Delay(1);
B# L+ b! H( b& k) _4 X+ E" b# B - }
复制代码
2 n" h" F4 |& C; g实现下图显示效果的主程序为: - int main(void)& @& ?$ ?$ J6 L' ]% q% P
- {
% R9 W2 @0 X- b$ X7 B! j+ Q - HAL_Init();
# ^8 B3 V3 I1 W5 O' i& ?4 N4 q - SystemClock_Config();. K3 @2 U y ^% |4 t
- GPIO_OLED_INIT();8 Y. c, m9 f i& B: q5 h# I9 P
- OLED_Init();3 p# e( d) k- t9 F7 q
- OLED_Clear();2 P0 y1 U8 {" ?% y
- OLED_ShowString(10,2,"STM32G431",16);
% {6 u+ @. p* E - OLED_ShowString(10,4,"OLED TEST",16);4 E7 U4 A3 K |" h$ U2 r
- OLED_ShowCHinese(79,2,9); B/ y4 J3 c) H! B- R8 H6 [0 D
- OLED_ShowCHinese(95,2,10);; T$ d/ g. M0 X- p
- OLED_ShowCHinese(111,2,11);( ]2 {5 d) G w# D. T0 ~
- while (1);6 O/ y0 Y- l/ z( Z" J9 e, k+ Z
- }
复制代码
; Q# N* z, M! K. \+ y, I
" Q; l, _( t/ ^ c, [1 FOLED屏显示效果
0 N5 e9 }4 K6 B) E 6 b1 V7 K! a1 o% K; A- L; R
|
感谢支持!!!