
STM32的低功耗模式
STM32F103C8T6 TIM1 CH2输入捕获触发DMA的问题
四轴飞行器
不清楚为什么正点原子的例程,想添加SCB添加到watch1却是无效的(在core_cm3.h定义的寄存器都不可以),但是可以添加GPIOA并且有效(stm32f10x.h定义的寄存器都可以)
不知道为什么用正点原子的开源例程硬件仿真时。想观察寄存器的值,所以添加到watch1观察,不清楚为啥SCB,NVTC等都添加了但是无效,但是GPIOA却又可以。
STM32的上电启动过程
STM32中如何实现数据加密
STM32的I2S外设
为何Tim2自动装载定时的首次中断时间总是设定时间的2倍?
如何提高开发板的抗干扰能力?
你手动把编码器的计数值设置为500,是指修改TIMx->CNT的值吗? 如果是,
不是很明白你所说的ARR=4000,计数器初始值为500,计数器的计数变为正常的两倍是什么意思?
计数快慢是正常的两倍 还是计数周期变为原来两倍? 另外你的两倍是怎么统计出来的,还是说只是大概感觉?
CNT的确可以手动修改,不过当TIMER对编码信号做向上计数时,如果你给定的初始CNT值比ARR大的话,是会发生
计数器要一直计数到硬件默认满量程,比如16位TIMER的话就是记到0xffff才会调头,不过这个时间段跟正常计数时
间段就未必一定是两倍关系,这点你要注意。
你好是的,我的意思就是CNT设置为500,arr设置为40000,计数速度变为原来的两倍,计数最大值没变,(两倍是我用另一个恩利浦的角度传感器测的),技术速度确实快了两倍,比如应该1s计数增加或减少200,结果增加或减少了400。而且我发现只要计数器计数到4000溢出一次就正常了,我是在编码器停止转动的时候改的CNT的值,而且我发现不在keildebug模式下调试,就正常下进去程序运行的话,不会出现这种情况
这是代码***************************************************/
void ENCODER_Init()
{
//端口配置
RCC->APB2ENR |= 1<<2; /*开启PA时钟*/
GPIOA->CRL &= 0x0000FFFF;
GPIOA->CRL |= 0x44880000; /*PA6和PA7浮空输入*/
GPIOA->ODR |= 1<<4;
GPIOA->ODR |= 1<<5;
//EXTI配置
RCC->APB2ENR |= 1<<0 ; /*使能io复用时钟*/
AFIO->EXTICR[ 1 ] &= 0xFFF0 ;
EXTI->IMR |= 1<<4 ; /*清除原来的设置*/
EXTI->FTSR |= 1<<4 ; /*下降沿触发*/
MY_NVIC_Init( 2, 2, EXTI4_IRQn, 2 ) ;
//定时器3配置
RCC->APB1ENR |= 1<<1 ; /*开启TIM3时钟*/
TIM3->PSC = 1; /*精确度y预分频*/
TIM3->ARR = 39999 ; /*重装值0 65535*/
TIM3->CCMR1 |= 1<<0 ; /*输入端IC1映射到TI1上*/
TIM3->CCMR1 |= 1<<8 ; /*IC2FP2映射到TI2*/
TIM3->CCMR1 |= 3<<4 ; /*输入捕获1滤波器*/
TIM3->SMCR |= 3<<0 ; /*编码器模式3:所有的输入均在上升沿和下降沿有效*/
TIM3->DIER |= 1<<6 ; /*允许捕获中断*/
TIM3->DIER |= 1<<0 ; /*允许更新中断*/
TIM3->CR1 |= 1<<0 ; /*使能定时器3*/
TIM3->CNT = 0;
MY_NVIC_Init( 2, 0, TIM3_IRQn, 2 ) ; /*抢占2,子优先级0,组2*/
}
哦。
可以肯定,CNT是可以修改的,但它肯定没法影响计数速率,因为计数速率完全由硬件决定的,
即你外部输入脉冲的速率没变,实际计数速率就不会变。
你看看是否哪里计算搞误会了。比方:你现在临时调整了计数初值,并非从0一路自然计数过来的,
在做计算时是否注意到这点了。