Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
RT-Thread_env没有PWM2 CH2如何配置CH2
发布于 2019-02-15 14:40:05 浏览:2055
订阅该版
#define PWM_DEV_NAME "pwm2" /* PWM设备名称 */ #define PWM_DEV_CHANNEL2 2 /* PWM通道 */ #define PWM_DEV_CHANNEL3 3 /* PWM通道 */ #define PWM_DEV_CHANNEL4 4 /* PWM通道 */ struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */ static void speex_thread_entry(void* parameter) { rt_uint32_t period, pulse; period = 500000000; /* 周期为0.5ms,单位为纳秒ns */ pulse = 300000000; /* PWM脉冲宽度值,单位为纳秒ns */ pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME); /* 查找设备 */ if (pwm_dev == RT_NULL) rt_kprintf("驱动失败 %s
", PWM_DEV_NAME); else { rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL2, period, pulse); /* 设置PWM周期和脉冲宽度默认值 */ rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL2); /* 使能设备 */ rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL3, period, pulse); rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL3); rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL4, period, pulse); rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL4); rt_kprintf("驱动成功 %s
", PWM_DEV_NAME); } while(1); } ![RT-Thread_env里面没有 ,所以手动添加了.png](/uploads/201902/15/143454xghxi5kakl5fagw5.png) RT-Thread_env里面没有 ,所以手动添加了 #define BSP_USING_PWM2_CH3 #define BSP_USING_PWM2_CH2 文件 rtconfig.h现在是这个样子 /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO #define BSP_USING_UART #define BSP_USING_UART1 #define BSP_USING_TIM #define BSP_USING_TIM11 #define BSP_USING_PWM #define BSP_USING_PWM2 #define BSP_USING_PWM2_CH4 #define BSP_USING_PWM2_CH3 //手动添加的 #define BSP_USING_PWM2_CH2//手动添加的 #define BSP_USING_ADC #define BSP_USING_ADC1 现在只有CH4可以工作。 对这个驱动还没搞太明白,还有哪里需要改动?
查看更多
10
个回答
默认排序
按发布时间排序
misonyo
2019-02-15
这家伙很懒,什么也没写!
楼主可以参考这个帖子配置使用pwm [https://www.rt-thread.org/qa/forum.php?mod=viewthread&tid=10229&highlight=pwm](https://www.rt-thread.org/qa/forum.php?mod=viewthread&tid=10229&highlight=pwm)
q80351951
2019-02-15
这家伙很懒,什么也没写!
>楼主可以参考这个帖子配置使用pwm https://www.rt-thread.org/qa/forum.php?mod=viewthread&tid=10229&hig ... --- 看了,提到的,都试过了
yqiu
2019-02-16
这家伙很懒,什么也没写!
@q80351951 你需要根据这里的文档先配置好 PWM 驱动,[https://github.com/RT-Thread/rt-thread/blob/master/bsp/stm32/README.md](https://github.com/RT-Thread/rt-thread/blob/master/bsp/stm32/README.md)
我夏了夏天
认证专家
2019-02-16
Life isn't about finding yourself, life is about creating yourself.
[i=s] 本帖最后由 Summer_gift 于 2019-2-16 18:26 编辑 [/i] 这一步做了吗? 首先使能 internal Clock 时钟,然后为 channelx 选项选择PWM Generation CHx, 最后配置所需要的引脚(或者使用默认引脚) [https://github.com/RT-Thread/rt-thread/blob/master/bsp/stm32/docs/STM32%E7%B3%BB%E5%88%97%E5%A4%96%E8%AE%BE%E9%A9%B1%E5%8A%A8%E6%B7%BB%E5%8A%A0%E6%8C%87%E5%8D%97.md](参考文档请点我。) 然后配合一楼帖子里的解决方法,应该就可以用了的。
风来吴山
2019-02-16
这家伙很懒,什么也没写!
我用的std库里面的函数完成的初始化,你可以试试
q80351951
2019-02-18
这家伙很懒,什么也没写!
>这一步做了吗? > >首先使能 internal Clock 时钟,然后为 channelx 选项选择PWM Generation CHx, 最后配置 ... --- 多谢各路神仙,还是没搞明白。 rtconfig.h文件下面定义已经存在 #define BSP_USING_PWM #define BSP_USING_PWM2 #define BSP_USING_PWM2_CH4 #define BSP_USING_PWM2_CH3 #define BSP_USING_PWM2_CH2 drv_pwm.c文件也有这三个定义且有效 static void pwm_get_channel(void) { #ifdef BSP_USING_PWM2_CH1 stm32_pwm_obj[PWM2_INDEX].channel |= 1 << 0; #endif #ifdef BSP_USING_PWM2_CH4 stm32_pwm_obj[PWM2_INDEX].channel |= 1 << 3; #endif #ifdef BSP_USING_PWM2_CH3 stm32_pwm_obj[PWM2_INDEX].channel |= 1 << 2; #endif #ifdef BSP_USING_PWM2_CH2 stm32_pwm_obj[PWM2_INDEX].channel |= 1 << 1; #endif #ifdef BSP_USING_PWM3_CH1 stm32_pwm_obj[PWM3_INDEX].channel |= 1 << 0; #endif #ifdef BSP_USING_PWM3_CH2 stm32_pwm_obj[PWM3_INDEX].channel |= 1 << 1; #endif #ifdef BSP_USING_PWM3_CH3 stm32_pwm_obj[PWM3_INDEX].channel |= 1 << 2; #endif #ifdef BSP_USING_PWM3_CH4 stm32_pwm_obj[PWM3_INDEX].channel |= 1 << 3; #endif #ifdef BSP_USING_PWM4_CH2 stm32_pwm_obj[PWM4_INDEX].channel |= 1 << 1; #endif #ifdef BSP_USING_PWM4_CH3 stm32_pwm_obj[PWM4_INDEX].channel |= 1 << 2; #endif #ifdef BSP_USING_PWM5_CH1 stm32_pwm_obj[PWM5_INDEX].channel |= 1 << 1; #endif #ifdef BSP_USING_PWM5_CH2 stm32_pwm_obj[PWM5_INDEX].channel |= 1 << 2; #endif #ifdef BSP_USING_PWM5_CH3 stm32_pwm_obj[PWM5_INDEX].channel |= 1 << 3; #endif } 既然CH4正常是不是就说明“internal Clock 时钟”已经使能? 下面红色代码是不是就是“为 channelx 选项选择PWM Generation CHx”? “ 最后配置所需要的引脚”这点找不到头绪, static rt_err_t stm32_hw_pwm_init(struct stm32_pwm *device) { rt_err_t result = RT_EOK; TIM_HandleTypeDef *tim = RT_NULL; TIM_OC_InitTypeDef oc_config = {0}; TIM_MasterConfigTypeDef master_config = {0}; TIM_ClockConfigTypeDef clock_config = {0}; RT_ASSERT(device != RT_NULL); tim = (TIM_HandleTypeDef *)&device->tim_handle; /* configure the timer to pwm mode */ tim->Init.Prescaler = 0; tim->Init.CounterMode = TIM_COUNTERMODE_UP; tim->Init.Period = 0; tim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; #if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) tim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; #endif if (HAL_TIM_Base_Init(tim) != HAL_OK) { LOG_E("%s time base init failed", device->name); result = -RT_ERROR; goto __exit; } clock_config.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(tim, &clock_config) != HAL_OK) { LOG_E("%s clock init failed", device->name); result = -RT_ERROR; goto __exit; } if (HAL_TIM_PWM_Init(tim) != HAL_OK) { LOG_E("%s pwm init failed", device->name); result = -RT_ERROR; goto __exit; } master_config.MasterOutputTrigger = TIM_TRGO_RESET; master_config.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(tim, &master_config) != HAL_OK) { LOG_E("%s master config failed", device->name); result = -RT_ERROR; goto __exit; } oc_config.OCMode = TIM_OCMODE_PWM1; oc_config.Pulse = 0; oc_config.OCPolarity = TIM_OCPOLARITY_HIGH; oc_config.OCFastMode = TIM_OCFAST_DISABLE; /* config pwm channel */ if (device->channel & 0x01) { if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_1) != HAL_OK) { LOG_E("%s channel1 config failed", device->name); result = -RT_ERROR; goto __exit; } } if (device->channel & 0x02) { if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_2) != HAL_OK) { LOG_E("%s channel2 config failed", device->name); result = -RT_ERROR; goto __exit; } } if (device->channel & 0x04) { if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_3) != HAL_OK) { LOG_E("%s channel3 config failed", device->name); result = -RT_ERROR; goto __exit; } } if (device->channel & 0x08) { if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_4) != HAL_OK) { LOG_E("%s channel4 config failed", device->name); result = -RT_ERROR; goto __exit; } } /* pwm pin configuration */ HAL_TIM_MspPostInit(tim); /* enable update request source */ __HAL_TIM_URS_ENABLE(tim); __exit: return result; }
来一颗糖
2019-02-18
这家伙很懒,什么也没写!
[attach]7552[/attach] 这里面填对了嘛
q80351951
2019-02-18
这家伙很懒,什么也没写!
>这里面填对了嘛 --- 多谢启发,搞定了。 \board\CubeMX_Config\Src\stm32f4xx_hal_msp.c文件里面才是引脚功能初始化,折腾了半天其实就这一个问题。 void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(htim->Instance==TIM2) { /* USER CODE BEGIN TIM2_MspPostInit 0 */ /* USER CODE END TIM2_MspPostInit 0 */ __HAL_RCC_GPIOA_CLK_ENABLE(); /**TIM2 GPIO Configuration PA3 ------> TIM2_CH4 */ GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN TIM2_MspPostInit 1 */ /* USER CODE END TIM2_MspPostInit 1 */ } 增加了2个ok
misonyo
2019-02-18
这家伙很懒,什么也没写!
>多谢启发,搞定了。 >\board\CubeMX_Config\Src\stm32f4xx_hal_msp.c文件里面才是引脚功能初始化,折腾了 ... --- 这里的代码不是cubeMX配置后自动生成的吗
q80351951
2019-02-18
这家伙很懒,什么也没写!
>这里的代码不是cubeMX配置后自动生成的吗 --- 刚开始学这个,没看到这个在哪改,没用cubeMX,也一直纳闷引脚配置在哪,好几年不用STM32了,也一直没用过RTOS,学一学感觉会用到,想先做个东西试试,涉及语音采集和播放,用AD和PWM,练练手。
撰写答案
登录
注册新账号
关注者
0
被浏览
2.1k
关于作者
q80351951
这家伙很懒,什么也没写!
提问
3
回答
9
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
GD32F450 片内 flash驱动适配
2
STM32H7R7运行CherryUSB
3
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
4
使用RC522软件包驱动FM1722
5
常量数据类型和表达式陷阱分享
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部