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% j% w$ M- @- B1 F3 p( ^, h8 A) J) x
STM32G431开发板的周边外设比较少,为了便于人际交互最先考虑的是为其配上一个显示屏,以利于信息的观察。 为了较少地占用系统资源,这里采用的是I2C接口的双色OLED屏,考虑到STM32G431开发板配有Arduino接口,就将OLED屏放到Arduino接口上来使用,从而能够不必连线就解决问题。 & V3 F3 z* a2 u5 @
OLED屏与MCU大的连接关系为: SCL---PA5 SDA---PA6 0 L5 W0 B& _+ h- A& A
控制相关引脚输出高低电平的语句定义为: #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) 1 B) X5 t- R) F
#defineOLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_RESET)
! ]3 r, F$ s3 p7 U$ t' R5 f
实现引脚输出功能配置的函数为: - void GPIO_OLED_INIT(void): \/ E( a3 A- j. H0 y! ?9 U# \5 W# w( J
- {+ o7 t% U7 R/ t4 ^7 ]9 S7 z
- __HAL_RCC_GPIOA_CLK_ENABLE();
* F& p% o* \/ _& k5 G - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
0 d. J h* }, i# d3 n- U - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;$ U1 V, o% A- a$ s u z
- GPIO_InitStruct.Pin = GPIO_PIN_5;( s* {! i( T0 q3 f( i7 J' f+ E
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
0 T! p) b, I/ |1 Q9 n) c0 L1 } - GPIO_InitStruct.Pin = GPIO_PIN_6;
4 I! N7 c6 x2 l8 [) `3 J5 w9 e - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);% D. M' j8 x) Q4 z$ y
- }
复制代码
! e% w9 {) D M% Q9 R w由于STM32G431的主频速度比较高,故直接移植程序代码是有问题的,需要添加相应的延时函数来辅助解决。 修改后的辅助显示函数为: - void IIC_Start()! B& S0 q) ]2 r+ A4 C& P
- {/ J6 o0 G6 Y: q. d% p$ A6 I
- OLED_SCLK_Set();# ]9 H& y/ K2 k- u& Z
- Delay(1);
+ H7 Z# V" _ r- S - OLED_SDIN_Set();
2 e( K0 X, |+ ^4 X% `4 d - Delay(1);) Y! |* u7 B+ d+ v6 B! Y6 X
- OLED_SDIN_Clr();8 e" V& H# N6 m8 o y! k5 `* r" d
- Delay(1);
* ^( V+ k' S4 y( z: s/ N) ~ - OLED_SCLK_Clr();6 W! Q% C6 L1 L- e/ K" L( c6 Q% ~& z
- Delay(1); C0 q1 U( o) [1 c
- }
4 [/ Q# `5 e4 a! e& @8 O - 2 h6 G' ?: T8 W
- void IIC_Stop()
/ D$ Z" Y! W; C7 s/ M3 Y1 F - {
6 Q0 D. j% L: S3 { - OLED_SCLK_Set();+ e- ^3 l7 Z( c( O( k9 h1 w
- Delay(1);; L3 ~9 a2 H9 E, ]& ^0 |9 t$ @/ u
- OLED_SDIN_Clr();
5 h, ?" }* {* v, V j1 S - Delay(1);
$ U/ P" ^+ {3 l. P1 Y) d. @ - OLED_SDIN_Set();
* [6 G5 { q# j+ O! L$ V' j - Delay(1);- g: O8 }) r @ ?8 N/ `
- }) ]9 o! i; V# q
- 0 R( P- [1 ?- i/ ^! E( U
- void IIC_Wait_Ack()$ J: ` n. M5 s3 w3 z: V; ]7 [( ^
- {$ M/ C* [+ A9 M4 @, z S6 o6 |
- OLED_SCLK_Set();, e5 W& S' q5 Y2 N" U1 S9 C
- Delay(1);
/ s& m2 m. z! p4 T( V - OLED_SCLK_Clr();
/ V1 D9 f3 J1 ~) \. q7 O7 F3 p - Delay(1);
! ^8 R3 N5 M' {) ] - }
复制代码 # W, y5 ?3 a5 Z' H
实现下图显示效果的主程序为: - int main(void)
2 |* z; d' [* ]1 q0 Q - {, m5 b& r3 u; N) l" p2 s( L
- HAL_Init();8 c/ K$ w( p9 o2 J* L9 M( u
- SystemClock_Config();: g% X1 f* \2 X3 t6 J* w1 Q; F! }: o( q
- GPIO_OLED_INIT();
5 K" ]& {9 _$ l4 W' X$ k5 b# d2 B - OLED_Init();
_8 I! b3 d8 t - OLED_Clear();' X) ?9 I$ i- M" w- u8 ~
- OLED_ShowString(10,2,"STM32G431",16);: T4 b" Q" L& F7 i @7 _& k/ w2 P
- OLED_ShowString(10,4,"OLED TEST",16);
# V2 f! P7 n/ h9 e - OLED_ShowCHinese(79,2,9);
- [8 m# O7 e; ?; o: ~& e: r - OLED_ShowCHinese(95,2,10);% N. D4 ^1 `5 t* l2 ~6 d
- OLED_ShowCHinese(111,2,11);+ d: j* a- P1 Q, {; t6 z4 _
- while (1);! J+ M) L* E; h% {
- }
复制代码
, v# L, l6 W/ f( J5 I. v& P e8 q; |1 K
OLED屏显示效果
; |; N) H/ [7 L: |* h9 b8 B) [ % P1 L( p6 K- R! X8 H
|
感谢支持!!!