中级会员
 
- 积分
- 237
- 金钱
- 237
- 注册时间
- 2016-6-22
- 在线时间
- 50 小时
|

楼主 |
发表于 2016-6-22 21:05:48
|
显示全部楼层
//出现..\HARDWARE\timer1.c(8): error: #268: declaration may not appear after executable statement in block
//解决方法:是因为变量的声明,不能放在执行语句的后面,只能放在函数的最前面,简单来说,就是必须要放在函数开始处。
#include "timer1.h"
#include "usart.h"
/*PWM初始化*/
void pwm_init(u16 arr,u16 fsc)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruact;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//注意端口状态
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化GPIOA.7为推挽复用输出,作为PWM的输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化GPIOA.8为浮空输入
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_Prescaler=fsc;
TIM_TimeBaseInitStruct.TIM_Period=arr;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//定时器3初始化
//按照普通模式,TIMx_CNT>TIMx_CCR1,输出应该是高电平
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2; // PWM1/PWM2模式
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High; //有效电平
TIM_OC2Init(TIM3,&TIM_OCInitStruct); //OCxInit 通道x
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能预装载寄存器
TIM_Cmd(TIM3, ENABLE); //使能计数器
}
//用定时器4的计数器来计数高电平的脉冲数。
void cc_init(u16 arr,u16 fsc)
{
GPIO_InitTypeDef GPIO_InitStruct;//IO口配置
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; //定时器配置
TIM_ICInitTypeDef TIM_ICInitStruct; //捕获比较参数配置
NVIC_InitTypeDef NVIC_InitStruct; //中断分组配置
/*开启定时器时钟和GPIOA时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器5时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外设时钟
/*配置PA0为下拉输入*/
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD; //下拉输入
GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化GPIOA.0为下拉输入
// GPIO_ResetBits(GPIOA,GPIO_Pin_0);
/*配置定时器4计数模式*/
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; //fDTS(采样频率)=fCK_INT(定时器频率)
TIM_TimeBaseInitStruct.TIM_Prescaler=fsc;
TIM_TimeBaseInitStruct.TIM_Period=arr;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);//定时器4初始化,自动重装载值和计数频率。
/*设置捕获的一些参数*/
TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;//设置为通道1
TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;//捕获上升沿,因为PA0默认是低电平,按键按下后为高。
TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;//设置映射关系,和CCMR1中的CCxS[1:0]为输入捕获模式,而不是输出。
TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;//配置为每个上升沿捕获一次
TIM_ICInitStruct.TIM_ICFilter=0x00; //设置滤波器长度为0.
TIM_ICInit(TIM4,&TIM_ICInitStruct);
/*设置中断分组*/
NVIC_InitStruct.NVIC_IRQChannel=TIM4_IRQn; //为啥Mini定时器不能设置TIM5_IRQn
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitStruct);
/*使能捕获和溢出中断*/
TIM_ITConfig(TIM4,TIM_IT_CC1|TIM_IT_Update,ENABLE); //因为高电平时间可能会很长,故定时器会有溢出。
/*打开计数器CEN*/
TIM_Cmd(TIM4,ENABLE);
}
u8 TIM4CH1_CAPTURE_STA=0; //输入捕获状态
u16 TIM4CH1_CAPTURE_VAL; //输入捕获值
/*本次试验中,设置0xffff为计数值*/
void TIM4_IRQHandler(void)//捕获没开么????
{
TIM4CH1_CAPTURE_STA=1;
if((TIM4CH1_CAPTURE_STA&0x80)==0) //捕获未完成
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET) //说明定时器溢出
{
printf("TIM4CH1_CAPTURE_STA=%d\n",TIM4CH1_CAPTURE_STA);
if(TIM4CH1_CAPTURE_STA&0x40) //已经捕获到高电平
{
if((TIM4CH1_CAPTURE_STA&0x3f)==0x3f)
{
TIM4CH1_CAPTURE_STA |=0x80;//强制退出
TIM4CH1_CAPTURE_VAL=0xffff;
}
else
TIM4CH1_CAPTURE_STA++; //计数器5溢出一次,加一。已计数:(TIME5CH1_CAPTURE_STA+1) *(0xffff+1)+TIME5CH1_CAPTURE_VAL
}
}
if(TIM_GetITStatus(TIM4,TIM_IT_CC1)!=RESET) //说明捕获到边沿信号
{
printf("jishu=\n");
if(TIM4CH1_CAPTURE_STA&0x40) //本次捕获到下降沿
{
printf("xiajiangyan=\n");
TIM4CH1_CAPTURE_STA |=0x80;//标记成功
TIM4CH1_CAPTURE_VAL=TIM_GetCapture1(TIM4); //获取CCR1当前的计数值
TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Rising);//设置该通道为上升沿捕获,准备下一次捕获
}
else //本次捕获到上升沿,重新计数
{
printf("shangshengyan=\n");
TIM4CH1_CAPTURE_STA=0;
TIM4CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM4,0);//CNT的计数值清零。
TIM4CH1_CAPTURE_STA |=0x40;//捕获上升沿
TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Falling);//设置该通道为下降沿捕获,准备捕获上升沿
}
}
}
TIM_ClearITPendingBit(TIM4,TIM_IT_CC1|TIM_IT_Update);
}
是这个文件 |
|