PWM

关于rt-thread的PWM框架在stm32f103vf应用的疑问

发布于 2018-11-19 17:56:19
    本帖最后由 fyywhy 于 2018-11-21 20:45 编辑


芯片:STM32F103VF.

一、准备项目

首先下载了最新的rt-thread代码。进行入stm32f103-HAL BSP

在env下
menuconfig
进行配置
1.选中芯片STM32F103VF
2.选中 Using HSI as clock source
3.选中 Using PWM4
4.选中 Enable Channel 1
快照1.png
快照4.png
5.保存
6.退出
7.在env下 scons --target=mdk5重新组织项目。





二、修改配置

1.选中STM32F103VF芯片
快照2.png

2.设置晶振频率8MHz
快照3.png
3.保存设置,进行编译
快照5.png
发现3个警告。
/* pwm test cmd */
static int pwm_test(int argc, char **argv)
{
char *pwmc = argv[1];
rt_device_t pwmd = rt_device_find(argv[1]);
struct rt_pwm_configuration cfg =
{
.channel = 0, /* 0-n */
.period = 100, /* unit:ns 1ns~4.29s:1Ghz~0.23hz */
.pulse = 50 /* unit:ns (pulse<=period) */
};
for (int i = 1; i < 5; i++)
{
cfg.channel = i;
rt_device_control(pwmd, PWM_CMD_SET, &cfg);
rt_device_control(pwmd, PWM_CMD_ENABLE, &cfg);
}
}
MSH_CMD_EXPORT(pwm_test, pwm_test pwm1);
该在drv_pwm.c中
1.pwmc声明了但未使用
2.pwm_test没有返回值
3.最后一行没有留空行。
修改一下:
/* pwm test cmd */
static int pwm_test(int argc, char **argv)
{
char *pwmc = argv[1];
rt_device_t pwmd = rt_device_find(pwmc);
struct rt_pwm_configuration cfg =
{
.channel = 0, /* 0-n */
.period = 100, /* unit:ns 1ns~4.29s:1Ghz~0.23hz */
.pulse = 50 /* unit:ns (pulse<=period) */
};
for (int i = 1; i < 5; i++)
{
cfg.channel = i;
rt_device_control(pwmd, PWM_CMD_SET, &cfg);
rt_device_control(pwmd, PWM_CMD_ENABLE, &cfg);
}
return RT_EOK;
}
MSH_CMD_EXPORT(pwm_test, pwm_test pwm1);

警告消除。:)



三、增加TIMER、PWM通道。
由于该BSP中仅有PWM1\2\3\4\5\8。但我需要用到PWM10。所以开始增加PWM10的功能。

1.增加htim10声明
#ifdef BSP_USING_PWM10
TIM_HandleTypeDef htim10;
#endif
2.增加TIM10初始化函数
#ifdef BSP_USING_PWM10
static void MX_TIM10_Init(void)
{
TIM_OC_InitTypeDef sConfigOC;

htim10.Instance = TIM10;
htim10.Init.Prescaler = 8;
htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
htim10.Init.Period = 400;
htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim10.Init.RepetitionCounter = 0;
if (HAL_TIM_PWM_Init(&htim10) != HAL_OK)
{
RT_ASSERT(0);
}

sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 200;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;

if (HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
RT_ASSERT(0);
}
HAL_TIM_MspPostInit(&htim10);
rt_kprintf("time configure ok!\n");
}
#endif /* BSP_USING_PWM10
3.增加TIM10时钟使能
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *tim_pwmHandle)
{
...
...
else if (tim_pwmHandle->Instance == TIM10)
{
__HAL_RCC_TIM10_CLK_ENABLE();
rt_kprintf("enable time10 rcc\n");
}
}
4.增加GPIO初始化
static void HAL_TIM_MspPostInit(TIM_HandleTypeDef *timHandle)
{
GPIO_InitTypeDef GPIO_InitStruct;
...
...
...
else if(timHandle->Instance==TIM10)
{
/**TIM10 GPIO Configuration
PB8 ------> TIM10_CH1
*/
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
rt_kprintf("pin Pb8 configure ok!\n");
}
}
5.增加TIM10的失能函数
void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *tim_pwmHandle)
{
...
...
...
else if (tim_pwmHandle->Instance == TIM10)
{
__HAL_RCC_TIM10_CLK_DISABLE();
}
}
6.增加pwm10的注册函数
int drv_pwm_init(void)
{
...
...
...
#ifdef BSP_USING_PWM10
MX_TIM10_Init();
rt_device_pwm_register(rt_calloc(1, sizeof(struct rt_device_pwm)), "pwm10", &drv_ops, &htim10);
#endif
return 0;
}
7.由于pwm10只有一个通道,所以修改测试函数
/* pwm test cmd */
static int pwm_test(int argc, char **argv)
{
char *pwmc = argv[1];
rt_device_t pwmd = rt_device_find(pwmc);
struct rt_pwm_configuration cfg =
{
.channel = 1, /* 0-n */
.period = 400, /* unit:ns 1ns~4.29s:1Ghz~0.23hz */
.pulse = 200 /* unit:ns (pulse<=period) */
};
cfg.channel = 1;
rt_device_control(pwmd, PWM_CMD_SET, &cfg);
rt_device_control(pwmd, PWM_CMD_ENABLE, &cfg);
return RT_EOK;
}
8.在rtconfig.h中定义PWM10
#define BSP_USING_PWM10
9.编译
编译顺利通过。
10.烧写
11.测试
快照6.png

很遗憾,没有pwm波输出。


四、做出的尝试

也怀疑过配置,怀疑硬件问题,好吧。用cubeMX生成相关文件裸机跑一下。

1、配置管脚

快照7.png

2.配置时钟

快照8.png

3、配置timer

快照9.png
4.生成项目
5.编译、烧写、测试

417151247652908628.jpg

好吧,说明硬件和示波器、连线都没有问题。

五、查看两者差异
呃,真的没有发现差异在哪个地方,严重怀疑是时钟没搞对,rtt本身是初始化了时钟的啊,不知道哪里出了问题,请大家帮忙看一下。谢谢



下载附件[pwm10_test.rar]
下载附件[stm32f10x-HAL.rar]

查看更多

关注者
0
被浏览
2k
2 个回答
yqiu
yqiu 2018-11-20
只有再仔细对比下差异的地方了。
shao7936626
shao7936626 2019-08-29
请问楼主后来解决没有啊

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览