初级会员
- 积分
- 60
- 金钱
- 60
- 注册时间
- 2019-8-13
- 在线时间
- 23 小时
|
PA1 脉冲输出给 PC6作为TIM8外部计数通道1使用一、配置IO和定时器
- TIM_ICInitTypeDef TIM8_ICInitStructure;
- void TIM8_Cap_Init(u16 arr,u16 psc)
- {
- GPIO_InitTypeDef GPIO_InitStructuer;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE); ///使能TIM8时钟
-
- GPIO_InitStructuer.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStructuer.GPIO_Mode = GPIO_Mode_IPD;//下拉输入
- GPIO_InitStructuer.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructuer);
-
- GPIO_InitStructuer.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStructuer.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructuer.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructuer);
- GPIO_ResetBits(GPIOA,GPIO_Pin_1); //PA.1 输出DI
-
- //timer1 NVIC 配置 uint16_t TIM_Prescaler;
- TIM_DeInit(TIM8);
-
- TIM_TimeBaseInitStructure.TIM_Period = arr;//自动重装载值 uint16_t TIM_CounterMode;
- TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定时器分频
- TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
- TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式 uint16_t TIM_Period;
- TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//溢出多少次后进入中断
- TIM_TimeBaseInit(TIM8,&TIM_TimeBaseInitStructure);//初始化TIM8
-
- NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_IRQn; //uint16_t TIM_ClockDivision;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级2
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//子优先级2
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能 uint8_t TIM_RepetitionCounter;
- NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
- //TIM_ETRClockMode1Config(TIM8, TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted, 5);//5次采样滤波 外部时钟模式2
- //TIM_SelectMasterSlaveMode(TIM8,TIM_MasterSlaveMode_Enable); //启动定时器的被动触发
-
- TIM_ClearITPendingBit(TIM8,TIM_IT_Update); //清除中断标志位,避免第一次自动进入中断一次
-
- TIM_TIxExternalClockConfig( TIM8, TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising, 0xF );
- TIM8->CCMR1|=1;//CC1S[1:0]:捕获/比较1 选择。(Capture/Compare 1 selection) 位1:0 这2位定义通道的方向(输入/输出),及输入脚的选择: 00:CC1通道被配置为输出; 01:CC1通道被配置为输入,IC1映射在TI1上;
- TIM8->SMCR|=0x07;//寄存器的SMS=’111’,选择定时器外部时钟模式1
- TIM8->SMCR|=0x50;//置TIMx_SMCR寄存器中TS=101,选择TI1作为输入源。
- TIM8->CCER|=1<<4;//中文资料坑人系列 捕获使能。
- TIM8->CCER&=~(1<<5);//第6位置一0:不反相:捕获发生在IC1的上升沿;当用作外部触发器时,IC1不反相。
- //TIM8->CR1|=1;
- //TIM_ETRClockMode1Config
- TIM_SetCounter(TIM8,0);//设置计数初值
- TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE);
- TIM_Cmd(TIM8,ENABLE); //使能定时器1
- }
复制代码 上面配置寄存器部分和库函数部分重复,可选择删除↓
- TIM8->CCMR1|=1;//CC1S[1:0]:捕获/比较1 选择。(Capture/Compare 1 selection) 位1:0 这2位定义通道的方向(输入/输出),及输入脚的选择: 00:CC1通道被配置为输出; 01:CC1通道被配置为输入,IC1映射在TI1上;
- TIM8->SMCR|=0x07;//寄存器的SMS=’111’,选择定时器外部时钟模式1
- TIM8->SMCR|=0x50;//置TIMx_SMCR寄存器中TS=101,选择TI1作为输入源。
- TIM8->CCER|=1<<4;//中文资料坑人系列 捕获使能。
- TIM8->CCER&=~(1<<5);//第6位置一0:不反相:捕获发生在IC1的上升沿;当用作外部触发器时,IC1不反相。
复制代码
搜到很多人说进不了TIM8的中断函数是因为缺少这一句↓
- TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//溢出多少次后进入中断
复制代码 主函数- u16 COUN1=0;
- u16 COUN2=0;
- u8 n,m=0,y=0;
- int main(void)
- {
- delay_init(); //延时函数初始化
- TIM8_Cap_Init(10-1,0); //10次一溢出 、外部计数(减一应该是重要的影响到数据准确度)
- delay_ms(1000);//
-
- while(1)
- {
- for(n=0;n<22;n++)//共有11次上升沿出现
- {
- delay_ms(1);
- PAout(1)=~PAout(1);//端口翻转
- }
- while(1)//总数
- {
- COUN2=(COUN1*10)+(TIM8->CNT);
- }
- //COUN1=TIM8->CNT;
- }
- }
复制代码 TIM8中断入口- [hide]void TIM8_UP_IRQHandler(void)
- {
- if (TIM_GetITStatus(TIM8, TIM_IT_Update) != RESET)
- {
- COUN1++;
- TIM_SetCounter(TIM8,0);//清除计数器
- }
- TIM_ClearITPendingBit(TIM8,TIM_IT_Update); //清除中断标志位
-
- }[/hide]
复制代码 再次说一下进不去高级定时器中断的问题在于未设置溢出次数进入中断那里,小白第一次发帖不喜勿喷,一起努力感谢正点原子
头文件什么的随便找个原子哥的例程删掉原来的然后一条一条复制进去就好了,再根据自己需求更改
省事的复制下面
|
|