<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • 用GPIO實(shí)現(xiàn)多路外部中斷及脈沖計(jì)數(shù)

     2019-4-23     作者:黃志超         
    文章標(biāo)簽:C/C++GPIO

      英創(chuàng)工控主板都給用戶(hù)提供了豐富的GPIO資源,在ESMARC系列的板卡上配置了32位GPIO,GPIO(General-purpose input/output)即通用輸入輸出,在實(shí)際使用中有多種用途,而作為外部中斷輸入便是較常用的功能,通過(guò)對(duì)外部輸入中斷的響應(yīng),可以滿(mǎn)足多種應(yīng)用需求,脈沖計(jì)數(shù)就是一種典型的應(yīng)用。英創(chuàng)主板已經(jīng)給用戶(hù)提供了兩路中斷功能,是采用異步IO的方式,電平上升沿觸發(fā)中斷,通過(guò)信號(hào)量SIGIO通知應(yīng)用程序,關(guān)于詳細(xì)的資料可以參考網(wǎng)站:《ESM335x外部中斷輸入應(yīng)用》


      為了讓用戶(hù)能夠使用到更多外部輸入中斷,英創(chuàng)公司進(jìn)一步在驅(qū)動(dòng)中增加了相應(yīng)的功能和接口,利用IO多路復(fù)用的技術(shù)讓所有GPIO都能夠作為外部中斷輸入,通過(guò)程序設(shè)置使能,一旦管腳電平發(fā)生變化,內(nèi)核就會(huì)通知應(yīng)用程序,這時(shí)使用select或者poll函數(shù)就可以接收到內(nèi)核發(fā)出的消息。通過(guò)這種方式,用戶(hù)可以將主板的32位GPIO全部作為外部中斷輸入,而原來(lái)提供的采用異步IO方式的兩路中斷我們?cè)瓌t上就不再做更新和維護(hù),建議客戶(hù)使用我們最新提供的方法。下面就以?xún)陕稧PIO的脈沖計(jì)數(shù)功能為例,介紹如何通過(guò)select或者poll函數(shù)實(shí)現(xiàn)外部中斷響應(yīng)。


      首先要啟用中斷輸入功能,這一步需要調(diào)用英創(chuàng)公司提供的設(shè)置GPIO為輸入狀態(tài)的API函數(shù)來(lái)實(shí)現(xiàn)。也就是在程序中調(diào)用一次函數(shù),設(shè)置GPIO為輸入狀態(tài),就能把對(duì)應(yīng)的GPIO管腳設(shè)置為外部中斷輸入功能,如設(shè)置GPIO0和GPIO23為中斷輸入,代碼如下:

      int GPIO_OutDisable(fd, GPIO0 | GPIO23)


      當(dāng)設(shè)置完成后,GPIO作為輸入狀態(tài),同時(shí)會(huì)監(jiān)測(cè)外部輸入電平變化,并通過(guò)內(nèi)核驅(qū)動(dòng)通知應(yīng)用層。應(yīng)用程序使用select或者poll函數(shù)來(lái)監(jiān)聽(tīng)GPIO的句柄的讀事件就能夠獲取到通知,用戶(hù)可以通過(guò)多線(xiàn)程的方式來(lái)實(shí)現(xiàn),通過(guò)select函數(shù)實(shí)現(xiàn)代碼如下:


    while( 1 )
      {
        //設(shè)置讀事件
        FD_ZERO(&fdRead);
        FD_SET(fd,&fdRead);
     
        //設(shè)置超時(shí)時(shí)間
      aTime.tv_sec = 0;
      aTime.tv_usec = 20000;
     
      ret = select(fd+1,&fdRead,NULL,NULL,&aTime);
     
                  if (ret < 0 )
                  {
                         printf("error!\n");
                         break;
                  }
     
                  if (ret > 0)
                  {
                         //判斷是否讀事件
                         if (FD_ISSET(fd,&fdRead))
                         {
                                dwPinState = GPIO0 | GPIO23;
                                rc = GPIO_PinState(fds.fd, &dwPinState);
                                if(rc< 0)
                                {
                                       printf("GPIO_PinState::failed %d\n", rc);
                                       returnrc;
                                }
     
    //根據(jù)上升沿對(duì)脈沖計(jì)數(shù)
                                if(dwPinState& GPIO0)
                                       pulse1_num++;
                                if(dwPinState& GPIO23)
                                       pulse2_num++;
     
    //計(jì)數(shù)到500就退出
                                if(pulse1_num == 500 && pulse2_num == 500)
                                {
                                       printf("the pules number is 500\n");
                                       break;
                                }
                         }
                 }
          }
         close(fd);
          return 0;


      使用poll函數(shù)也是類(lèi)似的,同樣的需要先使能GPIO的外部中斷輸入功能,即調(diào)用一次設(shè)置GPIO為輸入狀態(tài)的函數(shù),然后使用poll函數(shù)來(lái)監(jiān)聽(tīng)GPIO的句柄的讀事件就能夠獲取到通知,具體代碼如下:


    while(1)
           {
                  structpollfdfds;
                  int timeout;
     
    //設(shè)置監(jiān)聽(tīng)句柄
                  fds.fd = fd;
    //設(shè)置讀事件
                  fds.events = POLLIN;
    //設(shè)置超時(shí)時(shí)間
                  timeout = 20000;
     
                  ret = poll(&fds, 1, timeout);
                  if (ret < 0 )
                  {
                         printf("error!\n");
                         break;
                  }
     
                  if (ret > 0)
                  {
                         //判斷是否讀事件
                         if (fds.revents == POLLIN)
                         {
                                dwPinState = GPIO0 | GPIO23;
                                rc = GPIO_PinState(fds.fd, &dwPinState);
                                if(rc< 0)
                                {
                                       printf("GPIO_PinState::failed %d\n", rc);
                                       returnrc;
                                }
     
    //根據(jù)上升沿對(duì)脈沖計(jì)數(shù)
                                if(dwPinState& GPIO0)
                                       pulse1_num++;
                                if(dwPinState& GPIO23)
                                       pulse2_num++;
     
    //計(jì)數(shù)到500就退出
                                if(pulse1_num == 500 && pulse2_num == 500)
                                {
                                       printf("the pules number is 500\n");
                                       break;
                                }
                         }
                  }
          }
         close(fd);
          return 0;


      當(dāng)輸入電平發(fā)生變化,select和poll函數(shù)偵測(cè)到讀事件,就可以進(jìn)行相應(yīng)的操作,示例代碼通過(guò)判斷上升沿來(lái)計(jì)數(shù)脈沖數(shù),經(jīng)過(guò)測(cè)試,上述代碼能對(duì)兩路2KHz的脈沖實(shí)現(xiàn)可靠計(jì)數(shù)。用戶(hù)還可以根據(jù)實(shí)際的應(yīng)用需求,把上述代碼修改為支持多路脈沖計(jì)數(shù)功能。


      對(duì)于不需要外部輸入中斷功能的用戶(hù)也不會(huì)有什么影響,當(dāng)調(diào)用函數(shù)將GPIO設(shè)置為輸入后,不使用select和poll函數(shù)去監(jiān)聽(tīng)GPIO的句柄即可,其他功能都和原來(lái)保持一致。如有感興趣的客戶(hù),可以英創(chuàng)工程師聯(lián)系索取代碼。

    文章標(biāo)簽:C/C++GPIO
    亚洲国产精品美女| 久久精品国产久精国产| 好吊妞这里有精品| 精品国产伦一区二区三区在线观看 | 国产精品亚洲高清一区二区| 国产成人精品日本亚洲语音| 国产精品高清一区二区三区不卡| 精品久久香蕉国产线看观看亚洲| 国产亚洲情侣久久精品| 国产精品麻豆成人AV电影艾秋| 国产精品夜色一区二区三区| 3d动漫精品啪啪一区二区中文| 久久精品九九亚洲精品天堂| 久久精品国产精品亚洲艾草网美妙| 国产激情精品一区二区三区| 亚洲国产精品视频| 亚洲精品综合久久| 国产国拍亚洲精品福利| 久久久久久无码国产精品中文字幕 | 91国在线啪精品一区| 精品精品国产高清a毛片| 久久93精品国产91久久综合| 精品亚洲一区二区三区在线观看| 国产伦精品一区二区三区视频猫咪| 精品久久久久中文字| 日韩精品无码免费专区午夜| 极品精品国产超清自在线观看| 老司机99精品99| 99精品中文字幕| 国产精品亚洲精品观看不卡| 亚洲av日韩精品久久久久久a| 国产精品xxx电影| 久久福利青草精品资源站免费| 青青青青久久精品国产h| 欧洲精品99毛片免费高清观看 | 精品视频无码一区二区三区| 2021成人国产精品| 中文字幕一区日韩精品| 国产精品任我爽爆在线播放| 精品女同一区二区三区在线| 99re6在线视频精品免费|