怎么做动漫照片下载网站,网站的规划和建设,wordpress外接api,门户网站建设招标公告一、基本定时器介绍在STM32中#xff0c;基本定时器有TIM6、TIM7等。基本定时器主要包含时基单元#xff0c;提供16位的计数#xff0c;能计数0~65535。基本定时器除了计数功能以外#xff0c;还能输出给DAC模块一个TRGO信号。基本定时器框图如下#xff1a;二、时基单元介…一、基本定时器介绍在STM32中基本定时器有TIM6、TIM7等。基本定时器主要包含时基单元提供16位的计数能计数0~65535。基本定时器除了计数功能以外还能输出给DAC模块一个TRGO信号。基本定时器框图如下二、时基单元介绍STM32的所有定时器都具备时基单元时基单元的功能就是简单的计数即计数时钟源TMxCLK的脉冲个数这个时钟源来至APB1总线。高级和通用定时器还可以使用其他的时钟源进行计数在高级定时器和通用定时器中会详细介绍。在基本定时器框架中可知时基单元包含如下三个部分1.ARR 自动重装载寄存器2.CNT 计数器3.PSC 预分频器基本定时器的定时(计数)功能配置如下:void TIM6_IRQHandler(void){static int counter 0;if(TIM_GetITStatus(TIM6,TIM_IT_Update)){//在设置TIM_SelectOnePulseMode(TIM6,TIM_OPMode_Single);后中断进去两次TIM_ClearITPendingBit(TIM6,TIM_IT_Update);}}//基本定时器void TIM6_Configuration(){TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;NVIC_InitTypeDef NVIC_InitStruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //时钟使能TIM_TimeBaseInitStruct.TIM_Period 10 -1;TIM_TimeBaseInitStruct.TIM_Prescaler 72;TIM_TimeBaseInitStruct.TIM_ClockDivision 0;TIM_TimeBaseInitStruct.TIM_CounterMode TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_RepetitionCounter 0;TIM_TimeBaseInit(TIM6,TIM_TimeBaseInitStruct);// TIMx-EGR.UG NVIC_InitStruct.NVIC_IRQChannel TIM6_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority 1;NVIC_InitStruct.NVIC_IRQChannelSubPriority 0;NVIC_Init(NVIC_InitStruct);TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);TIM_ClearITPendingBit(TIM6,TIM_IT_Update);// TIM_SelectOnePulseMode(TIM6,TIM_OPMode_Single);//如需配置单脉冲模式开启此注释TIM_ARRPreloadConfig(TIM6,ENABLE);TIM_Cmd(TIM6,ENABLE);//CEN 位TIM_ClearITPendingBit(TIM6,TIM_IT_Update);}值得说明的是基本定时器还支持单脉冲模式配置单脉冲模式如代码注释即可。单脉冲模式要注意的是在定时器溢出两次后才关闭定时器即失能定时器。在代码中配置有中断在单脉冲模式下可以清晰的看到进入定时器中断2次。三、定时器信号输出定时器的信号输出与定时器中的控制寄存器2TIM6-CR2的MMS位相关基本定时器输出的信号只能用作DAC的触发而高级定时器、通用定时器的输出信号可以触发定时器以及DAC具体细节这里不细说。定时器信号输出的例子可以参考我的博文http://blog.csdn.net/quentinecho/article/details/79068001。这个例子中使用TIM6输出的TRGO信号启动了DAC产生一个三角波当然其他的DAC触发方式也可以产生一个三角波。#include stm32f10x.h#include stm32f10x_rcc.h#include system_stm32f10x.h#include stm32f10x_dac.h#include stm32f10x_gpio.h#include stm32f10x_tim.h/*DAC输出 Vref x (DOR/4095)*///DAC的两个通道可以配置使用//相同触发源/不同触发源//同时触发/独立触发 DAC_DualSoftwareTriggerCmd函数设置软件同时触发//使用波形发生器/不使用波形发生器//使用三角波发生器/使用噪声发生器/不使用波形发生器//设置相同DAC_LFSRUnmask_TriangleAmplitude的值/设置不相同DAC_LFSRUnmask_TriangleAmplitude的值//等等以上各种情况可以任意组合互不影响。void DAC_Configuration(void){GPIO_InitTypeDef GPIO_InitStruct;DAC_InitTypeDef DAC_InitStruct;//第一步 使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);//第二步 配置参数/*一旦使能DACx通道相应的GPIO引脚就会自动与DAC的模拟输出相连为了避免寄生的干扰和额外的功耗引脚PA4/PA5在之前应当设置成“模拟输入”注意是“模拟输入“因为STM32中没有模拟输出所以虽然PA4 PA5是输出模拟信号也只能设置成GPIO_Mode_AIN*/GPIO_InitStruct.GPIO_Pin GPIO_Pin_4 | GPIO_Pin_5;GPIO_InitStruct.GPIO_Mode GPIO_Mode_AIN;GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);GPIO_SetBits(GPIOA,GPIO_Pin_4 | GPIO_Pin_5) ;//PA.4 PA.5输入高 上拉输入起抗干扰的作用// /*DAC 通道1 PA4 产生噪声*/// DAC_InitStruct.DAC_WaveGeneration DAC_WaveGeneration_Noise;// DAC_InitStruct.DAC_Trigger DAC_Trigger_T6_TRGO;//DAC_Trigger_T6_TRGO;// DAC_InitStruct.DAC_OutputBuffer DAC_OutputBuffer_Disable;//输出缓存可以用来减少输出阻抗无需外部运放即可直接驱动外部负载// DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude DAC_LFSRUnmask_Bits10_0;//每次触发计算一次LSFR算法并将得到的值再加上DAC_DHRx的数值去掉溢出位后写入DAC_DORx寄存器输出特定的电压// DAC_Init(DAC_Channel_1,DAC_InitStruct);//参与LSFR算法的位数由DAC_LFSRUnmask_TriangleAmplitude来确定DAC_LFSRUnmask_Bits10_0数值表示有10位参与LSFR计算/*DAC 通道1 PA4 普通数模转换*/DAC_InitStruct.DAC_WaveGeneration DAC_WaveGeneration_None;//关闭波形发生器DAC_InitStruct.DAC_Trigger DAC_Trigger_T6_TRGO;//DAC_Trigger_Software/DAC_Trigger_Ext_IT9DAC_InitStruct.DAC_OutputBuffer DAC_OutputBuffer_Disable;//输出缓存可以用来减少输出阻抗无需外部运放即可直接驱动外部负载DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude DAC_LFSRUnmask_Bit0;//该参数与噪声/三角波发生器相关普通DAC转换是设置为0即可DAC_Init(DAC_Channel_1,DAC_InitStruct); /*DAC 通道2 PA5 产生三角波*/DAC_InitStruct.DAC_WaveGeneration DAC_WaveGeneration_Triangle;DAC_InitStruct.DAC_Trigger DAC_Trigger_T6_TRGO;DAC_InitStruct.DAC_OutputBuffer DAC_OutputBuffer_Disable;DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude DAC_TriangleAmplitude_4095;//内部的三角波计数器每次触发时候之后累加1该计数器的值与DAC_DHRx的数值相加去掉溢出位后写入DAC_DORx寄存器输出电压DAC_Init(DAC_Channel_2,DAC_InitStruct);//三角波计数器的最大值由DAC_LFSRUnmask_TriangleAmplitude来确定当计数器达到这个最大值然后三角波计数器开始递减//第三步 使能器件//DAC_SetDualChannelData(DAC_Align_12b_R,4095,0);等价于DAC_SetChannel1Data(DAC_Align_12b_R, 4095); DAC_SetChannel2Data(DAC_Align_12b_R, 0); /*DAC 通道1 PA4 使能*/DAC_SetChannel1Data(DAC_Align_12b_R, 4095); //12位右对齐数据格式设置DAC值 设置值最大为4095设置成4096则溢出DORx即为0DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC1/*DAC 通道2 PA5 使能*/DAC_Cmd(DAC_Channel_2, ENABLE); //使能DAC1DAC_SetChannel2Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值}//基本定时器void TIM6_Configuration(){TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//第一步 使能时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //时钟使能//第二步 配置参数TIM_TimeBaseInitStruct.TIM_Period 10 -1;TIM_TimeBaseInitStruct.TIM_Prescaler 72;TIM_TimeBaseInitStruct.TIM_ClockDivision 0;TIM_TimeBaseInitStruct.TIM_CounterMode TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_RepetitionCounter 0;TIM_TimeBaseInit(TIM6,TIM_TimeBaseInitStruct);// TIMx-EGR.UG /*TIM6,7可以输出3种类型的TRGO信号#define TIM_TRGOSource_Reset ((uint16_t)0x0000) //复位 UG#define TIM_TRGOSource_Enable ((uint16_t)0x0010) //使能 CEN#define TIM_TRGOSource_Update ((uint16_t)0x0020) //更新事件*/TIM_SelectOutputTrigger(TIM6,TIM_TRGOSource_Update);//输出触发TRGO信号 这里TRGO信号就是定时器溢出产生的更新信号//第三步 使能器件TIM_Cmd(TIM6,ENABLE);//CEN 位}int main(){DAC_Configuration();TIM6_Configuration();while(1){}}看到这里还是没懂的话可以参考这个视频资料http://www.makeru.com.cn/live/1392_1199.html?s45051www.makeru.com.cn