完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
用的定时器3的通道检测外部脉冲个数,每隔一秒读取一次CNT寄存器的值,标准库下脉冲数量正常,但是RTT里读取就会少一个脉冲
上面打印的是标准库,下面打印的是RTT RTT NANO 使用定时器ETR外部计数时会丢失脉冲 定时器代码:定时器3外部计数,定时器2产生脉冲 #include "led.h" #include "rtthread.h" static int LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_SetBits(GPIOD,GPIO_Pin_2); return 0; } INIT_BOARD_EXPORT(LED_Init); static int bsp_timer3_init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period = 65535; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_TIxExternalClockConfig(TIM3,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising,0); TIM_SetCounter(TIM3, 0); TIM_Cmd(TIM3, ENABLE); return 0; } INIT_BOARD_EXPORT(bsp_timer3_init); static int bsp_timer2_init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 100-1; TIM_TimeBaseStructure.TIM_Prescaler = 72-1; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE ); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_SetCounter( TIM2, 0 ); TIM_Cmd(TIM2, ENABLE); return 0; } INIT_BOARD_EXPORT(bsp_timer2_init); void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { LED1=!LED1; LED1=!LED1; } TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } 主函数: rt_thread_t USART_tid; static void USART_thread_entry(void* params) { while(1) { rt_kprintf("Count=%d ",TIM_GetCounter(TIM3)); TIM_SetCounter(TIM3, 0); rt_thread_mdelay(1000); } } int USART_thread(void) { USART_tid = rt_thread_create("USART", USART_thread_entry, RT_NULL, 256, 10, 5); if(USART_tid != RT_NULL) rt_thread_startup(USART_tid); return 0; } int main(void) { USART_thread(); } |
|
相关推荐
4个回答
|
|
rt_kprintf("Count=%drn",TIM_GetCounter(TIM3)); 不要把接收放在 rt_kprintf中
可以改为:rt_uint32_t cnt = TIM_GetCounter(TIM3); ,数据也可以先存数组中,后面一起打印, - rt_kprintf 打印也占用时间的!! rt_thread_mdelay(1000); 不是严格意义上的1S,可以时间长一点看计数。 |
|
|
|
static void USART_thread_entry(void* params)
{ static uint32_t now_time = 0; rt_uint32_t cnt = 0; while(1) { if((rt_tick_get()-now_time)>=1000) { cnt = TIM_GetCounter(TIM3); rt_kprintf("Count=%drn",cnt); TIM_SetCounter(TIM3, 0); now_time = rt_tick_get(); } } } 我改成这样了,还是会丢脉冲,因为是要测转速的,一圈一个脉冲,每秒读一次。 |
|
|
|
rt_tick_get 来自于 systick (系统时钟),这个1S 不是准确的,看你的脉冲 1S 10000个, 100uS一个,所以这样存在一点误差。
|
|
|
|
找到问题了,应该先TIM_SetCounter(TIM3, 0);再rt_kprintf("Count=%drn",cnt);先打印的话打印的时间有脉冲进来,再TIM_SetCounter(TIM3, 0)导致打印期间检测到的脉冲被清零了,应该是这样。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
824 浏览 0 评论
6015 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2786 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
3095 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
33036 浏览 11 评论
73559 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-2 08:32 , Processed in 0.785719 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号