在线时间2 小时
UID204020
ST金币0
蝴蝶豆0
注册时间2010-3-7
新手上路
- 最后登录
- 2018-1-8
|
a0a.1 0b0c
我用的CPU是STM32F103RBT6,库的版本是3.4.0,我现在的程序能运行,但是我不知道为什么在我的PA1脚没有接输入频率的时候却一直在有数据,而且数据不是固定的,输入捕捉在没有频率输入的时候应该是0吧?!我只上传两组数据举例一下如下所示:
DutyCycle1 64
Frequency1 1651
capture2 43607
capture3 28322
capture4 56304
DutyCycle1 56
Frequency1 1661
capture2 43334
capture3 50192
capture4 24343
还有一个问题就是为什么我用的是定时器输出比较模式产生PWM,却不是我计算的值呢!?TIM_Period =65535,TIM_Prescaler=5,TIM_Pulse = zhankongbi4=600;却产生的10k频率的方波(示波器看的),而且为什么改变了TIM_Pulse 的值,输出的频率就会改变呢?!正常不是应该改变TIM_Period 和TIM_Prescaler值嘛?!定时器输出比较模式的频率计算到底是怎么回事呢?我的systemclock选择的72M!
求高手指点一下,先贴上我的代码,main.c函数
#include "stm32f10x.h"
#include
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TimOCInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
void RCC_cfg();
void GPIO_cfg();
void TIME3_PWM_cfg();
void TIME2_cfg();
void NVIC_cfg();
u16 Frequency1;
u16 DutyCycle1;
vu16 zhankongbi4=600; //600->10k
int main()
{ RCC_cfg();
GPIO_cfg();
NVIC_cfg();
TIME2_cfg();
TIME3_PWM_cfg();
while(1)
{
}
}
void GPIO_cfg()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3|RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC| RCC_APB2Periph_AFIO,ENABLE);
//CH2 TIM2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
// CH4 TIM3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//LED
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void TIME3_PWM_cfg()
{
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision =0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_PrescalerConfig(TIM3,5,TIM_PSCReloadMode_Immediate);
TIM_OCStructInit(&TimOCInitStructure);
TimOCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TimOCInitStructure.TIM_Pulse = zhankongbi4;
TIM_OC4Init(TIM3, &TimOCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);
TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);
TIM_Cmd(TIM3, ENABLE);
}
void TIME2_cfg()
{
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision =0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period =65535;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_PrescalerConfig(TIM2,5,TIM_PSCReloadMode_Immediate);
TIM_ICInitStructure.TIM_Channel =TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
void NVIC_cfg()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void RCC_cfg()
{ ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
FLASH_SetLatency(FLASH_Latency_2);
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08) {}
}
}
stm32f10x_it.c中断函数
#include "stm32f10x_it.h"
extern u16 Frequency1;
extern u16 DutyCycle1;
extern vu16 zhankongbi4;
u16 capture2;
u16 capture3;
u16 capture4;
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
{ TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
GPIO_WriteBit(GPIOB,GPIO_Pin_1,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_1)));
capture4=TIM_GetCapture4(TIM3);
TIM_SetCompare4(TIM3, capture4+zhankongbi4);
}
}
void TIM2_IRQHandler(void)
{ if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
{ TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
capture2=TIM_GetCapture2(TIM2);
capture3=TIM_GetCapture1(TIM2);
if(capture2 != 0)
{
DutyCycle1= (TIM_GetCapture1(TIM2) * 100) / capture2;
Frequency1 = 72000000 / capture2;
}
else { DutyCycle1 = 0; Frequency1 = 0;}
}
} |
|