|
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 引脚。 2 t/ l1 e! a8 R% z
" n+ n" I H( A! D+ n% I+ R, R
STM32G431开发板的周边外设比较少,为了便于人际交互最先考虑的是为其配上一个显示屏,以利于信息的观察。 为了较少地占用系统资源,这里采用的是I2C接口的双色OLED屏,考虑到STM32G431开发板配有Arduino接口,就将OLED屏放到Arduino接口上来使用,从而能够不必连线就解决问题。 9 z7 B0 C; x6 n$ d
OLED屏与MCU大的连接关系为: SCL---PA5 SDA---PA6
9 E2 x% ^5 ]; I5 v2 X1 s0 h
控制相关引脚输出高低电平的语句定义为: #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) r$ p0 n2 i- {- Q2 g9 V
#defineOLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_RESET)
. ]" `, M' I9 L& |
实现引脚输出功能配置的函数为: - void GPIO_OLED_INIT(void)3 P5 X- p8 Q$ L
- {
9 R! h3 u# g ?8 H7 l+ V - __HAL_RCC_GPIOA_CLK_ENABLE();" G8 L8 \ d8 T" m
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
/ }) K" G+ j' U, u! {# Z! ~ - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
" b* I5 V. V: } - GPIO_InitStruct.Pin = GPIO_PIN_5;; U0 ]: D' l2 {9 u8 N
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
5 U3 `% i( Y9 U+ \; g* A4 L/ M - GPIO_InitStruct.Pin = GPIO_PIN_6;4 G* W, K+ A6 U1 U9 N% g
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);: J" V( n3 R$ u2 }
- }
复制代码
: ?$ x0 ^, G1 C由于STM32G431的主频速度比较高,故直接移植程序代码是有问题的,需要添加相应的延时函数来辅助解决。 修改后的辅助显示函数为: - void IIC_Start()
* p' s4 K' a* G+ Z. `3 ~" @- M - {+ x. [8 V& q& p+ b/ `0 Q# K" v; j
- OLED_SCLK_Set();
3 Y$ J, k" C1 {+ ~0 ~ - Delay(1);7 n! E8 d# G# Q7 N
- OLED_SDIN_Set();
% ^4 b: ~& }$ Y4 q2 R1 @$ E7 s - Delay(1);9 N! J2 ]& B+ }+ o' o; [- H
- OLED_SDIN_Clr(); D- o# l) l N7 U* e3 O
- Delay(1);) {, }1 X9 O4 K( d/ j, i
- OLED_SCLK_Clr();
, U- _- c9 W5 d" M - Delay(1);
% [, y9 n1 M% G4 R0 ~ - }
f! l" |3 g( a. u5 E! u3 E+ k - ( E9 ~+ ~7 v* R( O
- void IIC_Stop()
. H% ]. A+ ?: t$ M( ~ - {
' ?4 \* c# g* X) V2 o - OLED_SCLK_Set();4 z d9 o6 z. N3 w6 x2 \' s) l
- Delay(1);
5 C( g- H) H& H - OLED_SDIN_Clr();
1 P; _8 Q) [- k% a; h - Delay(1);
7 P3 o8 k% ]- A+ G% F. f+ _ - OLED_SDIN_Set();& b1 C% L2 t, w% v/ x
- Delay(1);2 p# [1 T. I1 F8 ~
- }
; B2 ~4 w; j8 H$ b2 S# }9 R6 W6 Z
4 |; t5 M& J5 p# z5 c7 ~% C- void IIC_Wait_Ack()
. Z" X( B# |! d* F- y5 a& ~. _ - {
; |: \; L* H2 D- x - OLED_SCLK_Set();! d/ b" ^% ?5 r0 l8 _$ ]/ G
- Delay(1);
7 f% N6 I( q: F. l1 c9 V, ` - OLED_SCLK_Clr();. u P$ T6 D- a$ U
- Delay(1);
. P& d7 w0 T6 b5 ]* Z6 B - }
复制代码 1 b6 x9 K2 }- [& M2 h
实现下图显示效果的主程序为: - int main(void)2 W% S& M( E5 A3 e" W. }
- {
# s% K, P2 l7 g2 P( ~& A" V - HAL_Init();
/ j5 w* _ [) c7 F5 r - SystemClock_Config();: z" @+ O1 y* ?, ^) ]: g+ W
- GPIO_OLED_INIT();0 m2 \, ] S6 V) k% o: @8 X) F5 @+ j
- OLED_Init();
: Q- z. W. e4 {+ W! U5 C - OLED_Clear();
/ |: v# o' z5 ^3 i! L/ q - OLED_ShowString(10,2,"STM32G431",16);+ Y. _+ R( r' o+ J, C' W- U
- OLED_ShowString(10,4,"OLED TEST",16);/ _. I( \! K7 Y& g2 r, V5 [' r
- OLED_ShowCHinese(79,2,9);' M9 `' a) l' L2 |* |
- OLED_ShowCHinese(95,2,10);
2 f& b" }" p; l6 n4 P9 n - OLED_ShowCHinese(111,2,11);3 r/ \; O* Y1 S; p6 W$ S
- while (1);
f( g V# X1 I$ M/ N - }
复制代码 1 I" S5 H( f/ m! T9 O- ]% h3 d- O
& S+ y3 b) k; L# b* ]# C2 dOLED屏显示效果
$ y/ z; U7 o G' Y5 t. n
0 K! V1 A( C7 ~6 n9 E6 d |
感谢支持!!!