股票

STM8S103定时中断初始化

使用timer4做一个1K的定时器中断
timer.c

  1. void timer4_init()
  2. {
  3.     TIM4_IER = 0x00;    //禁止中断
  4.     TIM4_EGR = 0x01;    //允许产生更新事件
  5.     TIM4_PSCR = 0x06;   //计数器时钟=主时钟/2^TIM4_PSCR=16M/2^6==>16us
  6.     TIM4_ARR = 249;     //设定重装载时寄存器值
  7.     TIM4_CNTR = 0;  //设定计数器的初值
  8.     //定时周期=(ARR+1)*64=1ms
  9.     TIM4_CR1 = 0x01;    //b0=1,允许计数器工作; b1=0,允许更新
  10.     TIM4_IER = 0x01;    //允许更新中断
  11. }

stm8_interrupt_vector.c中添加:

  1. /* Timer4更新中断服务程序 */
  2. @far @interrupt void TIM4_UPD_OVF_IRQHandler( void )
  3. {
  4.     static unsigned int ii = 0;
  5.     if ( ii & gt; 30000 )
  6.         ii = 1;
  7.     else
  8.         ii++;
  9.     if ( ii % 1000 == 0 )
  10.         read_adc( ADC_Channel3 );
  11.     TIM4_SR     = 0x00;                         /* 清除更新标志 */
  12.     PA_ODR      = PA_ODR ^ (1 & lt; < 3);    /* PA3取反 */
  13.     TIM4_CNTR   = 0;                            /* 置0 */
  14.     return;
  15. }

这里实现了两个功能,一个是每秒读一次ADC同时发送到串口,另一个是为PA3反复置位,以便用示波器检测中断频率是不是1K。当然,中断函数中海需要添加:

  1. {0x82, TIM4_UPD_OVF_IRQHandler}, /* irq23 */

还有就是系统时钟默认在启动后会8分频,所以还要对时钟初始化:

 
  1. void clk_init()
  2. {
  3.     CLK_CKDIVR = 0x00;  //fcpu
  4. }
打赏
原文链接:,转发请注明来源!

发表评论