实验1:点亮LED
实验2:按键控制LED
实验3:外部中断检测按键
实验4:扩展芯片检测按键
实验5:定时器实现LED闪烁
实验6:基于PWM的呼吸灯
实验7:检测输入的PWM频率和脉宽
实验8:串口的输入和输出
实验9:串口使用PRINTF函数
实验10:SPI接口操作片外FLASH
实验11:SPI接口操作TF卡
实验12:IIC接口操作OLED屏幕
实验13:ADC电压采样
本实验使用STM32自带的ADC对外部电压进行采集,同时使用DMA将采集到的数据搬运到指定的数组,然后通过串口printf函数打印出来。如图,为板上使用的高精度旋钮式电位器。
通过ADC12_IN0,也就是PA0,送入单片机进行采样。
步骤如下:
1、新建工程,进行基本配置。通过点击“ACCESS TO MCU SELECTOR”来创建一个新的工程:
参照实验1,芯片选择“STM32F103C8”。
打开外部时钟,点击“System Core”,选择RCC,在右侧弹出的菜单栏中选择“Crystal/Ceramic Resonator”。
选择调试接口,点击“System Core”,选择RCC。,在右侧弹出的菜单栏中选择“Serial Wire”。
2、ADC配置。先是是AD采样相关的参数,如图:
然后是DMA相关的配置,如图:
3、串口配置。参照实验9配置即可。
4、时钟配置。参照实验1.
5、生成工程。参照实验1的步骤7,进行相应配置,生成工程文件。
6、串口printf。参照实验9,添加相关函数与头文件。
7、定义数组与变量。用来存储ADC采集的值和最终计算得到的值。
代码:
__IO uint32_t ADC_ConvertedValue[20];
__IO float ADC_Volt;
8、开启ADC。启动ADC的DMA工作方式,并计算采集到的电压值,然后通过串口打印出来。
代码:
HAL_ADC_Start_DMA(&hadc1,ADC_ConvertedValue,20);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
for(i = 0; i < 20; ++i)
{
ADC_Value += ADC_ConvertedValue[i];
}
ADC_Value = ADC_Value / 20;
printf("ADC Value %d\r\n",ADC_Value);
printf("vol %f\r\n", ADC_Value * 3.3 / 4096);
HAL_Delay(2000);
}
修改后,保存,编译、下载,重新上电。使用串口助手连接板子和电脑,可以看到串口助手收到打印信息。
整个过程有PPT、数据手册、原理图、源码、相关软件,在公众号(单片机爱好者)回复关键词:002或者STM32CUBEMX教程,即可获取下载链接。
为什么大家都开始搞cube了,那玩意生成的代码,编译器来真费劲,不断的封装,不知道什么原因ST不维护以前的库了。
可能自动生成的比较方便吧~