你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G030C8T6 TIM16 无法产生PWM方波

[复制链接]
owen_chen 提问时间:2022-10-7 20:21 / 未解决
硬件使用STM32G030C8T6的PA6的AF5功能,即TIM16_CH1驱动一个无源蜂鸣器,输出一个2.7K-2.9K的方波,占空比为50%,始终没有成功,查阅datasheet发现PA6也可以映射AF1功能,即TIM3_CH1,将PWM初始化代码中的TIM16替换为TIM3,正常输出方波。MDK里查看了TIM3和TIM16配置后寄存器,完全一样,再改回TIM16,依然不行。确认了PA6的IO配置,尤其是AF寄存器,均是对的。同样的问题,在G070上验证了一样,也是TIM3能输出PWM而TIM16不行。哪位帮我分析分析,谢过!贴一下TIM3的代码
void TIM3_PWMConfig(void)
{
          LL_TIM_InitTypeDef TIM_InitStruct = {0};
          LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};

          LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);

          TIM_InitStruct.Prescaler = SystemCoreClock/1000000-1;
          TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
          TIM_InitStruct.Autoreload = 0xAC*2-1;                //频率2.9KHz
          TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
          LL_TIM_Init(TIM3, &TIM_InitStruct);
          LL_TIM_EnableARRPreload(TIM3);
          LL_TIM_OC_EnablePreload(TIM3, LL_TIM_CHANNEL_CH1);
          TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
          TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
          TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
          TIM_OC_InitStruct.CompareValue = 0xAC;
          TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;
          LL_TIM_OC_Init(TIM3, LL_TIM_CHANNEL_CH1, &TIM_OC_InitStruct);
          LL_TIM_OC_DisableFast(TIM3, LL_TIM_CHANNEL_CH1);
          LL_TIM_SetTriggerOutput(TIM3, LL_TIM_TRGO_RESET);
          LL_TIM_DisableMasterSlaveMode(TIM3);
        LL_TIM_CC_EnableChannel(TIM3, LL_TIM_CHANNEL_CH1);
        LL_TIM_EnableCounter(TIM3);
}


收藏 评论6 发布时间:2022-10-7 20:21

举报

6个回答
butterflyspring 回答时间:2022-10-12 11:21:17
大致看了一下,BDTR中的MOE位没有使能,楼主可以使能后试试看
butterflyspring 回答时间:2022-10-8 11:14:41
这边用STM32G070RB测试了一下,可以输出PWM的。楼主可以对比一下,注意MSP是否有不同。

TEST TIM16 PA6.7z

下载

8.27 MB, 下载次数: 13, 下载积分: ST金币 -1

owen_chen 回答时间:2022-10-9 15:47:19
butterflyspring 发表于 2022-10-8 11:14
这边用STM32G070RB测试了一下,可以输出PWM的。楼主可以对比一下,注意MSP是否有不同。
...

你好,感谢回复!用你的代码验证确实OK,后来我把你CUBE文件的库改成LL,其他设置不变,我一直都在使用LL库,就不行了,我查看了一下LL库生成的代码,没有使能TIM16以及CH1输出,添加了下面两行代码后,查看LL库和HAL库的寄存器结果是完全一样的,但LL库就是没有输出。
LL_TIM_EnableCounter(TIM16);
LL_TIM_CC_EnableChannel(TIM16, LL_TIM_CHANNEL_CH1);

寄存器.png
CUBE.png
owen_chen 回答时间:2022-10-26 20:44:03
butterflyspring 发表于 2022-10-12 11:21
大致看了一下,BDTR中的MOE位没有使能,楼主可以使能后试试看

确实是这个问题,之前参与对比的TIM3没有这个寄存器,CUBEMX使用LL库时没有置位BDTR->MOE,手动置位一下就好了。
感谢关注。
535443361@qq.co 回答时间:2023-10-1 19:40:38

butterflyspring 发表于 2022-10-12 11:21
大致看了一下,BDTR中的MOE位没有使能,楼主可以使能后试试看

我也是这种问题,的确是这样解决的

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版