完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
程序1:tiM2输出比较,产生频率为366.2Hz的方波
#include "STM32f10x.h" void RCC_configuration(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); //开启GPIO的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); } void Led_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; //定义GPIO初始化的结构体 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; //选中管脚1 TIM2的通道2 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 选择速度50MHZ GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA,&GPIO_InitStruct); //初始化IO口A } void NVIC_Configuration(void) //NVIC配置 { NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //中断组0 NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); //中断向量FLASH NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; //从优先级0 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //中断向量使能 NVIC_Init(&NVIC_InitStruct); } void TIM2_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_BaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; TIM_BaseInitStruct.TIM_Period = 65535; //重载值 TIM_BaseInitStruct.TIM_Prescaler = 2; //预分频值 TIM_BaseInitStruct.TIM_ClockDivision = 0; TIM_BaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数0 ~ Period TIM_TimeBaseInit(TIM2,&TIM_BaseInitStruct); //定时器寄存器初始化 /*********************通道1,产生频率为366HZ************/ TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_Toggle; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStruct.TIM_Pulse = 32768; //设置待装入捕获比较寄存器的脉冲值 TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高 TIM_OC1Init(TIM2, &TIM_OCInitStruct); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIMx在CCR2上的预装载寄存器 TIM_ITConfig(TIM2,TIM_IT_CC1,ENABLE); //TIM中断使能 TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的预装载寄存器 TIM_Cmd(TIM2,ENABLE); //定时器使能 } int main(void) { /* Setup STM32 system (clock, PLL and Flash configuration) */ SystemInit(); RCC_configuration(); Led_Init(); NVIC_Configuration(); TIM2_Configuration(); while (1) { } } /********************中断函数*************************/ void TIM2_IRQHandler(void) { uint16_t capture = 0; /**************通道1,366.2HZ*******************/ if(TIM_GetITStatus(TIM2,TIM_IT_CC1) != RESET) { TIM_ClearITPendingBit(TIM2,TIM_IT_CC1); capture = TIM_GetCapture1(TIM2); TIM_SetCompare1(TIM2,capture + 32767); } } 问题1:为什么我的输出结果不是1:1的方波,是占空比为1:3的方波? 问题2:为什么我的输出频率是183.1,也就是说TIM2CLK = 36M,但是我改成PWM模式时,测的TIM2CLK = 72M,难道是输出比较模式时TIM的倍频器不工作? |
|
相关推荐
3个回答
|
|
刚刚吃完饭回来,刚刚吃饭的时候好像想到问题出在哪里了,我先理下思路,等下来总结下
|
|
|
|
问题出在 TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIMx在CCR2上的预装载寄存器
因为我使用的是比较输出,并且在中断里面设置频率,所以利用TIM_SetCompare1(TIM2,capture + 32767)这个函数来改变比较寄存器的值, 所以当预装载寄存器被使能后,没中断一次,比较寄存器的值就被重新赋值了,这和中断里面设定频率有冲突, 所以解决方法是TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable). 这样就可以利用一个定时器产生4种不同频率,不同占空比的方波了,如有不对的地方,希望大家指点 |
|
|
|
库函数的。。。
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1574 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1519 浏览 1 评论
949 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
672 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1565 浏览 2 评论
1852浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
622浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
508浏览 3评论
512浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
494浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-15 01:22 , Processed in 0.718893 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号