打印
[技术问答]

关于M0516的PWM如何开启单触发模式的疑问

[复制链接]
1366|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
_寒寒_|  楼主 | 2015-6-30 15:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人想用M0516的PWM输出。想用单触发模式。但是发现,如果不使能周期模式,配置好CNR和CMR,并使能PWM对应的通道后CNR和CMR却被清零了。但是datasheet中也只是说CHXMOD位发生变化时,CNR和CMR会被清零。
复位后PCR值为0,即使用了单触发模式。之后使用下面的语句
PWMA->CNR0 = 某值
PWMA->CMR0 = 某值
对应的寄存器值会发生变化
但是当使用下面这句后
PWMA->PCR |= PWM_PCR_CH0EN_Msk
cnr和cmr的值就被清零了
沙发
mintspring| | 2015-6-30 20:26 | 只看该作者
楼主用的是寄存器操作呀?不知道这个功能用库函数能实现不

使用特权

评论回复
板凳
天灵灵地灵灵| | 2015-6-30 22:28 | 只看该作者
你要看bsp包才行,那个有例题

使用特权

评论回复
地板
_寒寒_|  楼主 | 2015-7-2 08:44 | 只看该作者
本帖最后由 _寒寒_ 于 2015-7-2 08:49 编辑
mintspring 发表于 2015-6-30 20:26
楼主用的是寄存器操作呀?不知道这个功能用库函数能实现不


以下是lib中的PWM_ConfigOutputChannel
    // every two channels share a prescaler
    (pwm)->PPR = ((pwm)->PPR & ~(PWM_PPR_CP01_Msk << ((u32ChannelNum >> 1) * 8))) | (u16Prescale << ((u32ChannelNum >> 1) * 8));
    (pwm)->CSR = ((pwm)->CSR & ~(PWM_CSR_CSR0_Msk << (4 * u32ChannelNum))) | (u8Divider << (4 * u32ChannelNum));
    // set PWM to edge aligned type
    (pwm)->PCR &= ~(PWM_PCR_PWM01TYPE_Msk << (u32ChannelNum >> 1));
    (pwm)->PCR |= PWM_PCR_CH0MOD_Msk << (8 * u32ChannelNum);
    *((__IO uint32_t *)((((uint32_t) & ((pwm)->CNR0)) + (u32ChannelNum) * 12))) = u16CNR;
明显就是直接使用了自动重装了


使用特权

评论回复
5
_寒寒_|  楼主 | 2015-7-2 08:49 | 只看该作者
天灵灵地灵灵 发表于 2015-6-30 22:28
你要看bsp包才行,那个有例题

官方例程里面只有个PWM相关的例程
PWM
PWM_Capture
PWM_DeadZone
PWM_DoubleBuffer
其中PWM中的main里面有这么一句
            PWMA->PCR |= PWM_PCR_CH0MOD_Msk;

明显也是使用了自动重装

使用特权

评论回复
6
quray1985| | 2015-7-2 21:08 | 只看该作者
我觉得楼主可以用库函数试试

使用特权

评论回复
7
lovecat2015| | 2015-7-2 21:24 | 只看该作者
你要看bsp包才行,那个有例题

使用特权

评论回复
8
_寒寒_|  楼主 | 2015-7-3 09:59 | 只看该作者
lovecat2015 发表于 2015-7-2 21:24
你要看bsp包才行,那个有例题

官方例程里面只有个PWM相关的例程
PWM
PWM_Capture
PWM_DeadZone
PWM_DoubleBuffer
其中PWM中的main里面有这么一句
           
PWMA->PCR |= PWM_PCR_CH0MOD_Msk;


明显也是使用了自动重装

使用特权

评论回复
9
_寒寒_|  楼主 | 2015-7-3 10:09 | 只看该作者
quray1985 发表于 2015-7-2 21:08
我觉得楼主可以用库函数试试

以下是lib中的PWM_ConfigOutputChannel
    // every two channels share a prescaler
    (pwm)->PPR = ((pwm)->PPR & ~(PWM_PPR_CP01_Msk << ((u32ChannelNum >> 1) * 8))) | (u16Prescale << ((u32ChannelNum >> 1) * 8));
    (pwm)->CSR = ((pwm)->CSR & ~(PWM_CSR_CSR0_Msk << (4 * u32ChannelNum))) | (u8Divider << (4 * u32ChannelNum));
    // set PWM to edge aligned type
    (pwm)->PCR &= ~(PWM_PCR_PWM01TYPE_Msk << (u32ChannelNum >> 1));
    (pwm)->PCR |= PWM_PCR_CH0MOD_Msk << (8 * u32ChannelNum);
    *((__IO uint32_t *)((((uint32_t) & ((pwm)->CNR0)) + (u32ChannelNum) * 12))) = u16CNR;


明显就是直接使用了自动重装了


请问,您是否仔细看过库函数。如果我一个串口需要7Bit字长,一个需要8Bit字长,库函数怎么用

使用特权

评论回复
10
mintspring| | 2015-7-11 21:35 | 只看该作者
PWM
PWM_Capture
PWM_DeadZone
PWM_DoubleBuffer

           
PWMA->PCR |= PWM_PCR_CH0MOD_Msk;指针操作吧

使用特权

评论回复
11
天灵灵地灵灵| | 2015-7-12 20:00 | 只看该作者
顿时就懂了,果然高手还是很多的。

使用特权

评论回复
12
奥德赛| | 2015-7-14 09:07 | 只看该作者
可以试试用库函数的方法实现

使用特权

评论回复
13
Messi1999| | 2015-7-14 21:25 | 只看该作者
正在找这方面的资料,谢谢楼主的分享

使用特权

评论回复
14
玛尼玛尼哄| | 2015-7-14 21:39 | 只看该作者
cnr和cmr的值就被清零了,,这两个寄存器是干啥用的啊。

使用特权

评论回复
15
_寒寒_|  楼主 | 2015-8-3 15:22 | 只看该作者
玛尼玛尼哄 发表于 2015-7-14 21:39
cnr和cmr的值就被清零了,,这两个寄存器是干啥用的啊。

计数的啊,datasheet上写的很清楚

使用特权

评论回复
16
奥德赛| | 2015-8-3 21:41 | 只看该作者
用寄存器操作会不会很难啊?不知道这个功能用库函数能实现不

使用特权

评论回复
17
598330983| | 2015-8-4 13:26 | 只看该作者
回帖里还是有高手的,也学了不少。

使用特权

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

本版积分规则

5

主题

94

帖子

1

粉丝