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](https://file1.bdocx.com/fileroot1/2023-6/20/27e147bd-4a4d-4c31-8953-898c3d01a6e7/27e147bd-4a4d-4c31-8953-898c3d01a6e71.gif)
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