[技术问答] 关于M0516的PWM如何开启单触发模式的疑问

[复制链接]
1761|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
  1.     // every two channels share a prescaler
  2.     (pwm)->PPR = ((pwm)->PPR & ~(PWM_PPR_CP01_Msk << ((u32ChannelNum >> 1) * 8))) | (u16Prescale << ((u32ChannelNum >> 1) * 8));
  3.     (pwm)->CSR = ((pwm)->CSR & ~(PWM_CSR_CSR0_Msk << (4 * u32ChannelNum))) | (u8Divider << (4 * u32ChannelNum));
  4.     // set PWM to edge aligned type
  5.     (pwm)->PCR &= ~(PWM_PCR_PWM01TYPE_Msk << (u32ChannelNum >> 1));
  6.     (pwm)->PCR |= PWM_PCR_CH0MOD_Msk << (8 * u32ChannelNum);
  7.     *((__IO uint32_t *)((((uint32_t) & ((pwm)->CNR0)) + (u32ChannelNum) * 12))) = u16CNR;
明显就是直接使用了自动重装了


 楼主| _寒寒_ 发表于 2015-7-2 08:49 | 显示全部楼层
天灵灵地灵灵 发表于 2015-6-30 22:28
你要看bsp包才行,那个有例题

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

明显也是使用了自动重装
quray1985 发表于 2015-7-2 21:08 | 显示全部楼层
我觉得楼主可以用库函数试试
lovecat2015 发表于 2015-7-2 21:24 | 显示全部楼层
你要看bsp包才行,那个有例题
 楼主| _寒寒_ 发表于 2015-7-3 09:59 | 显示全部楼层
lovecat2015 发表于 2015-7-2 21:24
你要看bsp包才行,那个有例题

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


明显也是使用了自动重装
 楼主| _寒寒_ 发表于 2015-7-3 10:09 | 显示全部楼层
quray1985 发表于 2015-7-2 21:08
我觉得楼主可以用库函数试试

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


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


请问,您是否仔细看过库函数。如果我一个串口需要7Bit字长,一个需要8Bit字长,库函数怎么用
mintspring 发表于 2015-7-11 21:35 | 显示全部楼层
PWM
PWM_Capture
PWM_DeadZone
PWM_DoubleBuffer

           
PWMA->PCR |= PWM_PCR_CH0MOD_Msk;指针操作吧
天灵灵地灵灵 发表于 2015-7-12 20:00 | 显示全部楼层
顿时就懂了,果然高手还是很多的。
奥德赛 发表于 2015-7-14 09:07 | 显示全部楼层
可以试试用库函数的方法实现
Messi1999 发表于 2015-7-14 21:25 | 显示全部楼层
正在找这方面的资料,谢谢楼主的分享
玛尼玛尼哄 发表于 2015-7-14 21:39 | 显示全部楼层
cnr和cmr的值就被清零了,,这两个寄存器是干啥用的啊。
 楼主| _寒寒_ 发表于 2015-8-3 15:22 | 显示全部楼层
玛尼玛尼哄 发表于 2015-7-14 21:39
cnr和cmr的值就被清零了,,这两个寄存器是干啥用的啊。

计数的啊,datasheet上写的很清楚
奥德赛 发表于 2015-8-3 21:41 | 显示全部楼层
用寄存器操作会不会很难啊?不知道这个功能用库函数能实现不
598330983 发表于 2015-8-4 13:26 | 显示全部楼层
回帖里还是有高手的,也学了不少。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

94

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部