当前位置:网站首页>STM32CUBEMX开发GD32F303(11)----ADC在DMA模式下扫描多个通道
STM32CUBEMX开发GD32F303(11)----ADC在DMA模式下扫描多个通道
2022-07-31 02:02:00 【记帖】
概述
本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD32303C_START开发板内进行验证。需要GD样片的可以加Q_QUN申请:615061293。
本章主要配置,双ADC轮询模式扫描多个通道,通过串口进行打印。
查阅手册可以得知,PA9、PA10为串口0的输出和输入口。
视频教学
csdn课程
课程更加详细。
https://download.csdn.net/course/detail/37152
ADC通道配置
ADC1 | IN0(PA0) | IN1(PA1) | IN4(PA4) |
---|
生成例程
这里准备了GD32303C_START开发板进行验证。
STM32CUBEMX配置
勾选中断。
ADC1配置。
- ADCs_Common_Settings:
- Mode:Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选,具体配置 ADC_CR1:DUALMOD 位。
- ADC_Settings:
- Data Alignment:
- Right alignment 转换结果数据右对齐,一般我们选择右对齐模式。
- Left alignment 转换结果数据左对齐。
- Scan Conversion Mode:
- Disabled 禁止扫描模式。如果是单通道 AD 转换使用 DISABLE。
- Enabled 开启扫描模式。如果是多通道 AD 转换使用 ENABLE。
- Continuous Conversion Mode:
- Disabled 单次转换。转换一次后停止需要手动控制才重新启动转换。
- Enabled 自动连续转换。
- DiscontinuousConvMode:
- Disabled 禁止间断模式。这个在需要考虑功耗问题的产品中很有必要,也就是在某个事件触发下,开启转换。
- Enabled 开启间断模式。
- Data Alignment:
- ADC_Regular_ConversionMode:
- Enable Regular Conversions 是否使能规则转换。
- Number Of Conversion ADC转换通道数目,有几个写几个就行。
- External Trigger Conversion Source 外部触发选择。这个有多个选择,一般采用软件触发方式。
- Rank:
- Channel ADC转换通道
- Sampling Time 采样周期选择,采样周期越短,ADC 转换数据输出周期就越短但数据精度也越低,采样周期越长,ADC 转换数据输出周期就越长同时数据精度越高。
- ADC_Injected_ConversionMode:
- Enable Injected Conversions 是否使能注入转换。注入通道只有在规则通道存在时才会出现。
- WatchDog:
- Enable Analog WatchDog Mode 是否使能模拟看门狗中断。当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断。
DMA开启。
生成独立的文件。
keil配置
microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。
代码
在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
函数声明和串口重定向:
/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END PFP */
定义变量,存放采集到的数据。
/* USER CODE BEGIN 0 */
uint32_t ADC1_1, ADC1_2,ADC1_3;//采集的三个通道的ADC
uint32_t ADC1_Value[30];//DMA存放数组
uint8_t i;
uint8_t ADC1_Flag;//dma采集完毕中断
/* USER CODE END 0 */
使能ADC传输。
/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC1_Value,30); //使用DMA传输
/* USER CODE END 2 */
主循环。
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(ADC1_Flag==1)
{
ADC1_Flag=0;
ADC1_1=0;
ADC1_2=0;
ADC1_3=0;
for(i=0;i<30;)
{
ADC1_1+=ADC1_Value[i++];
ADC1_2+=ADC1_Value[i++];
ADC1_3+=ADC1_Value[i++];
}
printf("\n");
printf("adc1_IN0(PA0)=%4.0d,ADC_IN0=%1.4f\r\n",ADC1_1/10,ADC1_1/10*3.3f/4096);
printf("adc1_IN1(PA1)=%4.0d,ADC_IN1=%1.4f\r\n",ADC1_2/10,ADC1_2/10*3.3f/4096);
printf("adc1_IN4(PA4)=%4.0d,ADC_IN2=%1.4f\r\n",ADC1_3/10,ADC1_3/10*3.3f/4096);
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC1_Value,30); //使用DMA传输
}
HAL_Delay(1000);
}
/* USER CODE END 3 */
ADC回调函数。
DMA传输的时候如果读取内存片段,会有仲裁器的问题,加了一句关闭DMA的语句HAL_ADC_Stop_DMA(&hadc1);
/* USER CODE BEGIN 4 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance == ADC1){
ADC1_Flag=1;
/* * DMA传输的时候如果读取内存片段,会有仲裁器的问题,加了一句关闭DMA的语 */
HAL_ADC_Stop_DMA(&hadc1);
}
}
/* USER CODE END 4 */
测试结果
输入固定电压进行测试。
ADC1 | IN0(PA0) | IN1(PA1) | IN4(PA4) |
---|---|---|---|
输入电压 | VCC | 2.0V | GND |
Normal下测试结果如下。
若不试用关闭DMA的语句HAL_ADC_Stop_DMA(&hadc1);
会造成数据错乱。
Circular可以下可以一直进行采集,不需要HAL_ADC_Stop_DMA(&hadc1)都可。
最后
以上的代码会在Q群里分享。QQ群:615061293。
或者关注微信公众号『记帖』,持续更新文章和学习资料,可加作者的微信交流学习!
边栏推荐
- 【微信小程序】一文带你了解数据绑定、事件绑定以及事件传参、数据同步
- 验证整数输入
- pycharm重命名后无法运行(报错: can‘t open file......No such file or directory)
- 静态路由+PAT+静态NAT(讲解+实验)
- [WeChat applet] This article takes you to understand data binding, event binding, event parameter transfer, and data synchronization
- 系统需求多变如何设计
- Likou Daily Question - Day 46 - 704. Binary Search
- 程序员转正述职报告/总结
- The real CTO is a technical person who understands products
- Charging effect simulation
猜你喜欢
STP选举(步骤+案列)详解
rpm安装postgresql12
FPGA-based vending machine
tcp框架需要解决的问题
Layer 2 broadcast storm (cause + judgment + solution)
基于FPGA的图像实时采集
What are the project management tools like MS Project
Drools basic introduction, introductory case, basic syntax
Teach you how to configure Jenkins automated email notifications
Interprocess communication study notes
随机推荐
Simple confession page
GCC Rust is approved to be included in the mainline code base, or will meet you in GCC 13
Detailed explanation of STP election (step + case)
MySql installation and configuration super detailed tutorial and simple method of building database and table
力扣刷题之有效的正方形(每日一题7/29)
FPGA-based vending machine
mysql index
leetcode-399: division evaluation
pc端判断当前使用浏览器类型
leetcode-399:除法求值
STP选举(步骤+案列)详解
Drools基本介绍,入门案例,基本语法
Is there a way to earn 300 yuan a day by doing a side business?
二层广播风暴(产生原因+判断+解决)
coldfusion8 background scheduled tasks take shell
uniapp uses 3rd party fonts
【Map与Set】之LeetCode&牛客练习
程序员转正述职报告/总结
221. Largest Square
Shell 脚本循环遍历日志文件中的值进行求和并计算平均值,最大值和最小值