久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5036|回復: 7
收起左側

stm32如何通過定時器中斷對方波信號進行計數(上升沿或下降沿)

[復制鏈接]
ID:736707 發表于 2020-5-11 21:53 | 顯示全部樓層 |閱讀模式
我現在用的是stm32f103系列的芯片,需要對一個方波信號的上升沿或下降沿進行計數。我師傅說可以寫一個定時器中斷來進行計數。但是我不會啊。之前在網上找了一些相關的定時器中斷代碼,但是都不行。各位大佬有沒有什么好的建議啊?
回復

使用道具 舉報

ID:736707 發表于 2020-5-11 22:44 | 顯示全部樓層
之前的描述可能有點不清楚。下面說具體點:我現在接了一個方波信號在IO上,我要對1s中,方波周期(或下降沿)進行計數,得到的結果,通過串口輸出。我的想法是將某一個IO口為輸入模式,然后通過定時器中斷對1s中的下降沿進行計數。然后保存在某一個變量里面,通過串口輸出。是這樣嗎?如果這樣的話應該怎么寫呢?直接編一個函數將IO口設為輸入,然后通過定時器中斷對其進行計數?
回復

使用道具 舉報

ID:344220 發表于 2020-5-11 23:49 | 顯示全部樓層
定時器輸入捕獲功能了解一下
回復

使用道具 舉報

ID:732506 發表于 2020-5-12 06:33 | 顯示全部樓層
定時器配合INT外部中斷,方波觸發int中斷,int計數,定時器計時。
回復

使用道具 舉報

ID:94031 發表于 2020-5-12 08:46 | 顯示全部樓層
定時器可以設定成外部引腳中斷的計數器,將方波信號接到這個引腳就可以計數。
回復

使用道具 舉報

ID:736707 發表于 2020-5-12 15:12 | 顯示全部樓層
xuyaqi 發表于 2020-5-12 08:46
定時器可以設定成外部引腳中斷的計數器,將方波信號接到這個引腳就可以計數。

這個定時器初始化函數就是把它設為外部計數模式嗎?它設置的引腳是PA0,我直接把方波信號引腳接到PA0之后,然后用定時器中斷設置1s對它進行計數,計數用的是我在網上找的if(GPIOA->IDR& GPIO_IDR_IDR0)這個語句。這個可以嗎?我試了一下,但是不行。大佬有時間能幫我看一下嗎
static  int i = 0 ;
u32 count0=0;u32 count1=0;       
//通用定時器中斷初始化
//這里時鐘選擇為APB1的2倍,而APB1為36M
//arr:自動重裝值。
//psc:時鐘預分頻數
//這里使用的是定時器2
void Timer2_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;           //上拉輸入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M時鐘速度
        GPIO_Init(GPIOA, &GPIO_InitStructure);
   
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //時鐘使能
        TIM_DeInit(TIM2);
        TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值         計數到5000為500ms arr
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值  10Khz的計數頻率                   
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設0置時鐘分割:TDTS = Tck_tim           psc
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位

        TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); //設置為外部計數模式
        TIM_SetCounter(TIM2, 0);                                         //計數器清零
        TIM_Cmd(TIM2, ENABLE);  //使能TIMx外設
                                                         
}
void TIM2_IRQHandler()
{
       
        int a = 0;
        if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) //產生一次中斷為1s
        {
                if(GPIOA->IDR& GPIO_IDR_IDR0)//判斷PA0是否為高電平
                {
                        i++;
                        printf("i:%d\r\n",i);
                }
                else
                {
                        a++;
                        printf("i:%d\r\n",a);
                }
               
         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
        }
}

u16 getspeed()
        {
        u16 deta;
        count0=count1;
        delay_ms(50);                                         //deta t=50ms
        count1=TIM2->CNT;
        if(count1<count0)                                //如果溢出
        {
        deta=0xffff-count0+count1;
        }
        else
        deta=count1-count0;
        return deta;
        }
回復

使用道具 舉報

ID:736707 發表于 2020-5-12 15:19 | 顯示全部樓層
hotpet 發表于 2020-5-12 06:33
定時器配合INT外部中斷,方波觸發int中斷,int計數,定時器計時。

大佬,您好。我也想用定時器中斷,但是不知道為什么不行,下面是相關代碼,您有時間幫我看一下好嗎?
這是time.c代碼:
#include "timer.h"
static  int i = 0 ;
u32 count0=0;u32 count1=0;       
//通用定時器中斷初始化
//這里時鐘選擇為APB1的2倍,而APB1為36M
//arr:自動重裝值。
//psc:時鐘預分頻數
//這里使用的是定時器2
void Timer2_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;           //上拉輸入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M時鐘速度
        GPIO_Init(GPIOA, &GPIO_InitStructure);
   
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //時鐘使能
        TIM_DeInit(TIM2);
        TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值         計數到5000為500ms arr
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值  10Khz的計數頻率                   
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設0置時鐘分割:TDTS = Tck_tim           psc
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位

        TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); //設置為外部計數模式
        TIM_SetCounter(TIM2, 0);                                         //計數器清零
        TIM_Cmd(TIM2, ENABLE);  //使能TIMx外設
                                                         
}
void TIM2_IRQHandler()
{
       
        int a = 0;
        if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) //產生一次中斷為1s
        {
                if(GPIOA->IDR& GPIO_IDR_IDR0)//判斷PA0是否為高電平
                {
                        i++;
                        printf("i:%d\r\n",i);
                }
                else
                {
                        a++;
                        printf("i:%d\r\n",a);
                }
               
         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
        }
}

下面是主函數main.c
int main(void)
{
       
        NVIC_Configuration() ;
        RCC_ClocksTypeDef     RCC_Clocks;
        RCC_Configuration();
  RCC_GetClocksFreq(&RCC_Clocks);

        Timer2_Init(0xffff,0);
        USART1_Init(9600);

        delay_init();
        LED_Init();
        DHT11_Init();
  DS1302_Init();
        DS1302_Write_Time();
        DS1302_Read_Time();
        display1();
        while(1)
        {
//                DS1302_Get_Time(time);
//                display_time(time);
//               
//                DHT11_Read_Data(&temperature,&humidity) ;
//                display_dht11(temperature,humidity);
               
                sprintf((char *)display,"FS: ") ;       
                LCD_Print(1,4,display) ;       
                Speed=getspeed();       

               
回復

使用道具 舉報

ID:736707 發表于 2020-5-12 15:21 | 顯示全部樓層
hotpet 發表于 2020-5-12 06:33
定時器配合INT外部中斷,方波觸發int中斷,int計數,定時器計時。

大佬,您好。我也想用定時器中斷,但是不知道為什么不行,下面是相關代碼,您有時間幫我看一下好嗎?
這是time.c代碼:
#include "timer.h"
static  int i = 0 ;
u32 count0=0;u32 count1=0;       
//通用定時器中斷初始化
//這里時鐘選擇為APB1的2倍,而APB1為36M
//arr:自動重裝值。
//psc:時鐘預分頻數
//這里使用的是定時器2
void Timer2_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;           //上拉輸入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M時鐘速度
        GPIO_Init(GPIOA, &GPIO_InitStructure);
   
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //時鐘使能
        TIM_DeInit(TIM2);
        TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值         計數到5000為500ms arr
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值  10Khz的計數頻率                   
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設0置時鐘分割:TDTS = Tck_tim           psc
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位

        TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); //設置為外部計數模式
        TIM_SetCounter(TIM2, 0);                                         //計數器清零
        TIM_Cmd(TIM2, ENABLE);  //使能TIMx外設
                                                         
}
void TIM2_IRQHandler()
{
       
        int a = 0;
        if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) //產生一次中斷為1s
        {
                if(GPIOA->IDR& GPIO_IDR_IDR0)//判斷PA0是否為高電平
                {
                        i++;
                        printf("i:%d\r\n",i);
                }
                else
                {
                        a++;
                        printf("i:%d\r\n",a);
                }
               
         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
        }
}

下面是主函數main.c
int main(void)
{
       
        NVIC_Configuration() ;
        RCC_ClocksTypeDef     RCC_Clocks;
        RCC_Configuration();
  RCC_GetClocksFreq(&RCC_Clocks);

        Timer2_Init(0xffff,0);
        USART1_Init(9600);

        delay_init();
        LED_Init();
        DHT11_Init();
      DS1302_Init();
        DS1302_Write_Time();
        DS1302_Read_Time();
        display1();
        while(1)
        {       
                sprintf((char *)display,"FS: ") ;       
                LCD_Print(1,4,display) ;       
                Speed=getspeed();       
                 printf("speed:%d",Speed);
         }
}
我在定時器中斷里面有串口輸出,但是串口沒有顯示
               
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 青青草这里只有精品 | 欧美成年网站 | 久久精品国产一区二区三区 | 亚洲狠狠 | 国产一区在线视频 | 天天操天天射天天 | 日韩在线视频观看 | 亚洲第一免费播放区 | 成人在线亚洲 | 91久久| 99精品视频在线观看免费播放 | 国产激情一区二区三区 | 亚洲视频二区 | 黄色一级电影在线观看 | 中文字幕韩在线第一页 | 女同av亚洲女人天堂 | 国产成人精品午夜视频免费 | 日本精品一区二区 | 精品一区二区三区入口 | 国产精品久久久久无码av | 色综合美女 | 欧美日韩不卡合集视频 | 国内在线视频 | 国产精品久久久久久婷婷天堂 | 99热播放| 国产精品久久一区 | 国产综合精品 | 91传媒在线观看 | 亚洲一区二区视频 | 日韩一区二区在线视频 | 国产精品嫩草影院精东 | 精品一区电影 | 欧美国产日韩精品 | 国产女人第一次做爰毛片 | 亚洲欧洲精品一区 | 欧美精品在线播放 | 久久精品视频网站 | 午夜精品一区二区三区在线 | 羞羞视频一区二区 | 国产精品九九视频 | 日韩美女爱爱 |