NuttX版本:V10.1.0
MCU:STM32F411CEU6
GPIO: PA6 --- PWM1
PA7 --- PWM2
PB0 --- PWM3
PB1 --- PWM4
硬件原理图:
目录
1、修改Alternate Pin Mapping菜单的开启条件
2、开启tim3的四个通道并且设置输出且模式为6,且开启pwm多通道输出
1、查看stm32_pwm_setup()函数注册的pwm设备
2、通过help查看内置应用,其中的gpio为gpio实例应用,通过pwm -h即可看到帮助信息
一、开启remap重映射功能
1、修改Alternate Pin Mapping菜单的开启条件
由于nuttx默认的menuconfig重映射功能菜单需要依赖STM32F10XX的配置,与我们使用的stm32f4芯片不符,需要修改~/nuttx/arch/arm/src/stm32/Kconfig文件,这里采用的是去掉对芯片的硬性要求
——》
2、开启STM32_CONNECTIVITYLINE功能
接下来处理的是如何开启STM32_CONNECTIVITYLINE,由于STM32F411的外设如下
在上面同一个Kconfig文件里面可以看到开启STM32_CONNECTIVITYLINE需要开启STM32_HAVE_OTGFS等配置。因此修改~/nuttx/arch/arm/src/stm32/Kconfig如下
——》
在同一个Kconifg 文件里面,设置当芯片选择为stm32f411ce时,会默认勾选开启STM32_CONNECTIVITYLINE
——》
这时候make menuconfig打开配置菜单,输入/检索STM32_CONNECTIVITYLINE即可看到已经勾选
3、进行引脚重映射配置
这时候System Type菜单下已经能够看到Alternate Pin Mapping菜单已开启,
但是这时候打开里面为空,需要在Kconfig里面修改Alternate Pin Mapping的对应选项的开启条件,将depends on STM32_STM32F1XXX改为STM32_STM32F4XXX
修改完成后,再次打开menuconfig的Alternate Pin Mapping目录,可以看到可重映射的选项
二、设置TIM3为全映射
三、处理开启重映射后,对其他部分代码不兼容的影响
如果此时进行编译,会报如下错误,这个错误是由于开启了STM32_CONNECTIVITYLINE,导致需要条件编译stm32_mcoconfig()这个函数,但是由于stm32f4并没对应的宏RCC_CFGR_MCO_MASK导致的
经过检查,打开nuttx/arch/arm/src/chip/stm32_rcc.h,其中使用的RCC_CFGR_MCO_MASK宏定义,是定义在nuttx/arch/arm/src/stm32/hardware/stm32fxxxx_rcc.h中,查看代码,可以看到对应stm32f4只定义了RCC_CFGR_MCO1_MASK以及RCC_CFGR_MCO2_MASK两个宏定义,并没有定义RCC_CFGR_MCO_MASK,查看《STM32F4XX中文参考手册》-rcc时钟配置寄存器部分,以及其他芯片对于RCC_CFGR_MCO_MASK的配置,基本是使用MCO1进行配置的。因此此处使用MCO1宏来替代MCO宏。
修改代码如下:
四、menuconfig中配置PWM
1、开启pwm驱动支持,设置pwm多通道输出支持
2、开启tim3的四个通道并且设置输出且模式为6,且开启pwm多通道输出
定时器通道的模式定义在arch/arm/src/stm32/stm32_pwm.h中
五、移植stm32_pwm.c底层pwm驱动
由于nuttx源码的stm32f411-minimum板的src目录下并没有pwm的底层驱动,这里采取从stm32f103-minimum板的src目录下移植stm32_pwm.c文件。并进行如下修改(左边为stm32f411,右边为stm32f103)
1、修改包含的头文件
2、对检测宏的代码进行修改
3、修改指定pwm初始化定时器的宏,增加打印信息
六、修改stm32f411-minimum目录下的源文件
1、修改stm32f411-minimum.h
增加指定定时器的宏定义
添加stm32_pwm_setup(void)的声明
2、修改stm32_bringup.c文件
添加当开启CONFIG_STM32_PWM配置宏四,调用stm32_pwm.c文件中的stm32_pwm_setup()函数进行初始化pwm,并注册/dev/pwm0设备
3、修改Make.defs
将stm32_pwm.c添加到Make.defs中,当开启对应宏时加入编译。
七、TIM3全映射引脚的指定
1、分析
在nuttx中,虽然TIM3开启了全映射,但是在menuconfig中没有找到指定哪个pin作为映射引脚,而一般情况下,是有多个引脚都可以映射为TIM3 ch1或者其他通道的。
经过查找,存在一个命名方式为stm32fxxx_pinmap.h的文件(xxx表示具体型号,需要根据自己的mcu修改并查找)。对于stm32f411,其使用的是stm32f40xxx_pinmap.h文件。在重映射头文件的开头,有这样一段话说明如何使用
大致意思是,nuttx已经做好了某个引脚能够映射的全部功能,但是由于有多个引脚都可以映射为TIM3 ch1或者其他通道的情况,因此需要我们自己使用宏来指定到底哪个引脚映射为TIM3 CH1以及其他通道。
经过查找,我们使用的是
2、指定引脚
在stm32f411-minimum/include/board.h文件中添加指定tim3全映射引脚的宏
八、开启pwm示例应用
打开menuconfig,开启pwm示例应用
九、编译并烧录
$cd {nuttx源码所在目录}/nuttx/nuttx
$make clean;make
烧录可以使用JFlash进行烧录或者使用openocd,我这里使用JFlash
十、测试验证
使用USB转ttl模块连接到测试板件的串口1。这一步需要先经过测试能够正常连接nsh并输出信息,才能进行后续测试。
NuttShell前的输出信息为我自行添加的调试信息,可以不用管。
1、查看stm32_pwm_setup()函数注册的pwm设备
2、通过help查看内置应用,其中的gpio为gpio实例应用,通过pwm -h即可看到帮助信息
3、输入pwm命令,查看tim3的ch1连接的电机状态