STM8G-学习 发表于 2024-12-25 10:08:06

8G1K08-38I-QFN20计数器使用问题|已解决

问题:目前是使用定时器0的T0外部计数输入,然后使用定时器1每隔1ms取定时器0的TH,TL值一次,并将TH,TL值赋值为0;目前出来的数据很乱,不知道为什么。请帮我看看程序是否有问题吧?

#include      "config.h"
//#include      "STC8G_PCA.h"
#include      "STC8G_H_GPIO.h"
#include      "STC8G_H_UART.h"
#include      "STC8G_H_NVIC.h"
#include      "STC8G_H_Delay.h"
#include      "STC8G_H_Switch.h"
#include      "STC8G_H_Timer.h"

/*************   功能说明   ***************

本例程基于STC8G1K08-20PIN进行编写测试,STC8G系列芯片可通用参考.

/******************** IO口配置 ********************/
void      GPIO_config(void)
{
      GPIO_InitTypeDef      GPIO_InitStructure;                              //结构定义

      GPIO_InitStructure.Pin= GPIO_Pin_All;                        //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
      GPIO_InitStructure.Mode = GPIO_PullUp;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);      //初始化
   
      GPIO_InitStructure.Pin= GPIO_Pin_2;                        //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
      GPIO_InitStructure.Mode = GPIO_OUT_PP;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);      //初始化

      GPIO_InitStructure.Pin= GPIO_Pin_7;                              //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
      GPIO_InitStructure.Mode = GPIO_OUT_PP;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);      //初始化
    GPIO_InitStructure.Pin= GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3;                              //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
      GPIO_InitStructure.Mode = GPIO_HighZ;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);      //初始化
}

/***************串口初始化函数 *****************/
void      UART_config(void)
{
      COMx_InitDefine                COMx_InitStructure;                                        //结构定义

      COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;      //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
//      COMx_InitStructure.UART_BRT_Use   = BRT_Timer2;                        //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
      COMx_InitStructure.UART_BaudRate= 115200;                        //波特率, 一般 110 ~ 115200
      COMx_InitStructure.UART_RxEnable= ENABLE;                              //接收允许,   ENABLE或DISABLE
      COMx_InitStructure.BaudRateDouble = DISABLE;                        //波特率加倍, ENABLE或DISABLE
      UART_Configuration(UART2, &COMx_InitStructure);                //初始化串口1 UART1,UART2,UART3,UART4
      NVIC_UART2_Init(ENABLE,Priority_3);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

      UART2_SW(UART2_SW_P10_P11);                //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}

void      Timer1_config(void)
{
    TMOD =0x00;
    TL1 = 0X66;                                 //65536-11.0592M/12/1000
    TH1 = 0XFC;
    TR1 = 1;                                    //启动定时器
    ET1 = 1;                                    //使能定时器中断
    IPH=IPH|PT1H;
    PT1 =1;
}


void Timer0_config(void)
{
    TMOD=0x04;                              //外部计数模式,自动重载值
    TL0 =0X0;
    TH0 =0X0;
    TR0 = 1;                                    //启动定时器
    ET0 = 1;                                    //使能定时器中断
    IPH =IPH;
    PT0 = 1;

}

u16                CYCLE_COUNT=0,CYCLE_COUNT_L=0,th=0,tl=0;
u32 CYCLE_COUNT1=0;
u8 CYCLE_COUNT_H=0;

void Timer1_ISR_Handler (void) interrupt TMR1_VECTOR                //进中断时已经清除标志
{
    th=TH0;tl=TL0;CYCLE_COUNT=th*0xff+tl;
    TH0=0;TL0=0;

    CYCLE_COUNT1++;
    if(CYCLE_COUNT1>1000){CYCLE_COUNT1=0;OUT_PIN=!OUT_PIN;}
}


void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR                //进中断时已经清除标志
{

}

void main(void)
{   
    EAXSFR();                /* 扩展寄存器访问使能 */
    GPIO_config();
    UART_config();
    Timer1_config();
    Timer0_config();
//    INTCLKO = 0x10;
//    IPH=IPH|PX1H;
    AUXR=AUXR|0x80;
    EA = 1;

    printf("****************printf test********************** \r\n");

    while(1)//改为1ms计数一次判断高低电平
    {
      
      printf("CYCLE_COUNT=%u\n",CYCLE_COUNT);
      CYCLE_COUNT=0;
      delay_ms(100);
      
    }
}




STM8G-学习 发表于 2024-12-25 10:09:11

这是出来的数据:

STM8G-学习 发表于 2024-12-25 10:14:00

这是外部输入波形:

Ayb_ice 发表于 2024-12-25 10:47:28

定时器要飞读,因为在运行,随时可能tl0向TH0进位

DebugLab 发表于 2024-12-25 10:53:58

定时器0要设置为不自动重载模式

STM8G-学习 发表于 2024-12-25 11:45:09

Ayb_ice 发表于 2024-12-25 10:47
定时器要飞读,因为在运行,随时可能tl0向TH0进位

谢谢您,很有用,我已经加上去了。

STM8G-学习 发表于 2024-12-25 11:46:45

DebugLab 发表于 2024-12-25 10:53
定时器0要设置为不自动重载模式

感谢版主,我改了结果就好了。

STM8G-学习 发表于 2024-12-25 11:49:11

DebugLab 发表于 2024-12-25 10:53
定时器0要设置为不自动重载模式

但是我有个疑问:就是我在输入频率8M(第一张示波器图片)多的时候,输出如下,不知道为什么。

DebugLab 发表于 2024-12-25 12:46:52

STM8G-学习 发表于 2024-12-25 11:49
但是我有个疑问:就是我在输入频率8M(第一张示波器图片)多的时候,输出如下,不知道为什么。 ...

这有什么问题吗?

STM8G-学习 发表于 2024-12-25 13:06:51

DebugLab 发表于 2024-12-25 12:46
这有什么问题吗?

谢谢您的回复,计数器的数值的每1ms取一次值,对的那个是外输入频率2.9M,我的值是2900左右,符合。这次外输入频率8.4M,我以为值应为8400左右才对。
页: [1] 2
查看完整版本: 8G1K08-38I-QFN20计数器使用问题|已解决