STM32开发实战系列6-数模转换器ADC(多通道)
1.目标
利用ADC采集按键以及光照传感器的数据,并在按键中断处理程序中打印采集的结果。
按键和光照分别采集,2个通道,这样实现多通道的试验。
1.1多通道采集原理
通过CubeMX设计界面配置ADC的多个通道,并且设置采集顺序,配置号寄存器后。
ADC的DR寄存器只有一个,要采集多个通道,会根据配置按顺序一个一个的进行采集。
在执行采集获取数据时,需要注意要判断寄存器状态,是否已经采集完成。
1.2原理图
2.工程代码实现
2.1.CubeMX中创建工程
新建Project,选择MCU型号。在Pin视图进行配置,如图:
RCC打开为Crystal/Ceramic Resonator模式,使用外部晶振,让CPU工作的更快
串口1打开,用来输出printf的内容,配置波特率115200
PA8是按键信号,开启中断,当按下按键开始采集
PA1是光照引脚开启ADC模式,
PA4是按键的ADC输入引脚,可以判断五向按键是按键的被按下
完成后生成工程代码,需要选择ARM-MDK的IDE工程
2.2.Keil工程代码
在打开的工程中的文件夹Application\MDK-ARM\startup_stm32f051x8.s中找到终端调用函数EXTI4_15_IRQHandler,并调转到具体实现在Core\Src\stm32f0xx_it.c下,这个方法调用了HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);依然是调转到实现,跳转到\Drivers\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_gpio.c,其中又调用了HAL_GPIO_EXTI_Callback(GPIO_Pin);这个是调用中断允许用户可以自定义的函数实现,调转到定义处;有__weak限定符,把这个方法拿到gpio.c中重写实现如下:
/* USER CODE BEGIN 2 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
uint16_t value=0;
if(GPIO_Pin == GPIO_PIN_8)
{
HAL_ADC_Start(&hadc);//Æô¶¯ADC²É¼¯
while(!(hadc.Instance->ISR & (1<<2)));//µÚ¶þλ״̬±íʾEOC£¬±íʾת»»Íê³É
value = HAL_ADC_GetValue(&hadc);
printf("key adc value = %d\n", value);
while(!(hadc.Instance->ISR & (1<<2)));//µÚ¶þλ״̬±íʾEOC£¬±íʾת»»Íê³É
value = HAL_ADC_GetValue(&hadc);
printf("light adc value = %d\n", value);
HAL_ADC_Stop(&hadc);
}
}
首先是用HAL函数库方法启动ADC,
因为是多通道读取,先判断ISR第二位标记,是否已经准备好,如果没有就循环判断,准备好就开始读取。
读取一个后,ADC自动扫描下一个,这里就继续判断状态位,是否采集完成。所以通过两次读取完成,如果是更多的通道也同理可以完成。
最后停止ADC读取,等待下一次按键启动中断再执行。
- 点赞
- 收藏
- 关注作者
评论(0)