完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我写了个程序,但未能实现STM32F407ZET6高级定时器tiM1的输入捕获,编译没问题,但就是捕获不到沿跳变,求大神指点!
以下是我写的程序: /***************main.c*****************************/ #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "timer.h" int main(void) { u16t=0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(168); uart_init(115200); LED_Init(); timer1_cap1_init(9999,167);//10ms溢出一次 while(1) { delay_ms(10); t++; if(t==50) { t=0; LED0 =!LED0; } } } /****************************timer.c**********************/ #include"timer.h" #include"sys.h" #include"led.h" u8 sta; // [7], 0,没有完成一次捕获;1,已经完成一次捕获 //[6], 0,没有捕获到上升沿;1,;已经捕获到上升沿 //[5:0], 捕获到高电平后定时器的溢出次数 u16 timer1_val=0; void timer1_cap1_init(u16 arr,u16 psc) { GPIO_InitTypeDefGPIO_InitStructure; TIM_TimeBaseInitTypeDefTIM_TimeBseInitStructure; TIM_ICInitTypeDefTIM_ICInitStructure; NVIC_InitTypeDefNVIC_InitSructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_TIM1); TIM_TimeBseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBseInitStructure.TIM_Period=arr; TIM_TimeBseInitStructure.TIM_Prescaler=psc; //TIM_TimeBseInitStructure.TIM_RepetitionCounter= TIM_TimeBaseInit(TIM1,&TIM_TimeBseInitStructure); TIM_ICInitStructure.TIM_Channel=TIM_Channel_1; 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=0x00; TIM_ICInit(TIM1,&TIM_ICInitStructure); TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC1,ENABLE); TIM_Cmd(TIM1,ENABLE); NVIC_InitSructure.NVIC_IRQChannel=TIM1_UP_TIM10_IRQn; NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority=1; NVIC_InitSructure.NVIC_IRQChannelSubPriority=2; NVIC_InitSructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitSructure); NVIC_InitSructure.NVIC_IRQChannel=TIM1_CC_IRQn; NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority=1; NVIC_InitSructure.NVIC_IRQChannelSubPriority=3; NVIC_InitSructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitSructure); } void TIM1_UP_TIM10_IRQHandler(void) { if(TIM_GetITStatus(TIM1,TIM_IT_Update)!=RESET) { if(sta&0x40)//判断是否已经捕获到上升沿 { sta++; if(sta&0x3f==0x3f) { sta|=0x80; timer1_val=0xffff; } } } TIM_ClearITPendingBit(TIM1,TIM_IT_Update); } void TIM1_CC_IRQHandler(void) { if(TIM_GetITStatus(TIM1,TIM_IT_CC1)!=RESET) { if((sta&0x80)==0)//判断是否已经完成一次捕获 { if(sta&0x40) //判断是否已经捕获到上升沿 { timer1_val=TIM_GetCapture1(TIM1); TIM_OC1PolarityConfig(TIM1,TIM_ICPolarity_Rising); sta|=0x80; LED1=!LED1; } else//如果之前没有捕获到上升沿 { sta=0; timer1_val=0; sta=0x40;//标记已经捕获到上升沿 TIM_Cmd(TIM1,DISABLE); TIM_SetCounter(TIM1,0); TIM_OC1PolarityConfig(TIM1,TIM_ICPolarity_Falling); TIM_Cmd(TIM1,ENABLE); } } } TIM_ClearITPendingBit(TIM1,TIM_IT_CC1); } |
|
相关推荐
5个回答
|
|
你可以用库函数版本,寄存器版本上手较慢,初学者很难了解所有寄存器。如果实在想这样写,那就问原子
|
|
|
|
这个程序已经是库函数版本的了 |
|
|
|
|
|
|
|
刚弄个开发板,慢慢研究看看!!!
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
122 浏览 0 评论
565 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
772 浏览 0 评论
948 浏览 2 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
658 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12041 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 21:43 , Processed in 0.826100 second(s), Total 79, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号