NuttX:PWM应用以及驱动调试记录

NuttX版本:V10.1.0

MCU:STM32F411CEU6

GPIO:      PA6 --- PWM1  

                PA7 --- PWM2

                PB0 --- PWM3

                PB1 --- PWM4

硬件原理图:

目录

一、开启remap重映射功能

1、修改Alternate Pin Mapping菜单的开启条件

2、开启STM32_CONNECTIVITYLINE功能

3、进行引脚重映射配置

 二、设置TIM3为全映射

 三、处理开启重映射后,对其他部分代码不兼容的影响

四、menuconfig中配置PWM

1、开启pwm驱动支持,设置pwm多通道输出支持

2、开启tim3的四个通道并且设置输出且模式为6,且开启pwm多通道输出

五、移植stm32_pwm.c底层pwm驱动

1、修改包含的头文件

2、对检测宏的代码进行修改

3、修改指定pwm初始化定时器的宏,增加打印信息

六、修改stm32f411-minimum目录下的源文件

1、修改stm32f411-minimum.h

2、修改stm32_bringup.c文件

3、修改Make.defs

七、TIM3全映射引脚的指定

1、分析

2、指定引脚

八、开启pwm示例应用

九、编译并烧录

十、测试验证

1、查看stm32_pwm_setup()函数注册的pwm设备

2、通过help查看内置应用,其中的gpio为gpio实例应用,通过pwm -h即可看到帮助信息

3、输入pwm命令,查看tim3的ch1连接的电机状态


一、开启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连接的电机状态

 

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值