- //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首次定时不准确的问题,又产生了其它问题
|