本来先做了OLED的测试,后来在PPT上看到有一个基础任务1,LED定时反转,那就增加一个定时反转。
省流版:
一、定时器控制LED反转;
二、OLED显示汉字。
在做OLED显示的过程中,遇到的问题及解决方法:
1、模拟IIC控制时,GPIO输出模式设置问题:知道IIC是开漏输出,所以开始设置GPIO输出模式为上拉输出,结果不显示。通过读例程代码,发现是推挽输出。修改GPIO输出模式为推挽;
2、时钟设置:修改GPIO为推挽输出后,依然不亮。后来读代码,发现里面有Delay函数。突然想到,使用的例程是F103系列的芯片,主频是72MHz,现在使用的是F411,主频变高了。后来把主频改到72MHz,OLED顺利点亮。后来测试了一下OLED可以支持的最高主频,83MHz可以点亮,84MHz就太快了。
下面是具体过程。
1、打开STM32Cube MX,选择 通过MCU创建工程
2、找到STM32F411RET6,双击;
3、基础设置
(1)调试方式
(2)时钟,由于没有焊接外部时钟,这一步可使用默认值;
(3)GPIO设置:
通过电路图可知,LED连接PA5;
IIC可自定义,本次使用PC10、PC11。
都设置为推挽输出。
4、定时器设置,本次使用TIM3(本来想使用TIM2呢,结果一看,32位的,太浪费了);
设置时钟源,分频系数,计数值,使能自动重装载,使能TIM3中断。
5、时钟树配置,设置主频位72MHz;
6,项目管理设置(项目名称和保存路径要是英文和数字,不能出现中文,否则不能自动打开工程)
7,打开工程,编写代码。
1、LED代码
main函数内,打开定时器
HAL_TIM_Base_Start_IT(&htim3);
中断函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim == &htim3) HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5); }
2、OLED代码
1)增加OLED文件夹
2)、复制网上找的STM32F103代码到相应文件夹
3)、更改宏定义,适配自己的接口,PC11 为SCLK,PC10为SDIN
#define OLED_SCLK_Clr() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11, GPIO_PIN_RESET)//CLK #define OLED_SCLK_Set() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11, GPIO_PIN_SET) #define OLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10, GPIO_PIN_RESET)//DIN #define OLED_SDIN_Set() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10, GPIO_PIN_SET)
4)、main文件显示
main函数中
OLED_Init();
循环函数中显示内容
OLED_ShowChinese(0,0,0,16); OLED_ShowChinese(16,0,1,16); OLED_ShowChinese(32,0,2,16); OLED_ShowChinese(48,0,3,16); OLED_ShowChinese(64,0,4,16); OLED_ShowChinese(80,0,5,16); OLED_ShowChinese(96,0,6,16); OLED_ShowChinese(112,0,7,16); OLED_ShowChinese(0,16,9,16); OLED_ShowChinese(16,16,10,16); OLED_ShowChinese(64,16,11,16); OLED_ShowChinese(80,16,12,16); OLED_ShowChinese(0,32,13,16); OLED_ShowChinese(16,32,14,16); OLED_Refresh();
显示结果:
显示完结果,发现一个问题:
参考别人的,是在主函数初始化中可以显示,我的不行,必须在while循环中显示。后面再研究研究