在原子的教程第7讲,通用定时器中断时候发现教程中的定时器在设置之后就产生了中断,为什么?
//程序都是例程里的。
void TIM4_IRQHandler(void)
{
if(TIM4->SR&0X0001)//溢出中断
{
LED1=!LED1;
}
TIM4->SR&=~(1<<0);//清除中断标志位
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<2;//TIM3时钟使能
TIM4->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM4->  SC=psc; //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM4->DIER|=1<<0; //允许更新中断
// TIM3->DIER|=1<<6; //允许触发中断
MY_NVIC_Init(1,3,TIM4_IRQChannel,2);//抢占1,子优先级3,组2
}
////////////////////////////////////////////////////////////////
int main(void)
{
Stm32_Clock_Init(9);//系统时钟9倍频,72M
delay_init(72);
uart_init(72,9600);//串口波特率9600
Timerx_Init(9999,7199);//7200分频率,计数10000下
LED_Init();//初始化
//LED初始化时LED0,LED1都是灭的!
while(1)
{
//printf("Welcome!\r\n");
delay_ms(1000);
LED0=!LED0;
}
}
//////////////////////////////////////////////////////////////////////////////
困惑:
1.程序应该一开始2个LED都灭掉,过1s后应该一起亮,事实是中断的LED一开始就亮了,也就是一开始就产生了中断!
2.就是“printf("Welcome!\r\n");”,想通过串口输出个字符串,(能输出)发现输出字符串好像很占时间。
吧主程序改了下,让两灯一起闪烁。同时打印
while(1)
{
printf("Welcome!\r\n");
LED0=!LED0;
delay_ms(1000);
}
//////////////////////////////////////////////////////////////////////
开始还好是一起闪烁的,在闪了3-4次之后就会发现一快一慢很是明显,难道打印字符发了很多的时间(目测大概有100MS),这是为什么
|