HAL ST32F4 定时器2触发ADC转换

HAL ST32F4 定时器2触发ADC转换


  • 📝利用定时器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
  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F4系列中,可以使用定时器触发ADC的交替触发模式。通过配置定时器的中断回调函数和ADC转换完成回调函数,可以实现定时器定时触发ADC转换。 首先,在定时器的中断回调函数中,使用HAL_ADC_Start_IT函数开启ADC的中断转换。这样,在每次定时器中断发生时,都会触发一次ADC转换。 然后,在ADC转换完成回调函数中,使用HAL_ADC_Stop_IT函数关闭ADC转换,使用HAL_TIM_Base_Stop_IT函数关闭定时器。然后,可以使用HAL_ADC_GetValue函数获取ADC转换的值,并进行相应的处理,比如打印电压信息。 最后,在转换完成回调函数中,使用HAL_TIM_Base_Start_IT函数重新开启定时器,以便下一次定时器中断触发ADC转换。 需要注意的是,在ADC初始化之后,需要进行AD校准,可以使用HAL_ADCEx_Calibration_Start函数进行校准。 下面是一个示例代码,展示了如何使用定时器触发ADC的交替触发模式: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { HAL_ADC_Start_IT(&hadc1); // 定时器中断里面开启ADC中断转换,1ms开启一次采集 } void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { HAL_ADC_Stop_IT(&hadc1); // 关闭ADC HAL_TIM_Base_Stop_IT(&htim3); // 关闭定时器 uint32_t AD_Value = HAL_ADC_GetValue(&hadc1); // 获取ADC转换的值 printf("ADC1 Reading: %d \r\n", AD_Value); // 串口打印ADC转换的值 printf("%.4f V\r\n", (AD_Value * 3.3 / 4096)); // 串口打印电压信息 HAL_TIM_Base_Start_IT(&htim3); // 开启定时器 } int main(void) { // 初始化代码省略 MX_ADC1_Init(); // ADC初始化 HAL_ADCEx_Calibration_Start(&hadc1); // AD校准 MX_USART1_UART_Init(); // 串口初始化 HAL_TIM_Base_Start_IT(&htim3); // 开启定时器 while (1) { // 主循环代码省略 } } ``` 这样,定时器每次中断时都会触发一次ADC转换,可以实现定时触发ADC的交替触发模式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值