用的定时器3的通道检测外部脉冲个数,每隔一秒读取一次CNT寄存器的值,标准库下脉冲数量正常,但是RTT里读取就会少一个脉冲
上面打印的是标准库,下面打印的是RTT
RTT NANO 使用定时器ETR外部计数时会丢失脉冲
定时器代码:定时器3外部计数,定时器2产生脉冲
#include "led.h"
#include "rtthread.h"
sta
tic 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();
}
0