通过 STM32F446RE 定时器在 Arduino IDE 中的替代引脚上实现 PWM

如何解决通过 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还是没有输出任何东西。

因此我的问题:

  1. 如何正确使用 Arduino IDE 中定时器的备用输出引脚?
  2. 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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-