打印
[STM8]

STM8的TIM1输出PWM问题

[复制链接]
18606|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
309976659|  楼主 | 2014-5-5 15:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 309976659 于 2014-5-5 15:48 编辑

我想要用TIM1输出4路PWM,通道3和4都没有问题,可是1,2却死活不行,才接触stm单片机,求高手指点。代码如下:
#ifndef BIT
#define BIT(n)    (1<<(n))
#endif

void setGpio(void)
{
    PC_DDR = 0XF8;  //PC7-PC3设输出
    PC_CR1 = 0XF8; // PC7-PC3推挽输出
    PC_CR2 = 0X0;
}
void PWM_INIT(void)
{
    TIM1_CR1 &= ~BIT(0);   //关闭TIM1
    //
    TIM1_PSCRH = 0;
    TIM1_PSCRL = 0;        //不分频2MHz
    //
    TIM1_ARRH = 0X07;
    TIM1_ARRL = 0XCF;        //2MHz/(1999+1) = 1KHz
    //
    TIM1_CR1 |= BIT(7);    //使能ARP,边沿对齐,向上计数
    TIM1_EGR |= BIT(0);    //更新TIM1,使PSC有效
    TIM1_EGR|=0x20;//重新初始化TIM1
   
    TIM1_CCR1H = 0X03;
    TIM1_CCR1L = 0XE6;       //占空比50%
    TIM1_CCMR1 = 0X68;      //配置TIM1_CH1为PWM1模式输出
   
    TIM1_CCR2H = 0X03;
    TIM1_CCR2L = 0XE6;       //占空比50%
    TIM1_CCMR2 = 0X68;      //配置TIM1_CH2为PWM1模式输出
   
    TIM1_CCR3H = 0X03;
    TIM1_CCR3L = 0XE6;       //占空比50%
    TIM1_CCMR3 = 0X68;      //配置TIM1_CH3为PWM1模式输出
   
    TIM1_CCR4H = 0X03;
    TIM1_CCR4L = 0XE6;       //占空比50%
    TIM1_CCMR4 = 0X68;      //配置TIM1_CH4为PWM1模式输出
    //
    TIM1_CCER1 |= BIT(0);   //Enable TIM1_CH1 channel
    TIM1_CCER1 |= BIT(4);   //Enable TIM1_CH2 channel
    TIM1_CCER2 |= BIT(0);  //使能TIM1_CH3通道
    TIM1_CCER2 |= BIT(4);  //Enable TIM1_CH4 channel
    //
    TIM1_BKR |= BIT(7);    //
    TIM1_CR1 |= BIT(0);    //使能TIM1
   
}

沙发
nienianhong| | 2014-5-6 09:54 | 只看该作者
是不是哪里没有配置好,另外如果用到引脚的第二功能,还要设置一下option byte

使用特权

评论回复
板凳
sz189981| | 2014-6-23 11:17 | 只看该作者
可能是时钟没有分配给外设的原因,但是为什么TIM3.4能行,我就不知道了。求高手解答!!!

使用特权

评论回复
地板
cuitjxg| | 2014-7-8 11:05 | 只看该作者
测试了你的代码,没有问题啊,可以出来四路PWM
我出了四路占空比不同的代码
我用的是STM8S005K6
外设时钟,我是默认的

使用特权

评论回复
5
309976659|  楼主 | 2014-7-28 11:45 | 只看该作者
我用的是STM8S003,2楼回答是正确的,要设置一下option byte

使用特权

评论回复
6
chelijan| | 2014-8-14 15:06 | 只看该作者
大家好,我试了,为什么我的PWM输出是间隔400多毫秒呢?

使用特权

评论回复
7
chelijan| | 2014-8-15 20:41 | 只看该作者
搞定了,不能不说STVD还需要改进啊!傻瓜式!

使用特权

评论回复
8
callhgd| | 2014-11-28 21:54 | 只看该作者
chelijan 发表于 2014-8-15 20:41
搞定了,不能不说STVD还需要改进啊!傻瓜式!

你还没有说出是什么问题啊?朋友

使用特权

评论回复
9
sail8498| | 2014-11-29 09:07 | 只看该作者
刚好前两天 看到过这方面的资料,TIM1跟TIM2 3 4 都不一样,要多两个设置。具体哪两行不记得了。

使用特权

评论回复
10
berry56| | 2014-12-2 16:02 | 只看该作者
TIM1的1,2需要设置OPTION BYTE,我是用烧录程序先把选项字节烧进去,再烧程序就OK了,不知楼主怎么样的

使用特权

评论回复
11
berry56| | 2014-12-2 16:03 | 只看该作者
把AFR0烧成1

使用特权

评论回复
12
zgfszyx| | 2015-1-29 18:26 | 只看该作者
对于20脚的S103/003之类的来说,用CH1、CH2输出确实要烧AFR0,我也是因为没烧搞了两三天,ST这个为什么不在寄存器那章提一下呢?不止一个人遇到这个问题了。或者可以在IO功能里面设置第二功能寄存器嘛,搞死人!
我是在----blog.csdn.net/lan120576664/article/details/18073967---
这个博客里看到的实例,我用的IAR,正好我的板上CH4有LED,一试果然行。后来与CH1比较,发现CH4排在前面,而CH1不是,其前面还有一个SPI功能,后来仔细看引脚说明,才想到这个问题。
感谢上面链接的博主!

使用特权

评论回复
13
紫阳真人| | 2016-11-15 20:03 | 只看该作者
学习了

使用特权

评论回复
14
zq_1943| | 2017-12-6 21:21 | 只看该作者
12楼的解答是对的,验证了可行
我是用的是STM8S003F的20脚使用PC6,PC7C输出TIM1的占空比,一直没有输出,最后更改了AFR0为active之后就能够正常输出了;
最后看了手册确实是这样的,引脚复用;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

27

帖子

2

粉丝