如何解决通过 STM32F446RE 定时器在 Arduino IDE 中的替代引脚上实现 PWM
我正在尝试在 Visual Studio Code 和 Arduino IDE 中使用 STM32 定时器实现 PWM 信号。我使用的是 Nucleo F446RE 板。
我有以下代码在 VSC 中运行良好:
#include <Arduino.h>
HardwareTimer* Timer3 = new HardwareTimer(TIM3);
void setup() {
Timer3->setMode(4,TIMER_OUTPUT_COMPARE_PWM1,PB_1_ALT1);
Timer3->setPrescaleFactor(90);
Timer3->setCaptureCompare(4,1000,TICK_COMPARE_FORMAT);
Timer3->setOverflow(5000,TICK_FORMAT);
Timer3->resume();
}
void loop() { }
如果我尝试在 Arduino IDE 中编译相同的代码,我会收到以下错误:
'PB_1_ALT1' 未在此范围内声明
所以我尝试手动包含 PeripheralPins.h,因为 PeripheralPins.c 定义了 PB_1_ALT1
但它没有解决问题。接下来,我查看了 PB_1_ALT1
的定义,如下所示:
PB_1_ALT1 = PB_1 | ALT1
ALT1 = 0x100
但 Arduino IDE 也不知道 ALT1
,因此我将 setMode-command 更改为:
Timer3->setMode(4,PB_1 | 0x100);
这次代码编译好了,可以上传了,但是pin还是没有输出任何东西。
因此我的问题:
- 如何正确使用 Arduino IDE 中定时器的备用输出引脚?
- PeripheralPins.c 列出了所有可能的 Timer-Channel-Pin-组合。但是我在哪里可以在数据表中找到这些组合?我只是在代码中随机找到它们,而在 STM32F446RE 的数据表中没有找到。
解决方法
问题 1 的答案!
PWM 引脚组合存储在:
[]\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.9.0\variants\NUCLEO_F446RE\PeripheralPins.c
该文件不包含具有不同名称的替代引脚组合,如 VSC 库中的名称。相反,您必须取消注释您喜欢使用的组合并注释正常的组合。
提示
直接编辑这个库会改变所有程序的 PWM 设置。因此,我建议将整个表复制到程序文件夹中的新 c 文件中。它必须包含相应的 h 文件,可以将其包含在程序中。
Own_PeripheralPins.c
:
#include "Own_PeripheralPins.h"
#include <Arduino.h>
const PinMap PinMap_PWM[] = {
{PA_0,TIM2,STM_PIN_DATA_EXT(STM_MODE_AF_PP,GPIO_PULLUP,GPIO_AF1_TIM2,1,0)},// TIM2_CH1
// {PA_0,TIM5,GPIO_AF2_TIM5,// TIM5_CH1
// {PA_1,2,// TIM2_CH2
{PA_1,// TIM5_CH2
// {PA_2,3,// TIM2_CH3 - STLink Tx
// {PA_2,// TIM5_CH3 - STLink Tx
// {PA_2,TIM9,GPIO_AF3_TIM9,// TIM9_CH1 - STLink Tx
// {PA_3,4,// TIM2_CH4 - STLink Rx
// {PA_3,// TIM5_CH4 - STLink Rx
// {PA_3,// TIM9_CH2 - STLink Rx
{PA_5,// TIM2_CH1
// {PA_5,TIM8,GPIO_AF3_TIM8,1)},// TIM8_CH1N
// {PA_6,TIM3,GPIO_AF2_TIM3,// TIM3_CH1
{PA_6,TIM13,GPIO_AF9_TIM13,// TIM13_CH1
// {PA_7,TIM1,GPIO_AF1_TIM1,// TIM1_CH1N
// {PA_7,// TIM3_CH2
// {PA_7,// TIM8_CH1N
{PA_7,TIM14,GPIO_AF9_TIM14,// TIM14_CH1
{PA_8,// TIM1_CH1
{PA_9,// TIM1_CH2
{PA_10,// TIM1_CH3
{PA_11,// TIM1_CH4
{PA_15,// TIM2_CH1
// {PB_0,// TIM1_CH2N
// {PB_0,// TIM3_CH3
{PB_0,// TIM8_CH2N
// {PB_1,// TIM1_CH3N
// {PB_1,// TIM3_CH4
{PB_1,// TIM8_CH3N
{PB_2,// TIM2_CH4
{PB_3,// TIM2_CH2
{PB_4,// TIM3_CH1
{PB_5,// TIM3_CH2
{PB_6,TIM4,GPIO_AF2_TIM4,// TIM4_CH1
{PB_7,// TIM4_CH2
// {PB_8,// TIM2_CH1
{PB_8,// TIM4_CH3
// {PB_8,TIM10,GPIO_AF3_TIM10,// TIM10_CH1
// {PB_9,// TIM2_CH2
// {PB_9,// TIM4_CH4
{PB_9,TIM11,GPIO_AF3_TIM11,// TIM11_CH1
{PB_10,// TIM2_CH3
{PB_13,// TIM1_CH1N
// {PB_14,// TIM1_CH2N
// {PB_14,// TIM8_CH2N
{PB_14,TIM12,GPIO_AF9_TIM12,// TIM12_CH1
// {PB_15,// TIM1_CH3N
// {PB_15,// TIM8_CH3N
{PB_15,// TIM12_CH2
{PC_6,// TIM3_CH1
// {PC_6,// TIM8_CH1
// {PC_7,// TIM3_CH2
{PC_7,// TIM8_CH2
{PC_8,// TIM3_CH3
// {PC_8,// TIM8_CH3
// {PC_9,// TIM3_CH4
{PC_9,// TIM8_CH4
{NC,NP,0}
};
重要:必须删除属性 weak
!
重要:此表必须针对单独使用的 STM 类型进行调整!
我更喜欢在头文件中直接定义 PinMap_PWM,但我不知道如何做到这一点,或者它是否可能。如果该文件被多个其他文件包含,我会收到 multiple definition
错误。既不能设置指针常量也不能设置静态,因为变量的定义类型不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。