c++ - SAMD21如何使用TCC设置PWM?

标签 c++ arm embedded pwm samd21

我正在编程 SAMD21,我需要 PWM
当我选择具有 F 功能 TCC0 输出的引脚时:
PA22 - TCC0/WO[4]
PA23 - TCC0/WO[5]

我成功配置了 TCC0 基本计数器:

// enable clock for TCC0 - disable clock masking
PM->APBCMASK.reg |= PM_APBCMASK_TCC0;

// set GCLK1 as source to the TCC0 counter
GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN(1) | GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_ID(0x1A);
while(!SYSCTRL->PCLKSR.bit.DFLLRDY);

// set counter
TCC0->CTRLA.reg |= TCC_CTRLA_PRESCALER_DIV64; // setting prescaler
TCC0->WAVE.reg |=  TCC_WAVE_WAVEGEN_NPWM | TCC_WAVE_POL0;
while (TCC0->SYNCBUSY.bit.WAVE);

// set TOP (PER) value of counter - frequency
TCC0->CTRLA.bit.RESOLUTION = 0;
TCC0->PER.reg = 48'000'000 / (100 * 64) - 1; // Fpwm = Fglk / (PRESC(PER+1))  --> PER = Fglk / (Fpwm * PRESC) - 1
while (TCC0->SYNCBUSY.bit.PER);

但问题是如何配置比较 channel - SAMD21 只有 4 个比较 channel (CC),但我希望输出到 WO[4] 和 WO[5]。

如何将给定的比较 channel 连接到 WO[x] 引脚?

感谢您的回答

编辑:

我还将引脚配置为多路复用(不确定是否正确):
PORT->Group[0].PINCFG->reg |= (1 << PIN_PA22) | (1 << PIN_PA23);
PORT->Group[0].PMUX->bit.PMUXE = (0x5 << (PIN_PA22/2));
PORT->Group[0].PMUX->bit.PMUXO = (0x5 << (PIN_PA23/2 + 1));

最佳答案

有一个PWM library您可以重用代码;它带有一个带有定时器、输出引脚、输出 channel 、引脚多路复用器等的表(在“附加”下)。
该库是(由我)为基于 SAMD21G 的 Arduinos 编写的,但您需要的所有映射和代码都在那里,它可以帮助您完成工作。

关于c++ - SAMD21如何使用TCC设置PWM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62039356/

相关文章:

c++ - 在unique_ptr <>中使用自定义删除器(curl_formfree())

c - 使用 memcpy 的未对齐访问

c++ - 您能为嵌入式系统推荐哪种免费的最小闪存文件系统?

user-interface - 没有Linux的嵌入式系统的图形库?

c - 我应该为 FreeRTOS 系统上的程序选择什么调度?

c++ - 虚拟继承和静态继承——C++中的混合

c++ - Boost 异步定时器仍然阻塞主线程

java - 如何使用 native 代码以编程方式查找 Java 局部变量的内存地址?

c - arm_cft_sR_q31_len4096 未声明

linux-kernel - 从 FIQ 处理程序调用 Linux C 代码时出现问题