STM8S--PWM配置

本文使用的芯片是是stm8s103f3。

以下主要说明配置TIM2通道1为PWM输出的过程。

1.寄存器配置

4位预分频器,计数器的计数频率Fck_cnt=Fck_psc/2^(PSC[3:0])=16M/2^0=16M

那么计数周期为1/16us,也就是说计数器会每隔1/16us计数一次。

TIM2_PSCR=0x00; //分频值=0 16M

自动重装载寄存器,

当自动重装载寄存器=0时,计数器处于阻塞状态,也就是不计数状态,因为当CNTR=ARR时,CNTR就会清零,所以配置时自动重装载寄存器应该大于0。另外自动重装载寄存器的值就是PWM波形的周期,比如ARR=0X0100,PWM的周期为0x0100*1/16=16us,PWM的周期就是16us

  TIM2_ARRH=0x01; //自动重装的值 0x0100

  TIM2_ARRL=0x00;

捕获/比较使能寄存器,这个寄存器的配置可以选通相应的Tim2通道。

bit5,bit4为ch2配置,bit1,bit0为ch1配置

如果当前OC1为输出通道,则

bit1:OC1低电平有效

bit0:OC1信号被输出到当前引脚上

  TIM2_CCER1=bit0|bit1; //low level,OC1

捕获/比较模式寄存器,

bit1,bit0

CC1S[1:0]为捕获/比较选择

        00:CC1通道被配置为输出

bit2保留

bit3输出比较预加载使能

    0:不使能

    1:使能

bit6,bit5,bit4输出比较模式

    110:PWM1模式

PWM1和PWM2模式区别

PWM1:CNT<CCR,CH1被激活

PWM2:CNT>CCR,CH1被激活

TIM2_CCMR1=bit3|bit5|bit6; //MODE

捕获/比较寄存器,这个寄存器决定着PWM的占空比。CCR/ARR=PWM的占空比,例如设置为0x0060,那么占空比为0x0060/0x0100=6/16

  TIM2_CCR1H=0x00;

  TIM2_CCR1L=0x60;

中断使能寄存器,如果需要中断可以在此设置。

bit1:CC1E 捕获/比较1中断使能

    0:CC1 中断不使能

    1:CC1中断使能

  TIM2_IER=0x00; //更新中断使能

控制寄存器,bit0控制计数器的打开和关闭。

bit0,计数器使能

    0:不使能

    1:使能

  TIM2_CR1=bit0; //enable counter

通过逻辑分析仪测试PD4管脚的输出电平,波形图如下所示。

源码如下,

//*******************************************

 1 #define bit0 0x01
 2 #define bit1 0x02
 3 #define bit2 0x04
 4 #define bit3 0x08
 5 #define bit4 0x10
 6 #define bit5 0x20
 7 #define bit6 0x40
 8 #define bit7 0x80
 9
10   void Timer2_Init(void)
11   {
12     CLK_ICKR|=0x01;         //开启内部HSI
13    while(!(CLK_ICKR&0x02));//HSI准备就绪
14     CLK_SWR=0xe1;           //HSI为主时钟源
15     CLK_CKDIVR=0x00;   //HSI,8分频=16M
16     TIM2_PSCR=0x00;       //分频值=0 16M
17     TIM2_ARRH=0x01;       //自动重装的值 0x0100
18    TIM2_ARRL=0x00;
19    TIM2_CCER1=bit0|bit1; //low level,OC1
20
21    TIM2_CCMR1=bit3|bit5|bit6;  //MODE
22   TIM2_CCR1H=0x00;
23    TIM2_CCR1L=0x60;
24    TIM2_IER=0x00;        //更新中断使能
25
26    TIM2_CR1=bit0;        //enable counter
27  }
28 int main( void )
29 {
30   Timer2_Init();
31   while(1){};
32 }

 

 

STM8S--PWM配置,布布扣,bubuko.com

时间: 2024-10-06 12:25:58

STM8S--PWM配置的相关文章

STM8S PWM 应用 呼吸灯

//主功能接受:使用MCU STM8S105C6 的PWM通道2 PC2 来做呼吸灯 已经验证OK,呵 //呵,这个PWM设置刚开始用还是有点麻烦,因为是自己摸索,花点时间,还是攻克了 . //所用子函数都是调用STM8S的库函数stm8s_tim.c 中的. 宏定义: //分频宏 //计数器的时钟频率(fCK_CNT)等于fCK_PSC/( PSCR[15:0]+1). #define TIM1_PRESCALER_1 ((u16)0x00) #define TIM1_PRESCALER_2

dsp2812 pwm配置

肚子疼了好几天,今天稍微好点,简单写点东西. 好几个月前做的项目,有些地方已经记不清楚了,但是突然客户又来问关于代码配置的情况,重新查看了代码,把相关的知识也整理一下. dsp2812中有好几个时钟相关的配置.首先是系统时钟SYSCLKOUT=15MHZ*PLL(PLL可以在代码中进行修改). 我的代码中将PLL设置成7,所以SYSCLKOUT=105MHZ 还有两个时钟是外设时钟,分别是高速外设时钟和低速外设时钟,它们分别由HISPCP和LOSPCP这两个寄存器来控制. 高速外设时钟用于事件管

STM32 PWM配置

一:配置TIM3的ARR寄存器和PSC寄存器,确定PWM频率. 这里配置的这两个定时器确定了PWM的频率,我的理解是:PWM的周期(频率)就是ARR寄存器值与PSC寄存器值相乘得来,但不是简单意义上的相乘,例如要设置PWM的频率参考上次通用定时器中设置溢出时间的算法,例如输出100HZ频率的PWM,首先,确定TIMx的时钟,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,这时的TIMx时钟为72MHz,用这个TIMx时钟72MHz除以(PSC+1),得到定时器

wiringPi库的pwm配置及使用说明

本文介绍树莓派(raspberry pi)在linux c 环境下的硬件pwm配置及使用方法. 1. 下载安装wiringPi 此步骤建议参考官网指南 http://wiringpi.com/download-and-install/,wiringPi提供了对树莓派的硬件IO访问,包括GPIO/I2C/PWM等下载安装后,本地会出现wiringpI文件夹,根目录下有/examples 可供参考. 2. 树莓派PWM硬件 以raspberry pi 3b 为例,尝试在命令行下输入 pinout,可

STM32F0xx_TIM输出PWM配置详细过程

前言 前面我说过STM32的定时器功能很强大,今天就来总结一下它的另外一个“强大”功能:TIM的比较输出功能,输出可调PWM波形.直接调用函数接口“TIM2_CH1_PWM(uint32_t Freq, uint16_t Dutycycle)”传入频率和占空比就能输出指定的波形. 我提供的软件工程直接调用是比较简单就能实现想要的PWM波形.但是,如果你是学习者,建议还是进去函数把每一个细节了解清楚,里面的东西可能对你掌握TIM很有帮助. 本着免费分享的原则,如果你觉得分享的内容对你有用,认可我分

STM8S时钟配置CLK_HSIPrescalerConfig与CLK_SYSCLKConfig区别

STM8S的时钟配置通过:CLK_CKDIVR寄存器,而CLK_CKDIVR一个是配置HSI分频,另一个是配置CPU的分频 static void CLK_Config(void){ CLK_DeInit(); /* Clock divider to HSI/1 */ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);  // 只配置HSI分频率,CPU分频率1 /* Output Fcpu on CLK_CCO pin */ CLK_CCOConfig

STM32基础问题分析——PWM配置

在使用STM32F103产生固定频率.固定占空比的PWM波时,虽然有官方以及众多开发板提供的例程,但是关于有点问题并没有说的很清晰,并且<STM32F10X参考手册>的中文翻译可能容易造成歧义,所以一开始并没有理解,这里就梳理一下我的理解,如果有误解的情况,希望交流指正. 1. 遇到的问题 先直接上段配置代码,这段代码是产生一个20kHz固定频率,50%固定占空比的方波信号,典型的配置过程,一般来说也不会有什么太多的疑问.但是我逐步了解背后的定时器工作逻辑的时候,就产生了一些疑问,也没有找到合

不同频率下的pwm配置

200k //PWM1 PWMPERDL1=0xb3; PWMPERDH1= 0x00; PWMCCNTL1=0x6B; PWMCCNTH1= 0; PWMDBDY1=0x2B; //死区延时计时器 //PWM0 PWMPERDL0=pwm_per_L ; PWMPERDH0=pwm_per_H ; PWMCCNTL0=0x6B ; PWMCCNTH0=0x00 ; PWMDBDY0=0x2B; //死区延时计时器 500k

STM8S---TIM2产生PWM与TIM1定时器周期中断的时钟问题

1 问题 ??在下面的测试程序中,如果将Init_CLK()函数中的 CLK_CKDIVR |= 0x08;去掉'|',则TIM1的功能实现跟预设定相同(10ms中断一次),但是TIM2的PWM频率就变高了:如果加上,则TIM2的功能实现跟预设定相同(产生1Hz的PWM),但是TIM1的周期就变长了: ??尝试了很多测试,均无效(买的开发板和另一块gs自画板测试也都一样). 2 尝试 ??因为STM8S默认使用内部16M高速RC振荡器,且8分频,则系统启动主时钟为2M.即CLK_CKDIVR =

stm32寄存器版学习笔记05 PWM

STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟,配置PA8为复用输出 APB2外设时钟使能寄存器(RCC_APB2ENR) APB1外设复位寄存器 (RCC_APB1RSTR) 置1开启.清0关闭. Eg:RCC->APB2ENR|=1<<11; //使能TIM1时钟 配置I/O口: 参见stm32寄存器版学习笔记01 GPIO口的配置