STM32CubeMX环境配置
1 ADC1配置
选中ADC1,然后勾选IN0,其余设置均默认不变(此为单次扫描,若是连续扫描,只需要将上图中的Continuous Conversion Mode由Disabled变为Enabled即可)。
2 RCC及时钟配置
选中RCC,然后在HSE一栏选择Crystal/Ceramic Resonator。
接着是时钟配置,和之前实验一样的配置方法,这里不再赘述。
3 SYS配置
SYS界面,在Debug里选择Serial Wire。(选择使用SWD协议下载和调试)
4 I2C配置
选择I2C1,然后选择I2C,其余配置默认不变。
5 芯片引脚图展示
配置完所有环境后,引脚图大致是图片所展示的。
Keil 环境配置
1 OLED配置
详细操作可以参考老师的这个博客
解压完老师的OLED_IIC压缩包,将OLED_Classic文件夹中的OLED.c放入Core文件夹下的Src中
将OLED_Classic文件夹中的OLED.h和OLED_Font.h放入Core文件夹下的Inc中
然后在Keil中按照图示操作(上面两张图片)添加OLED.c文件即可
2 代码修改
头文件添加#include "oled.h"。
HAL_StatusTypeDef HalState; //HAL库函数返回状态
uint16_t Ret; //返回值
uint16_t ADValue; //AD转换值
float Voltage; //电压值
void SystemClock_Config(void);上方添加这段代码。
uint16_t StartAndGetOneResult(){HAL_ADC_Start(&hadc1); //启动ADC转换HalState= HAL_ADC_PollForConversion(&hadc1, 10);//等待转换完成if(HalState == HAL_OK){Ret=HAL_ADC_GetValue(&hadc1); //获取ADC转换结果} else{Ret=0;}//HAL_ADC_Stop(&hadc1);return Ret;
}
void SystemClock_Config(void);下方添加这段代码。
OLED_Init(); //OLED初始化
/*OLED显示*/
OLED_ShowString(1,1,"ADValue:");
OLED_ShowString(2,1,"Voltage:0.00V");
main函数while循环上方添加这段代码。
ADValue= StartAndGetOneResult(); //启动ADC转换并获取结果OLED_ShowNum(1,9,ADValue,4); //显示AD转换值Voltage=(float) ADValue/ 4095 *3.3; //计算电压值OLED_ShowNum(2,9,(uint32_t)Voltage,1); //显示电压值整数部分OLED_ShowNum(2,11,((uint16_t)(Voltage * 100)) % 100,2); //显示电压值小数部分HAL_Delay(100);
main函数while循环里面添加这段代码。
最终界面图如下面两张图所示
结果图展示
每一次随着电位器旋转,OLED屏幕上显示的电压值会发生变化。共有六种电压值情况。
(电位器有三个引脚,一个引脚接GND,一个引脚接3.3V,另外一个接ADC通道PA0,简单的排列A(3,3)即可得到电压值的种数)
以上展示的是其中的一种情况。
参考资料:
用HAL库改写江科大的stm32入门-7-1 ADC
用HAL库改写江科大的stm32入门例子4-1 OLED
作者:计科224尹伦能