在STM32F103ZET6核心板进行STM32应用开发,完成以下功能:
①将ADC_IN0设置为12位ADC,右对齐,启用中断。
②分别用查询和中断两种方式,每个0.5S采样一个ADC数据。
③将每次读取到的ADC采样值转换为对应的电压值,发送到上位机。
④LED1作为采样指示灯,在ADC转换过程中亮,其余时间灭。
初接触编程的小白,两年电子生涯给我积累了雄厚的硬件基础,接触编程到今年三月整整一年,51单片机到STM32,当然肯定不是精通,51只是达到会用的程度,主要是通过51熟悉底层编程的思路,因为到了32接触底层的机会越来越少原因是太复杂有难度,现阶段比赛需要没有太多时间详细的去学习,所以没接触过32寄存器,普通的库函数开发也没接触过直接上的HAL库,想要在这个行业有点成绩,忙完了比赛肯定是欠下的都需要补回来的,说实话一开始的时候挺绝望的,但是通过学习发现也不是个学不会的事,追梦人共同加油!
ADC这个学过模电的应该都对他特别熟悉,他真的是无处不在,嗯,关于什么是ADC,几个重要的技术指标,我就不介绍硬件方面的知识了,这个是属于常识性的东西必须得掌握的,不知道的度娘补课了,从STM32的资源说起。
我用的是STM32F103ZET6主控,它里面一共有3个12位逐次逼近型的ADC,ADC1 ADC2 ADC3,有18个测量通道,16+2,可测量16个外部个2个内部信号(内部温度 内部电压),这个2只能接ADC1,然后AD转换可以以单次,连续,扫描和间接形式执行,按照组织来分又分为注入组和规则组,结果存储形式有左对齐和右对齐(建议),这些基本的东西反正我是记住,因为我用的这个主控所以我记得比较明白,其他的我没用过的我也不知道但是每学习一个都需要对你这个主控进行把握正所谓知己知彼百战百胜,不具体展开说反正我感觉东西不少,多用就逐渐记住了。
直接说STM32CubeMX关于ADC对配置,因为底层的东西坦白讲我说不明白,现在只是达到对外设会用的程度,我们进行AD转换肯定是要得到一个结果,HAL库中进行AD转换结果读取的方式有3种,我先介绍2种坦白讲第三种DMA多线程同时采集的我还没会,等会了再补上。
1堵塞式AD转换(查询)
uint16_t ADC_Value = 0;
HAL_ADC_Start(&hadc);//启动哪一个AD转换,通过这个函数告诉它
if(HAL_OK == HAL_ADC_PollForConversion(&handc,10))//转换过程函数&handc转换的AD,10为转换超时时间
{
ADC0_Value = HAL_ADC_GetValue(&handc);//转换成功后就读取这个AD结果
}
2非阻塞式A/D转换(中断)
uint16_t ADC_Value = 0;
HAL_ADC_Start_IT(&hadc);//通过带有中断的函数启动AD转换
void HAL_ADC_ConvCPltCallback(ADC_HandleTypeDef* hadc1);//进入中断回调函数,读取AD转换值
{
ADC_Value = HAL_ADC_GetValue(&handc);
}
然后就可以来做开头那个小题目了,开头那个小题目还用到串口,这部分在这不介绍不会的先度娘吧有时间我在出一个串口的。
HAL库配置使用CubeMX这个软件具体配置我想偷个懒不想粘图就是找到ADC1>INT0然后启用NVIC开启中断,找到UART1->异步通讯->波特率9600也可以115200(和上位机同步)再打开LED的GPIO配置为OUT,初始电平H因为我硬件的原因,开启外部时钟,配置时钟树,生成代码,然后在KEIL中进行个性化开发。
然后核心代码已经贴出。
|