完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、基本定时器介绍
在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次。 三、定时器信号输出 定时器的信号输出与定时器中的控制寄存器2(TIM6-》CR2)的MMS位相关,基本定时器输出的信号只能用作DAC的触发,而高级定时器、通用定时器的输出信号可以触发定时器以及DAC,具体细节这里不细说。这个例子中使用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_IT9 DAC_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即为0 DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC1 /DAC 通道2 PA5 使能/ DAC_Cmd(DAC_Channel_2, ENABLE); //使能DAC1 DAC_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) { } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1786 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1622 浏览 1 评论
1089 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
730 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1941浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
739浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
576浏览 3评论
598浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
560浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 11:18 , Processed in 0.771858 second(s), Total 43, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号