//STM8S105_UART2_TIM4 ,IAR V3.11 。每个新工程必须设置:芯片型号 、输出hex 、ST_Link
//STM8的TIM4/6是最简单的8位定时计数器,基本上只具备自动重载和计数溢出中断功能。
//设置自动重装载寄存器时,新写入的值可以立刻生效,也可以设置为有新的事件产生时才能生效。
//设置预分频寄存器时,新写入的值不会立刻生效,必须要等到有新的事件产生时才能生效。
//什么是事件产生呢?就是计数溢出,或者写1到事件产生寄存器的UG位。
//其实预分频寄存器和自动重装载寄存器都属于缓冲器,真正起作用的是它们背后的影子寄存器。
//事件产生时,这两个缓冲寄存器的值都会立刻更新到影子寄存器。
#include "stdio.h"
#include "iostm8s105k4.h"
#include "UART.h"
#define TIM4_IF_Clear() TIM4_SR=0x00 //清除中断标记
unsigned short i, isr[17];
unsigned char n=0, n2=0;
//****************************************************************************
void SYSTEM_Init(void)
{
CLK_ICKR=0x01; //HSI_EN,高速内部RC振荡器使能,16MHz
CLK_CKDIVR=((0<<3)|0); //HSI分频取值0-3,CPU分频取值0-7 ,它们都代表1/2/4/8/...分频
CLK_PCKENR1=0xFF; //全部外设时钟使能,可关闭不用的外设时钟以实现节能
CLK_PCKENR2=0xFF;
}
//****************************************************************************
void TIM4_Init(void)
{
TIM4_CR1_ARPE=1; //使能自动重装载寄存器缓冲器,该语句可以取消
TIM4_CR1_URS=1; //计数溢出时才产生事件,自动重装载影子寄存器更新时不产生事件,重要语句!
TIM4_PSCR=7; //128分频,最大128分频
TIM4_ARR=249; //中断频率 = 时钟 /(n分频 * (TIM4_ARR+1)),如果时钟是16MHz,则中断频率=500Hz
TIM4_EGR_UG=1; //人为产生更新事件,使能预分频值(也包括自动重装载值)更新到影子寄存器,并且计数重新开始
TIM4_IER_UIE=1; //计数溢出中断使能
TIM4_CR1_CEN=1; //TIM使能
}
//****************************************************************************
#pragma vector=23+2 //中断向量,由于中断向量号前面有两个空缺,因此要偏移
__interrupt void TIM4_Isr(void) //TIM4中断函数,函数名可以自定义
{
if(n<17) //每次中断都记录主循环i的值
{
isr[n]=i;
n++;
}
TIM4_SR=0x00; //清零中断标记
i=0;
}
//****************************************************************************
int main( void )
{
SYSTEM_Init(); //系统初始化
UART2_Init(); //串口2初始化
printf("QQ68354248\n"); //使用该语句前必须包含stdio.h文件并重定义putchar函数
TIM4_Init(); //TIM4初始化
TIM4_IF_Clear();
asm("RIM"); //插入汇编,使能全局中断
while(1)
{
i++;
if(n==17)
{
for(n2=0; n2<17; n2++)
{
printf("前10次中断后 i = %u\n",isr[n2]); //用系统的函数显示
//UART2_ShowU16(isr[n2]); //或者用自己写的函数显示
//UART2_SendEnter();
}
while(1); //进入死循环
}
}
}
解决了IAR STM8 TIM4首次定时不准确的问题,又产生了其它问题 |