使用timer4做一个1K的定时器中断。
timer.c
- void timer4_init()
- {
- TIM4_IER = 0x00; //禁止中断
- TIM4_EGR = 0x01; //允许产生更新事件
- TIM4_PSCR = 0x06; //计数器时钟=主时钟/2^TIM4_PSCR=16M/2^6==>16us
- TIM4_ARR = 249; //设定重装载时寄存器值
- TIM4_CNTR = 0; //设定计数器的初值
- //定时周期=(ARR+1)*64=1ms
- TIM4_CR1 = 0x01; //b0=1,允许计数器工作; b1=0,允许更新
- TIM4_IER = 0x01; //允许更新中断
- }
stm8_interrupt_vector.c中添加:
- /* Timer4更新中断服务程序 */
- @far @interrupt void TIM4_UPD_OVF_IRQHandler( void )
- {
- static unsigned int ii = 0;
- if ( ii & gt; 30000 )
- ii = 1;
- else
- ii++;
- if ( ii % 1000 == 0 )
- read_adc( ADC_Channel3 );
- TIM4_SR = 0x00; /* 清除更新标志 */
- PA_ODR = PA_ODR ^ (1 & lt; < 3); /* PA3取反 */
- TIM4_CNTR = 0; /* 置0 */
- return;
- }
这里实现了两个功能,一个是每秒读一次ADC同时发送到串口,另一个是为PA3反复置位,以便用示波器检测中断频率是不是1K。当然,中断函数中海需要添加:
- {0x82, TIM4_UPD_OVF_IRQHandler}, /* irq23 */
还有就是系统时钟默认在启动后会8分频,所以还要对时钟初始化:
- void clk_init()
- {
- CLK_CKDIVR = 0x00; //fcpu
- }