冰楓論壇

 找回密碼
 立即註冊
搜索
查看: 694|回覆: 0
打印 上一主題 下一主題

[討論] EFM32PG12

[複製鏈接]

2609

主題

0

好友

1000

積分

金牌會員

Rank: 6Rank: 6

UID
373967
帖子
8867
主題
2609
精華
0
積分
1000
楓幣
15
威望
977
存款
34822
贊助金額
0
推廣
0
GP
1205
閱讀權限
70
在線時間
455 小時
註冊時間
2023-1-12
最後登入
2024-11-22

2023端午節紀念勳章 2023中秋節紀念勳章 2023聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-4-20 03:59:19 |只看該作者 |倒序瀏覽
EFM32PG12是一種微控制器芯片,由Silicon Labs(芯片設計和製造公司)生產。

它是一種32位ARM Cortex-M4F處理器,具有許多不同的集成外設(例如ADC、DAC、GPIO、定時器等),適用於各種應用程序,如工業控制、汽車、消費電子和醫療設備等。

以下是用C語言編寫的EFM32PG12控制輸入和輸出模塊,以及定時器和PWM單元的示例代碼:

控制GPIO輸入和輸出:


#include "em_device.h"
#include "em_chip.h"
#include "em_cmu.h"
#include "em_gpio.h"

int main(void)
{
  CHIP_Init(); //初始化芯片

  CMU_ClockEnable(cmuClock_GPIO, true); //使能GPIO時鐘

  GPIO_PinModeSet(gpioPortA, 0, gpioModeInput, 0); //將端口A的引腳0配置為輸入模式
  GPIO_PinModeSet(gpioPortB, 1, gpioModePushPull, 0); //將端口B的引腳1配置為推挽輸出模式

  while (1)
  {
    if (GPIO_PinInGet(gpioPortA, 0) == 1) //如果端口A的引腳0為高電平
    {
      GPIO_PinOutSet(gpioPortB, 1); //將端口B的引腳1輸出高電平
    }
    else
    {
      GPIO_PinOutClear(gpioPortB, 1); //將端口B的引腳1輸出低電平
    }
  }
}
控制定時器和PWM單元:

#include "em_device.h"
#include "em_chip.h"
#include "em_cmu.h"
#include "em_timer.h"
#include "em_gpio.h"

#define PWM_FREQ 1000 //PWM頻率
#define PWM_DUTY_CYCLE 0.5 //PWM佔空比

int main(void)
{
  CHIP_Init(); //初始化芯片

  CMU_ClockEnable(cmuClock_GPIO, true); //使能GPIO時鐘
  CMU_ClockEnable(cmuClock_TIMER0, true); //使能定時器0時鐘

  GPIO_PinModeSet(gpioPortB, 1, gpioModePushPull, 0); //將端口B的引腳1配置為推挽輸出模式

  TIMER_Init_TypeDef timerInit = TIMER_INIT_DEFAULT; //定義並初始化定時器
  TIMER_TopSet(TIMER0, CMU_ClockFreqGet(cmuClock_TIMER0) / PWM_FREQ); //設置定時器0的計數器上限值
  TIMER_Init(TIMER0, &timerInit); //初始化定時器0

  TIMER_InitCC_TypeDef timerCCInit = TIMER_INITCC_DEFAULT; //定義並初始化定時器的通道
  timerCCInit.mode = timerCCModePWM; //將定時器的通道設置為PWM模式
  TIMER_InitCC(TIMER0, 0, &timerCCInit); //初始化定時器0的通道0

  TIMER0->CC[0].CTRL |= TIMER_CC_CTRL_OUTINV; //將定時器0的通道0的輸出反相
  TIMER0->CC[0].CTRL |= TIMER_CC_CTRL_MODE_PWM; //將定時器0的通道0的模式設置為PWM模式
  TIMER0->CC[0].CCV = TIMER0->TOP * PWM_DUTY_CYCLE; //設置定時器0的通道0的比較值

  TIMER_Enable(TIMER0, true); //使能定時器0

  while (1)
  {
  }
}

控制PWM單元,使其輸出不同佔空比的PWM信號:

#include "em_device.h"
#include "em_chip.h"
#include "em_cmu.h"
#include "em_timer.h"
#include "em_gpio.h"

#define PWM_FREQ 1000 //PWM頻率
#define PWM_DUTY_CYCLE1 0.2 //PWM1佔空比
#define PWM_DUTY_CYCLE2 0.5 //PWM2佔空比
#define PWM_DUTY_CYCLE3 0.8 //PWM3佔空比

int main(void)
{
  CHIP_Init(); //初始化芯片

  CMU_ClockEnable(cmuClock_GPIO, true); //使能GPIO時鐘
  CMU_ClockEnable(cmuClock_TIMER0, true); //使能定時器0時鐘

  GPIO_PinModeSet(gpioPortB, 1, gpioModePushPull, 0); //將端口B的引腳1配置為推挽輸出模式

  TIMER_Init_TypeDef timerInit = TIMER_INIT_DEFAULT; //定義並初始化定時器
  TIMER_TopSet(TIMER0, CMU_ClockFreqGet(cmuClock_TIMER0) / PWM_FREQ); //設置定時器0的計數器上限值
  TIMER_Init(TIMER0, &timerInit); //初始化定時器0

  TIMER_InitCC_TypeDef timerCCInit = TIMER_INITCC_DEFAULT; //定義並初始化定時器的通道
  timerCCInit.mode = timerCCModePWM; //將定時器的通道設置為PWM模式
  TIMER_InitCC(TIMER0, 0, &timerCCInit); //初始化定時器0的通道0

  TIMER0->CC[0].CTRL |= TIMER_CC_CTRL_OUTINV; //將定時器0的通道0的輸出反相
  TIMER0->CC[0].CTRL |= TIMER_CC_CTRL_MODE_PWM; //將定時器0的通道0的模式設置為PWM模式
  TIMER0->CC[0].CCV = TIMER0->TOP * PWM_DUTY_CYCLE1; //設置定時器0的通道0的比較值

  timerCCInit.cmoa = timerOutputActionToggle; //將定時器的通道設置為翻轉輸出模式
  TIMER_InitCC(TIMER0, 1, &timerCCInit); //初始化定時器0的通道1

  TIMER0->CC[1].CTRL |= TIMER_CC_CTRL_MODE_PWM; //將定時器0的通道1的模式設置為PWM模式
  TIMER0->CC[1].CCV = TIMER0->TOP * PWM_DUTY_CYCLE2; //設置定時器0的通道1的比較值

  TIMER_InitCC(TIMER0, 2, &timerCCInit); //初始化定時器0的通道2

  TIMER0->CC[2].CTRL |= TIMER_CC_CTRL_MODE_PWM; //將定時器0的通道2的模式設置為PWM模式
  TIMER0->CC[2].CCV = TIMER0->TOP * PWM_DUTY_CYCLE3; //設置定時器0的通道2的比較值

  TIMER_Enable(TIMER0, true); //使能定時器0

  while (1)
  {
  }
}
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1彩票
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-11-22 16:32

回頂部