找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 558|回复: 4
打印 上一主题 下一主题
收起左侧

STM32单片机ADC使用TIM3 TRGO转换

[复制链接]
跳转到指定楼层
楼主
ID:1114858 发表于 2024-5-13 21:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32 ADC使用TIM3 TRGO 转换模式时为什么配置好了定时器和触发通道ADC无法正常启用,在程序中加一个软件触发就可以正常使用(ADC配置为单次转换),关闭定时器后ADC转换无法启用,可以看出触发的来源来自定时器的TRGO  ,为什么必须要加一个软件触发 ,麻烦大佬帮忙看下


#include "stm32f10x.h"                  // Device header


void ADCdma_Init( )
{
        RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM3,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE );
        RCC_ADCCLKConfig (RCC_PCLK2_Div6);
        
        
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 ;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        
        
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStructure.TIM_Period=2-1;
        TIM_TimeBaseInitStructure.TIM_Prescaler=72-1;
        TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
        
        TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Update);
        
        
        ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
        ADC_InitTypeDef ADC_InitStructure;
        ADC_InitStructure.ADC_ContinuousConvMode=DISABLE ;
        ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
        ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T3_TRGO;
        ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
        ADC_InitStructure.ADC_NbrOfChannel=1;
        ADC_InitStructure.ADC_ScanConvMode=DISABLE ;
        ADC_Init(ADC1,&ADC_InitStructure);
        

        ADC_Cmd(ADC1,ENABLE );
        TIM_Cmd(TIM3,ENABLE );
        ADC_ResetCalibration(ADC1);
        while(ADC_GetResetCalibrationStatus(ADC1)==SET );
        ADC_StartCalibration(ADC1);
        while(ADC_GetCalibrationStatus(ADC1)==RESET);
        
        
}



#include "stm32f10x.h"                  // Device header
#include "ADCdma.h"
#include "OLED.h"

int main(void)
{
        uint16_t ADC_Date1[4]={0};
        OLED_Init();
        ADCdma_Init();
        ADC_SoftwareStartConvCmd(ADC1,ENABLE );//  必须加这条才可以正常使用
        while(1)
        {

                OLED_ShowNum(1,1,ADC_GetConversionValue(ADC1),5);
               
        }
      
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:421260 发表于 2024-5-14 08:04 | 只看该作者
ADC_SoftwareStartConvCmd(ADC1,ENABLE );//使能指定的ADC通道。
回复

使用道具 举报

板凳
ID:421260 发表于 2024-5-14 08:07 | 只看该作者
使能指定的ADC的软件转换启动功能
回复

使用道具 举报

地板
ID:1114858 发表于 2024-5-14 16:30 来自手机 | 只看该作者
szqinyi 发表于 2024-5-14 08:04
ADC_SoftwareStartConvCmd(ADC1,ENABLE );//使能指定的ADC通道。

这个函数不是使能软件开始的吗?跟硬件有什么关系
回复

使用道具 举报

5#
ID:1114858 发表于 2024-5-14 16:32 来自手机 | 只看该作者
szqinyi 发表于 2024-5-14 08:07
使能指定的ADC的软件转换启动功能

是的,可以不使用这句,需要用函数开启ADC外部触发就可以不使用开始软件转换函数。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表