洪嵐峰 發表於 2023-4-20 03:59:19

EFM32PG12

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

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

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

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

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

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

  while (1)
  {
  }
}
頁: [1]
查看完整版本: EFM32PG12