本帖最后由 jinglixixi 于 2020-12-8 15:52 编辑
STM32G431开发板的周边外设比较少,为了便于人际交互最先考虑的是为其配上一个显示屏,以利于信息的观察。 为了较少地占用系统资源,这里采用的是I2C接口的双色OLED屏,考虑到STM32G431开发板配有Arduino接口,就将OLED屏放到Arduino接口上来使用,从而能够不必连线就解决问题。 OLED屏与MCU大的连接关系为: SCL---PA5 SDA---PA6 控制相关引脚输出高低电平的语句定义为: #define OLED_SCLK_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_SET) #define OLED_SCLK_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_RESET) #define OLED_SDIN_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_SET) #define OLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_RESET) 实现引脚输出功能配置的函数为: - void GPIO_OLED_INIT(void)
- {
- __HAL_RCC_GPIOA_CLK_ENABLE();
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- GPIO_InitStruct.Pin = GPIO_PIN_5;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_6;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- }
由于STM32G431的主频速度比较高,故直接移植程序代码是有问题的,需要添加相应的延时函数来辅助解决。 修改后的辅助显示函数为: - void IIC_Start()
- {
- OLED_SCLK_Set();
- Delay(1);
- OLED_SDIN_Set();
- Delay(1);
- OLED_SDIN_Clr();
- Delay(1);
- OLED_SCLK_Clr();
- Delay(1);
- }
- void IIC_Stop()
- {
- OLED_SCLK_Set();
- Delay(1);
- OLED_SDIN_Clr();
- Delay(1);
- OLED_SDIN_Set();
- Delay(1);
- }
- void IIC_Wait_Ack()
- {
- OLED_SCLK_Set();
- Delay(1);
- OLED_SCLK_Clr();
- Delay(1);
- }
实现下图显示效果的主程序为: - int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- GPIO_OLED_INIT();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(10,2,"STM32G431",16);
- OLED_ShowString(10,4,"OLED TEST",16);
- OLED_ShowCHinese(79,2,9);
- OLED_ShowCHinese(95,2,10);
- OLED_ShowCHinese(111,2,11);
- while (1);
- }
OLED屏显示效果
涉及的字符串显示函数为: - void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
- {
- unsigned char j=0;
- while (chr[j]!='\0')
- { OLED_ShowChar(x,y,chr[j],Char_Size);
- x+=8;
- if(x>120){x=0;y+=2;}
- j++;
- }
- }
有了OLED屏的显示功能,后面以RTC实现一个电子时钟也就方便一些了。
|