蓝桥杯物联网竞赛-OLED显示实验(HAL库)
- 1.进入STM32CubeMX选择相应的开发板
- 2.将用于控制OLED的引脚设置为推免输出
- 3.时钟配置选择
- 4.设置名称、选择路径及编程软件、生成代码
- 5.程序配置
- 6.程序补充代码
- 7.实验现象
1.进入STM32CubeMX选择相应的开发板
2.将用于控制OLED的引脚设置为推免输出
PA8和PB4分别为OLED的SCL引脚和SDL引脚,PB5控制OLED的开启与关闭
3.时钟配置选择
4.设置名称、选择路径及编程软件、生成代码
5.程序配置
(1)添加底层驱动文件 (在程序路径下对应的Inc和Src文件夹下) 大赛会提供
(2)在MDK5中添加这些驱动程序
6.程序补充代码
补充的代码主要是图下两个函数
// main.c 补充的函数
#include "main.h"
#include "i2c.h"
#include "oled.h"
#include "stdio.h"
#include "stm32l0xx_hal.h"
#include "string.h"
void Task_BrdInit(void);
void Task_Main(void);
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
Task_BrdInit();
while (1)
{
Task_Main();
}
}
void Task_BrdInit(void)
{
OLED_PowerControl(ENABLE);
HAL_Delay(200);
OLED_Init();
OLED_Clear();
OLED_ShowString(0, 0, (unsigned char *)" ", 16);
OLED_ShowString(0, 2, (unsigned char *)" ", 16);
}
void Task_Main(void)
{
char lcdLine_1st_line[16];
char lcdLine_2st_line[16];
sprintf(lcdLine_1st_line, "GXCT IOT ");
sprintf(lcdLine_2st_line, "OLED Test ");
OLED_ShowString(0, 0, (unsigned char *)lcdLine_1st_line, 16);
OLED_ShowString(0, 2, (unsigned char *)lcdLine_2st_line, 16);
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = { 0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0};
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_3;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = { 0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void Error_Handler(void)
{
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif