HAL ST32F4 定时器2触发ADC转换

news2024/11/24 2:22:30

HAL ST32F4 定时器2触发ADC转换


  • 📍相关篇《STM32 F401/411外设内部互联矩阵摘要》
  • 《STM32G070RBT6基于STM32CubeMX创建ADC DMA多通道采样工程》
  • 📝利用定时器2的更新中断触发ADC转换。与定时器中断中调用ADC转换不同。前者是内部更新事件触发ADC转换,后者需要主动调用HAL_ADC_Start_IT(&hadc1);HAL_ADC_Start(&hadc1);完成开启转换工作。

🛠STM32CubeMX配置

  • 🌿ADC参数设置:
    在这里插入图片描述
ContinuousConvMode即连续采样模式
DiscontinuousConvMode即非连续采样模式
  • 🔖在使用的过程中,不要将以上两个参数都同时使能。
  • 🌿ADC触发源STM32CubeMX配置:
    在这里插入图片描述
  • 🔖对于stm32f401,ADC1的触发源可以是定时器1、2、4、5相对的事件,如果想使用其他的定时器事件可以根据个人需求设置。
/** @defgroup ADC_External_trigger_Source_Regular ADC External Trigger Source Regular
  * @{
  */
/* Note: Parameter ADC_SOFTWARE_START is a software parameter used for        */
/*       compatibility with other STM32 devices.                              */
#define ADC_EXTERNALTRIGCONV_T1_CC1    0x00000000U
#define ADC_EXTERNALTRIGCONV_T1_CC2    ((uint32_t)ADC_CR2_EXTSEL_0)
#define ADC_EXTERNALTRIGCONV_T1_CC3    ((uint32_t)ADC_CR2_EXTSEL_1)
#define ADC_EXTERNALTRIGCONV_T2_CC2    ((uint32_t)(ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0))
#define ADC_EXTERNALTRIGCONV_T2_CC3    ((uint32_t)ADC_CR2_EXTSEL_2)
#define ADC_EXTERNALTRIGCONV_T2_CC4    ((uint32_t)(ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_0))
#define ADC_EXTERNALTRIGCONV_T2_TRGO   ((uint32_t)(ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1))
#define ADC_EXTERNALTRIGCONV_T3_CC1    ((uint32_t)(ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0))
#define ADC_EXTERNALTRIGCONV_T3_TRGO   ((uint32_t)ADC_CR2_EXTSEL_3)
#define ADC_EXTERNALTRIGCONV_T4_CC4    ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_0))
#define ADC_EXTERNALTRIGCONV_T5_CC1    ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_1))
#define ADC_EXTERNALTRIGCONV_T5_CC2    ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0))
#define ADC_EXTERNALTRIGCONV_T5_CC3    ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2))
#define ADC_EXTERNALTRIGCONV_T8_CC1    ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_0))
#define ADC_EXTERNALTRIGCONV_T8_TRGO   ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1))
#define ADC_EXTERNALTRIGCONV_Ext_IT11  ((uint32_t)ADC_CR2_EXTSEL)
#define ADC_SOFTWARE_START             ((uint32_t)ADC_CR2_EXTSEL + 1U)
  • 🌿定时器2配置:更新频率1s触发转换一次。
    在这里插入图片描述
  • 🌿开启ADC中断
    在这里插入图片描述
  • 🌿开启定时器中断
    在这里插入图片描述
  • 🌿中断优先级分组设置:定时器2中断 > ADC1中断
    在这里插入图片描述

📙业务代码完善

  • 🌿在main函数中开启定时器2和ADC1
int main(void)
{

    /* USER CODE BEGIN 1 */

    /* 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 */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_ADC1_Init();
    MX_USART1_UART_Init();
    MX_TIM2_Init();
    /* USER CODE BEGIN 2 */
    printf("TIM Trg ADC change\r\n");//84000000/8400/10000=
    __HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);
    HAL_TIM_Base_Start_IT(&htim2);
    HAL_ADC_Start_IT(&hadc1);

    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while(1) {
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
    }
    /* USER CODE END 3 */
}
  • 🌿中断回调
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) // TIM中断回调
{
    if(htim->Instance == TIM2) {
        HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
    }
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) // ADC转换完成回调函数
{
    // HAL_ADC_Stop_IT(&hadc1);
    HAL_TIM_Base_Stop_IT(&htim2);
    uint16_t AdcBuf = HAL_ADC_GetValue(&hadc1);
    float Voltage = AdcBuf / 4095.f * 3.3f;
    printf("AdcBuf:%d,Voltage:%.2f\r\n", AdcBuf, Voltage);
    HAL_TIM_Base_Start_IT(&htim2);
    //	HAL_ADC_Start_IT(&hadc1);
}
  • 🌿其他串口调试输出代码
#include "stdio.h"//注意勾选LibMicro选项
/*可调用printf*/
int fputc(int ch, FILE *f)
{
    /*&huart1指的是串口1,如果用别的串口就修改数字*/
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
    return ch;
}
  • 🌿测试PA0引脚采集,效果输出
    在这里插入图片描述

📚测试工程

链接:https://pan.baidu.com/s/1B-NooPdHQcuYdiG9lPTXdA?pwd=5x2m 
提取码:5x2m

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1583399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美团一面,面试官让介绍AQS原理并手写一个同步器,直接凉了

写在开头 今天在牛客上看到了一个帖子,一个网友吐槽美团一面上来就让手撕同步器,没整出来,结果面试直接凉凉。 就此联想到一周前写的一篇关于AQS知识点解析的博文,当时也曾埋下伏笔说后面会根据AQS的原理实现一个自定义的同步器…

05 Php学习:类型比较、常量

PHP 类型比较 虽然 PHP 是弱类型语言,但也需要明白变量类型及它们的意义,因为我们经常需要对 PHP 变量进行比较,包含松散和严格比较。 松散比较:使用两个等号 比较,只比较值,不比较类型。严格比较&#x…

<网络> 网络Socket编程基于TCP协议模拟简易网络通信

目录​​​​​​​ 前言: 一、字符串回响 (一)程序结构 (二)初始化服务器 (三)启动服务器 1. 处理连接请求 2. 业务处理 3. 回调函数 (四)填充server源文件 &…

pyqt5 QScrollArea组件

本示例中,演示了QScrollArea的使用,以及QScrollBar的样式设定,在代码中使用setStyleSheet设置样式,记得要优先设置scrollArea,再设置窗口的样式,不然QScrollBar的样式会不起作用,使用QSS设置没有…

【讲解下Fiddler的安装和使用】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

基于Java+SpringBoot+Vue文学名著分享系统(源码+文档+部署+讲解)

一.系统概述 随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、高效的文学名著分享系统。当前的信息管理…

接口自动化测试(python+pytest+requests)

一、选取自动化测试用例 优先级高:先实现业务流程用例、后实现单接口用例功能较稳定的接口优先开展测试用例脚本的实现二、搭建自动化测试环境 核心技术:编程语言:python;测试框架:pytest;接口请求:requests安装/验证requests:命令行终端分别输入 pip install requests / p…

LMDoply部署实战

使用LMDeoply部署各类开源大模型,进行推理实践。 一. 环境准备 1. 创建Conda环境 studio-conda -t lmdeploy -o pytorch-2.1.2 2. 安装LMDeploy 激活刚刚创建的虚拟环境。 conda activate lmdeploy 安装0.3.0版本的lmdeploy。 pip install lmdeploy[all]0.3.…

媒体邀约专访如何深入的做一篇专访报道?流程分享

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 进行媒体邀约专访并深入撰写一篇专访报道是一个系统性工作,涉及多个环节。以下是一个详细的流程分享: 一、前期准备 确定专访目的与主题:明确专访希…

Python程序设计 列表

教学案例八 列表 1. 计算并显示斐波那契数列 输入n,计算并显示斐波那契数列前n项.一行打印5项,每项显示宽度为6 什么是斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列、 因数学家莱昂纳多斐波那契&#xff…

C++典型例题切入数据存储

一、典例导入 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] {1, 2, 3, 4};char char2[] "abcd";char* pChar3 "abcd";int* ptr1 (int*)malloc(sizeof (int)*4);int* ptr2 …

C语言面试题之返回倒数第 k 个节点

返回倒数第 k 个节点 实例要求 1、实现一种算法,找出单向链表中倒数第 k 个节点;2、返回该节点的值; 示例:输入: 1->2->3->4->5 和 k 2 输出: 4 说明:给定的 k 保证是有效的。实…

新平台上线需要注意哪些?

最近有很多被黑客攻击的老板问我前期平台上线安全防护方面需要注意哪些?下面就给大家讲一下。1、如果前期不打算上高防产品,数据一定要做好备份,否则一旦数据被篡改或者被加密,恢复都是比较困难的,甚至都没有办法恢复。…

亚马逊国际获得AMAZON商品详情 API ,item_get-获得AMAZON商品详情

亚马逊提供了多种API和服务,允许开发者获取商品详情和其他相关信息。然而,直接使用亚马逊的API通常需要遵循一定的步骤和条件,包括注册为亚马逊开发者、创建应用并获取API密钥等。 请求示例,API接口接入Anzexi58 关于你提到的“i…

[Java基础揉碎]System类

1) exit 退出当前程序 2) arraycopy: 复制数组元素,比较适合底层调用,一般使用 Arrays.copyOf完成复制数组(Arrays.copyOf其实底层也是用的System.arraycopy, 本质是一样的) int[] src{1,2,3}; int[] dest new int[3]; System.arraycopy(src, 0, des…

想往智能驾驶方向发展,需要做哪些努力

想往智能驾驶方向发展,需要做哪些努力 附赠自动驾驶学习资料和量产经验:链接 目前自动驾驶主要涉及到以下几个方面: 1.传感器技术(激光雷达,毫米波雷达,摄像头,超声波雷达)&#x…

【笔试】02

TCP TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议 它能够提供以下服务: 可靠传输 通过序列号、确认应答、重传机制等确保数据完整、准确地从发送端传输到接收端。 三次握手: 点对点全双工面向字节流…

final、finally、finalize的区别

final final就是不可变的意思,可以修饰变量、⽅法和类。修饰变量时,这个变量必须初始 化,所以也称为常量。 被final修饰的类不能被继承 如果一个变量被final修饰,就需要初始化。可以在声明的时候赋值,或者在每一个构…

Linux_进程的优先级环境变量上下文切换优先级队列

文章目录 一、进程的优先级二、进程的四个重要概念三、上下文切换四、环境变量查看当前shell环境下的环境变量与内容 五、Linux2.6内核进程调度队列一个CPU拥有一个runqueue优先级活动队列过期队列active指针和expired指针 一、进程的优先级 什么是优先级? 指定一个…

第十一届蓝桥杯省赛真题(C/C++大学B组)

试题A &#xff1a;门牌制作 #include <bits/stdc.h> using namespace std;const int N 100000; int arr[N];int main() {int ans 0,t;for(int i 1;i < 2020;i){t i;while(t > 0){if(t % 10 2) ans;t / 10;}}cout<<ans<<endl;return 0; } 试题B …