11. 利用PY32Studio+HAL库开发ADC单次多通道扫描采样+中断
前言在第十章中我们扫描方式采集3个通道每个通道要等待其采集完成后才能读取数据等待期间一直处于阻塞状态浪费CPU的时间。本章我们利用ADC的扫描模式中断的方式来采集3个通道大大降低CPU的负载。一、功能我们在上个工程的基础上通过PY32Studio可视化界面修改配置实现芯片内部温度传感器Temperature、内部参考电压Vrefint、1/3的VCC的单次扫描ADC采样无需外接任何硬件电路最后通过串口printf实时打印芯片内部结温、内部参考电压、1/3的VCC。本练习采用单次扫描转换模式中断非连续。二、硬件通过USB转TTL模块连接PC与Startkit板, Startkit板与USB转TTL模块的连线方式如下通过串口将信息发送到串口助手。Startkit 开发板USB转TTL模块Tx(PA0)RxRx(PA1)TxGNDGND三、PY32Studio配置3.1 打开上个练习中创建的工程F032_ADC13.2 配置ADC的参数第一步选择ADC的三个内部通道第二步配置ADC的参数Scan Conversion ModeEnable打开扫描模式单次多通道采样Continuous Conversion ModeEnable关闭连续转换单次触发单次采样Discontinuous Conversion ModeDisable第三步配置ADC的规则转换模式Regular conversion mode和三个通道的转换顺序第四步配置另外两个通道的转换顺序和转换时间第五步使能ADC中断第六步点击生成工程四、编写应用代码4.1 应用代码在PY32Studio生成的代码的基础上添加以下代码修改下面代码中的第7行和第8行增加两个变量adcCompleteFlag和convIndex。/* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ uint16_t adcValue[3] {0,0,0}; //ADC三次转换结果 float VCCA3 0.0; //VCCA/3的电压值Starkit的VCCA默认配置为3.3V, VCCA3 1.1V float Vrefint 0.0; //Vrefint电压值典型值1.2V uint32_t dTemperature 0; //芯片内部温度传感器测量到的温度 uint8_t adcCompleteFlag 0; //转换完成标志位1转换完成0转换未完成 uint8_t convIndex 0; //转换次序 /* USER CODE END PV */在main.c文件中重写ADC转换完成的回调函数/* USER CODE BEGIN 4 */ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) { if(hadc-InstanceADC1) { adcValue[convIndex] HAL_ADC_GetValue(hadc1); //读取转换结果 convIndex; //转换次序加1 if(convIndex 3) { adcCompleteFlag 1; //标记3通道采样转换完成 convIndex 0; //将转换次序归零 HAL_ADC_Start_IT(hadc1); //重新启动ADC转换 } } } /* USER CODE END 4 */在main()函数中在USER CODE BEGIN 2段中加入HAL_ADC_Start_IT(hadc1);启动ADC转换在while1循环中将原来的代码注释掉或者删除换成以下代码判断三次转换是否完成如果转换完成将转换的结果转化为温度值VrefintVCCA/3打印转换结果将转换完成标志位清零int main(void) { /* USER CODE BEGIN 1 */ ADC_ChannelConfTypeDef sConfig {0}; //定义ADC通道配置的结构体 /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ Studio_RCC_Init(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ Studio_GPIO_Init(); Studio_UART1_Init(); Studio_ADC1_Init(); /* USER CODE BEGIN 2 */ HAL_ADC_Start_IT(hadc1); //启动ADC转换采用中断方式。 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while(1) { if(adcCompleteFlag 1) { VCCA3 adcValue[0] * 0.0008; //计算VVCA/3的电压值 adcValue * VCCA/4096 printf(VCCA/3 is %.3f V. \r\n,VCCA3); Vrefint adcValue[1] * 0.0008; //计算Vrefint的电压值 adcValue * VCCA/4096 printf(Vrefint is %.3f V. \r\n,Vrefint); dTemperature __HAL_ADC_CALC_TEMPERATURE(TEMPSENSOR_CAL_VREFANALOG, adcValue[2], ADC_RESOLUTION_12B); //通过测量的电压计算温度 printf(Temperature is %d C.\r\n,(int)dTemperature); adcCompleteFlag 0; } HAL_Delay(1000); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }4.2 设置在选项卡中选择安装的编译器版本和Debug类型。4.3 编译下载点击编译图标开始编译程序编译成功后开始下载程序下载成功后开始调试程序4.4调试点击调试图标进入调试界面运行程序把adcValue、VCCA3、Vrefint、dTemperature四个变量加到Watch1窗口中。在View菜单中选择Periodic Window Update命令全速运行代码观察这几个变量的值。打开串口助手选择正确的端口名波特率数据位校验位和停止位打开串口开始接收数据。右面的窗口可以显示出从MCU发送过来的数据。五、总结本章内容我们采用单次扫描采样的中断方式每个通道转换结束以后在中断回调函数中读取该通道的转换结果所有通道采样结束后再计算相应的电压值或温度值并轮流打印计算结果。整个过程主要步骤如下通过PY32Studio配置时钟UART1, ADC1模块在uart.c文件中包括stdio.h头文件重写fputc函数在main.c文件中定义全局变量并且初始化: adcValue、VCCA3、Vrefint、dTemperatureadcCompleteFlagconvIndex在中断回调函数中读取每次转换的结果三次转换完成后将转换完成标志位置位并再次启动转换在while(1)循环中判断转换是否完成计算温度值或电压值打印温度值或者电压值调试代码在串口助手中观察打印出的变量的值。

相关新闻

插件加载失败排查指南:IAR、MusicFree与web boot问题全解析

插件加载失败排查指南:IAR、MusicFree与web boot问题全解析

最近很多人搜 "plugins",搜出来的东西很有意思:有人问 "iar plugins 是干什么的",有人贴出 "failed to load plugins web boot: 2 entries did not activate" 这种报错,还有人琢磨 "musicfree…

2026/10/4 19:59:53 阅读更多 →
概率论与数理统计核心概念与工程应用实战手册

概率论与数理统计核心概念与工程应用实战手册

概率论与数理统计是数据分析、机器学习、风控模型这些方向绕不开的地基。说实话,我在刚接触这门课的时候也觉得很抽象,样本空间、分布函数、极大似然估计这些东西到底在干啥,和写代码有什么关系?直到后面真正做A/B测试、搭推荐系统…

2026/10/4 19:59:53 阅读更多 →
C#超市管理系统实战:WinForms+SQL Server数据库附加与部署全攻略

C#超市管理系统实战:WinForms+SQL Server数据库附加与部署全攻略

简介:基于C#与SQL Server 2008的超市管理系统,完整提供项目源码和数据库文件,是一份可用于课程设计、毕业设计或C#数据库开发入门实践的优质资源。系统面向中小型超市的日常运营,覆盖商品管理、采购管理、销售管理、会员管理、库存…

2026/10/4 19:59:53 阅读更多 →

最新新闻

K3这波操作,AI圈沸腾了,华尔街失眠了:MoE+KDA开源模型实测与TaoToken接入

K3这波操作,AI圈沸腾了,华尔街失眠了:MoE+KDA开源模型实测与TaoToken接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 21:36:48 阅读更多 →
ChatGPT Codex试用心得:从github PR到dotnet项目的TaoToken接入实录

ChatGPT Codex试用心得:从github PR到dotnet项目的TaoToken接入实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 21:36:48 阅读更多 →
别再背八股了!Java面试官真正想听的是这些

别再背八股了!Java面试官真正想听的是这些

面试了上百个Java后端,我发现一个扎心的现象:很多人能把八股文背得滚瓜烂熟,可一旦追问“为什么”,立刻哑火。问他HashMap,他能背出负载因子0.75、红黑树阈值8,可问他“为什么是0.75不是0.8”,答…

2026/10/4 21:36:48 阅读更多 →
基于Node.js与React构建本地AI智能体:paperclip架构与OpenClaw部署实践

基于Node.js与React构建本地AI智能体:paperclip架构与OpenClaw部署实践

1. 项目缘起与核心定位第一次看到 "paperclip" 这个标题,加上关联的 Node.js、React、AI agents、OpenClaw 这几个词,我脑子里第一反应是:这大概率是一个用 Node.js 做运行时、React 做交互层、面向 AI 智能体(AI agent…

2026/10/4 21:35:47 阅读更多 →
Codex CLI 接入 MCP Server 实战:用 Ace Data Cloud 统一管理多个 AI 工具

Codex CLI 接入 MCP Server 实战:用 Ace Data Cloud 统一管理多个 AI 工具

1. 为什么我要折腾这个:从“能聊天的终端”到“真的能干活的工作台”Codex CLI 装好之后,最大的感受是:这家伙本质上是一个跑在终端里的 AI 助手,不是玩具。别管你用的什么模型,它能读你的仓库、能执行命令、能改代码、…

2026/10/4 21:35:47 阅读更多 →
从CRUD到架构师,后端进阶路线全解析

从CRUD到架构师,后端进阶路线全解析

很多后端开发者的日常,是写接口、改字段、修Bug,日复一日地CRUD。有人三年成为团队核心,有人五年仍在原地踏步。差距不在加班时长,而在于是否完成了从“功能实现者”到“系统设计者”的思维跃迁。从CRUD到架构师,需要跨…

2026/10/4 21:35:47 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →