TIM8的ETR 端输入作为TIM8的外部时钟2模式工作然后有TIM8的TRGO端触发ADCADC用DMA输出到GPIOB.docx

上传人:b****7 文档编号:26538209 上传时间:2023-06-20 格式:DOCX 页数:16 大小:17.98KB
下载 相关 举报
TIM8的ETR 端输入作为TIM8的外部时钟2模式工作然后有TIM8的TRGO端触发ADCADC用DMA输出到GPIOB.docx_第1页
第1页 / 共16页
TIM8的ETR 端输入作为TIM8的外部时钟2模式工作然后有TIM8的TRGO端触发ADCADC用DMA输出到GPIOB.docx_第2页
第2页 / 共16页
TIM8的ETR 端输入作为TIM8的外部时钟2模式工作然后有TIM8的TRGO端触发ADCADC用DMA输出到GPIOB.docx_第3页
第3页 / 共16页
TIM8的ETR 端输入作为TIM8的外部时钟2模式工作然后有TIM8的TRGO端触发ADCADC用DMA输出到GPIOB.docx_第4页
第4页 / 共16页
TIM8的ETR 端输入作为TIM8的外部时钟2模式工作然后有TIM8的TRGO端触发ADCADC用DMA输出到GPIOB.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

TIM8的ETR 端输入作为TIM8的外部时钟2模式工作然后有TIM8的TRGO端触发ADCADC用DMA输出到GPIOB.docx

《TIM8的ETR 端输入作为TIM8的外部时钟2模式工作然后有TIM8的TRGO端触发ADCADC用DMA输出到GPIOB.docx》由会员分享,可在线阅读,更多相关《TIM8的ETR 端输入作为TIM8的外部时钟2模式工作然后有TIM8的TRGO端触发ADCADC用DMA输出到GPIOB.docx(16页珍藏版)》请在冰豆网上搜索。

TIM8的ETR 端输入作为TIM8的外部时钟2模式工作然后有TIM8的TRGO端触发ADCADC用DMA输出到GPIOB.docx

TIM8的ETR端输入作为TIM8的外部时钟2模式工作然后有TIM8的TRGO端触发ADCADC用DMA输出到GPIOB

1,ADC选择ADC1+ADC3―――设置为DMA输出,输出到GPIOA,B,

2,同步时钟由TIM8的ETR端输入,作为TIM8的外部时钟2模式工作。

然后有TIM8的TRGO端触发ADC---打开ADC-TRGO的复用

3,要求ETR进入的脉冲,每2个上升沿触发一次ADC

4,使用TIM8-ETR触发ADC1

5,程序已经调试过,可以单独触发ADC1,ADC3

写此的主要目的是给一个:

外部TIM8-ETR线触发ADC1+adc3的例子。

遗憾的是目前只能实现2个脉冲触发一次ADC

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

ADC设定:

#include"adc.h"

#defineADC1_DR_Address((u32)0x40012400+0x4c)

#defineADC3_DR_Address((u32)0x40013c00+0x4c)

#defineGPIOA_ODR_Address((u32)0x40010800+0x0c)

#defineGPIOB_ODR_Address((u32)0x40010c00+0x0c)

__IOuint16_tADC_ConvertedValue;

//__IOu16ADC_ConvertedValueLocal;

/*

*函数名:

ADC1_GPIO_Config

*描述:

使能ADC1和DMA1的时钟,初始化PC.01

*输入:

*输出:

*调用:

内部调用

*/

staticvoidADC1_GPIO_Config(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

/*EnableDMAclock*/

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

/*EnableADC1andGPIOCclock*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOC,ENABLE);

/*ConfigurePC.01asanaloginput*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;

GPIO_Init(GPIOC,&GPIO_InitStructure);//PC1,输入时不用设置速率

}

/*函数名:

ADC1_Mode_Config

*描述:

配置ADC1的工作模式为MDA模式

*输入:

*输出:

*调用:

内部调用

*/

staticvoidADC1_Mode_Config(void)

{

DMA_InitTypeDefDMA_InitStructure;

ADC_InitTypeDefADC_InitStructure;

/*DMAchannel1configuration*/

DMA_DeInit(DMA1_Channel1);

DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;//ADC地址

DMA_InitStructure.DMA_MemoryBaseAddr=GPIOB_ODR_Address;//(u32)&ADC_ConvertedValue;//内存地址

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;

DMA_InitStructure.DMA_BufferSize=1;

DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址固定

DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Disable;//内存地址固定

DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//半字

DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;

DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//循环传输

DMA_InitStructure.DMA_Priority=DMA_Priority_High;

DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;

DMA_Init(DMA1_Channel1,&DMA_InitStructure);

/*EnableDMAchannel1*/

DMA_Cmd(DMA1_Channel1,ENABLE);

/*ADC1configuration*/

ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立ADC模式

ADC_InitStructure.ADC_ScanConvMode=DISABLE;//禁止扫描模式,扫描模式用于多通道采集

ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//开启连续转换模式,即不停地进行ADC转换

ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO;//ADC_ExternalTrigConv_T3_TRGO;//None;//不使用外部触发转换//ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO;//

ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//采集数据右对齐

ADC_InitStructure.ADC_NbrOfChannel=1;//要转换的通道数目1

ADC_Init(ADC1,&ADC_InitStructure);

/*配置ADC时钟,为PCLK2的8分频,即9MHz*/

RCC_ADCCLKConfig(RCC_PCLK2_Div8);

//ADC_ExternalTrigConvCmd(ADC1,ENABLE);

/*配置ADC1的通道11为55.5个采样周期,序列为1*/

ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_1Cycles5);

/*EnableADC1DMA*/

ADC_DMACmd(ADC1,ENABLE);

ADC_ExternalTrigConvCmd(ADC1,ENABLE);

/*EnableADC1*/

ADC_Cmd(ADC1,ENABLE);

/*复位校准寄存器*/

ADC_ResetCalibration(ADC1);

/*等待校准寄存器复位完成*/

while(ADC_GetResetCalibrationStatus(ADC1));

/*ADC校准*/

ADC_StartCalibration(ADC1);

/*等待校准完成*/

while(ADC_GetCalibrationStatus(ADC1));

/*由于没有采用外部触发,所以使用软件触发ADC转换*/

//ADC_SoftwareStartConvCmd(ADC1,ENABLE);

}

/*

*函数名:

ADC1_Init

*描述:

*输入:

*输出:

*调用:

外部调用

*/

voidADC1_Init(void)

{

ADC1_GPIO_Config();

ADC1_Mode_Config();

}

///////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAADDDDDDDDDDDDDDDD###################33333333333333333////////////////

staticvoidADC3_GPIO_Config(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

/*EnableDMAclock*/

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2,ENABLE);

/*EnableADC1andGPIOCclock*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3|RCC_APB2Periph_GPIOC,ENABLE);

/*ConfigurePC.01asanaloginput*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;

GPIO_Init(GPIOC,&GPIO_InitStructure);//PC3,输入时不用设置速率

}

/*函数名:

ADC3_Mode_Config

*描述:

配置ADC1的工作模式为MDA模式

*输入:

*输出:

*调用:

内部调用

*/

staticvoidADC3_Mode_Config(void)

{

DMA_InitTypeDefDMA_InitStructure;

ADC_InitTypeDefADC_InitStructure;

/*DMAchannel1configuration*/

DMA_DeInit(DMA2_Channel5);

DMA_InitStructure.DMA_PeripheralBaseAddr=ADC3_DR_Address;//ADC地址

DMA_InitStructure.DMA_MemoryBaseAddr=GPIOB_ODR_Address;//(u32)&ADC_ConvertedValue;//内存地址

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;

DMA_InitStructure.DMA_BufferSize=1;

DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址固定

DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Disable;//内存地址固定

DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//半字

DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;

DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//循环传输

DMA_InitStructure.DMA_Priority=DMA_Priority_High;

DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;

DMA_Init(DMA2_Channel5,&DMA_InitStructure);

/*EnableDMAchannel1*/

DMA_Cmd(DMA2_Channel5,ENABLE);

/*ADC1configuration*/

ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立ADC模式

ADC_InitStructure.ADC_ScanConvMode=DISABLE;//禁止扫描模式,扫描模式用于多通道采集

ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//开启连续转换模式,即不停地进行ADC转换

ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T8_TRGO;//不使用外部触发转换

ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//采集数据右对齐

ADC_InitStructure.ADC_NbrOfChannel=1;//要转换的通道数目1

ADC_Init(ADC3,&ADC_InitStructure);

/*配置ADC时钟,为PCLK2的8分频,即9Hz*/

RCC_ADCCLKConfig(RCC_PCLK2_Div8);

/*配置ADC1的通道11为55.5个采样周期,序列为1*/

ADC_RegularChannelConfig(ADC3,ADC_Channel_13,1,ADC_SampleTime_1Cycles5);

/*EnableADC1DMA*/

ADC_DMACmd(ADC3,ENABLE);

ADC_ExternalTrigConvCmd(ADC3,ENABLE);

/*EnableADC1*/

ADC_Cmd(ADC3,ENABLE);

/*复位校准寄存器*/

ADC_ResetCalibration(ADC3);

/*等待校准寄存器复位完成*/

while(ADC_GetResetCalibrationStatus(ADC3));

/*ADC校准*/

ADC_StartCalibration(ADC3);

/*等待校准完成*/

while(ADC_GetCalibrationStatus(ADC3));

/*由于没有采用外部触发,所以使用软件触发ADC转换*/

//ADC_SoftwareStartConvCmd(ADC3,ENABLE);

}

/*

*函数名:

ADC1_Init

*描述:

*输入:

*输出:

*调用:

外部调用

*/

voidADC3_Init(void)

{

ADC3_GPIO_Config();

ADC3_Mode_Config();

}

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

TIM3,TIM8设置

voidTIM8_Init(void)

{

TIM_TimeBaseInitTypeDefTIM_TimeBaseInitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);

TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInitStruct.TIM_Period=1;

TIM_TimeBaseInitStruct.TIM_Prescaler=0;

TIM_TimeBaseInit(TIM8,&TIM_TimeBaseInitStruct);

TIM_SelectOutputTrigger(TIM8,TIM_TRGOSource_Update);//选择TRGO触发源为计时器更新时间

TIM_Cmd(TIM8,ENABLE);

TIM_ETRConfig(TIM8,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0);//////

TIM_ETRClockMode2Config(TIM8,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0);

}

voidPA08Clock_Out(void)//8MHz晶振频率信号输出

{

GPIO_InitTypeDefGPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOA,&GPIO_InitStructure);

RCC_MCOConfig(RCC_MCO_HSE);

}

voidPA00ETR(void)//8MHz晶振频率信号输出

{

GPIO_InitTypeDefGPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA,&GPIO_InitStructure);

}

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

Main

#include"stm32f10x.h"

#include"usart1.h"

#include"adc.h"

#include"led.h"

#include"exti.h"

#include"misc.h"

#include"stm32f10x_rcc.h"

#include"Time_test.h"

//#include"dac.h"

//ADC1转换的电压值通过MDA方式传到SRAM

extern__IOuint16_tADC_ConvertedValue;

//局部变量,用于保存转换计算后的电压值

floatADC_ConvertedValueLocal;

//软件延时

voidDelay(__IOuint32_tnCount)

{

for(;nCount!

=0;nCount--);

}

/**

*@briefMainprogram.

*@paramNone

*@retval:

None

*/

intmain(void)

{

/*USART1config*/

//USART1_Config();

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_ADC1_ETRGREG,ENABLE);

PA00ETR();

TIM_DeInit(TIM8);

//TIM_DeInit(TIM3);

//GPIO_DeInit(GPIOA);

//GPIO_DeInit(GPIOB);

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

//GPIO_PinRemapConfig(GPIO_Remap_ADC1_ETRGREG,ENABLE);

//PA00ETR();

//TIM3_Init();

TIM8_Init();

/*enableadc1andconfigadc1todmamode*/

//ADC3_Init();

ADC1_Init();

LED_GPIO_Config();

//LED_GPIO_Config();

//LED_GPIO_Config();

//LED_GPIO_Config();

GPIO_Write(GPIOA,0xFFFF);

GPIO_Write(GPIOB,0xFFFF);

//printf("\r\n-------这是一个ADC实验------\r\n");

while

(1)

{

//Delay(0xee);//延时

GPIO_Write(GPIOB,0);//用来监测B口的变化;

}

}

/*******************(C)COPYRIGHT2012WildFireTeam*****ENDOFFILE************/

GPIOA,B全部口设置

**********************************************************************************/

#include"led.h"

/*

*函数名:

LED_GPIO_Config

*描述:

配置LED用到的I/O口

*输入:

*输出:

*/

voidLED_GPIO_Config(void)

{

/*定义一个GPIO_InitTypeDef类型的结构体*/

GPIO_InitTypeDefGPIO_InitStructure;

/*开启GPIOC的外设时钟*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

/*选择要控制的GPIOC引脚*/

GPIO_InitStructure.GPIO_Pin=GPIO_P

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1