• stm8笔记2-定时3更新中断+pwm输出(IDE为IAR)


    一:IAR编译器中断函数说明

    下面说一下在IAR下,在IAR下必须要添加iostm8s105s6.h文件,在文件的最后有如下内容:

    /*-------------------------------------------------------------------------

     *      Interrupt vector numbers

     *-----------------------------------------------------------------------*/
    #define AWU_vector                           0x03

    #define SPI_TXE_vector                       0x0C

    #define SPI_RXNE_vector                      0x0C

    #define SPI_WKUP_vector                      0x0C

    #define SPI_CRCERR_vector                    0x0C

    #define SPI_OVR_vector                       0x0C

    #define SPI_MODF_vector                      0x0C

    #define TIM1_OVR_UIF_vector                  0x0D

    #define TIM1_CAPCOM_BIF_vector               0x0D

    #define TIM1_CAPCOM_TIF_vector               0x0D

    #define TIM1_CAPCOM_CC1IF_vector             0x0E

    #define TIM1_CAPCOM_CC2IF_vector             0x0E

    #define TIM1_CAPCOM_CC3IF_vector             0x0E

    #define TIM1_CAPCOM_CC4IF_vector             0x0E

    #define TIM1_CAPCOM_COMIF_vector             0x0E

    #define TIM2_OVR_UIF_vector                  0x0F

    #define TIM2_CAPCOM_CC1IF_vector             0x10

    #define TIM2_CAPCOM_TIF_vector               0x10

    #define TIM2_CAPCOM_CC2IF_vector             0x10

    #define TIM2_CAPCOM_CC3IF_vector             0x10

    #define UART1_T_TXE_vector                   0x13

    #define UART1_T_TC_vector                    0x13

    #define UART1_R_OR_vector                    0x14

    #define UART1_R_RXNE_vector                  0x14

    #define UART1_R_IDLE_vector                  0x14

    #define UART1_R_PE_vector                    0x14

    #define UART1_R_LBDF_vector                  0x14

    #define I2C_ADD10_vector                     0x15

    #define I2C_ADDR_vector                      0x15

    #define I2C_OVR_vector                       0x15

    #define I2C_STOPF_vector                     0x15

    #define I2C_BTF_vector                       0x15

    #define I2C_WUFH_vector                      0x15

    #define I2C_RXNE_vector                      0x15

    #define I2C_TXE_vector                       0x15

    #define I2C_BERR_vector                      0x15

    #define I2C_ARLO_vector                      0x15

    #define I2C_AF_vector                        0x15

    #define I2C_SB_vector                        0x15

    #define ADC1_AWS0_vector                     0x18

    #define ADC1_AWS1_vector                     0x18

    #define ADC1_AWS2_vector                     0x18

    #define ADC1_AWS3_vector                     0x18

    #define ADC1_AWS4_vector                     0x18

    #define ADC1_AWS5_vector                     0x18

    #define ADC1_AWS6_vector                     0x18

    #define ADC1_EOC_vector                      0x18

    #define ADC1_AWS8_vector                     0x18

    #define ADC1_AWS9_vector                     0x18

    #define ADC1_AWDG_vector                     0x18

    #define ADC1_AWS7_vector                     0x18

    #define TIM4_OVR_UIF_vector                  0x19

    #define FLASH_EOP_vector                     0x1A

    #define FLASH_WR_PG_DIS_vector               0x1A

    对照中断向量表,如果用到中断,必须自己写中断,比如TIM3定时器中断
    #pragma vector=TIM3_OVR_UIF_vector

    __interrupt void TIM3_UPD_OVF_IRQHandler (void)

    {
      TIM3_SR = 0X00;//清除中断标志
      }

    用关键字#pragma vector=指出本中断处理函数指向的中断号,用关键字__interrupt作为函数的前缀,表示这是中断处理函数。

    二:中断优先级说明

    1 0 0(主程序)
    0 1 级别1
    0 0 级别2
    1 1 3(=禁用软件优先级)

    STM8的中断采用软件优先级+硬件优先级的控制方法,来控制优先级分组。软件优先级优先于硬件优先级。硬件优先级由向量号确定,向量号越小,优先级越高。

    asm("sim");//关全局中断
    asm("rim");//开全局中断

    先定义中断优先级,然后开总中断。

    三:定时器3寄存器介绍

    1,外设时钟门控寄存器(CLK_PCKENR1)

    7:0 PCKEN1[7:0]:外设时钟使能
    由软件写入。使能或禁止fMASTER时钟与对应外设的连接。参见9
    0:禁止fMASTER与外设连接
    1:使能fMASTER与外设的连接

     外设时钟门控位 :

    控制位 外设
    PCKEN17 TIM1
    PCKEN16 TIM3
    PCKEN15 TIM2
    PCKEN14 TIM4
    PCKEN13 UART2/3
    PCKEN12 UART1
    PCKEN11 SPI
    PCKEN10 I2C

    外设时钟门控寄存器 2(CLK_PCKENR2)

    7:0 PCKEN2[7:0]:外设时钟使能
    由软件写入。使能或禁止fMASTER时钟与对应外设的连接。参见10
    0:禁止fMASTER与外设连接
    1:使能fMASTER与外设的连接

    外设时钟门控位

    控制位 外设
    PCKEN27 CAN
    PCKEN26 Reserved
    PCKEN25 Reserved
    PCKEN24 Reserved
    PCKEN23 ADC
    PCKEN22 AWU
    PCKEN21 Reserved
    PCKEN20 Reserved

    2,捕获/比较模式寄存器 1(TIMx_CCMR1)

    通道配置为输出模式:

    通道配置为输入模式:

    3,捕获/比较模式寄存器 2(TIMx_CCMR2)

    4,捕获/比较使能寄存器 1(TIMx_CCER1)

    5,捕获/比较使能寄存器 2(TIMx_CCER2)

    6,预分频器(TIMx_PSCR)

    7,自动装载寄存器高位(TIMx_ARRH) ,自动装载寄存器低位(TIMx_ARRL) :保存自动装载值
    8,捕获/比较寄存器 1 高位(TIMx_CCR1H) ,捕获/比较寄存器 1 低位(TIMx_CCR1L) :保存通道1捕获、比较的值,其余通道变序号即可
    9,计数器高位(TIMx_CNTRH) ,计数器低位(TIMx_CNTRL) :保存计数器值

    10,控制寄存器1(TIMx_CR1)

    11,中断使能寄存器(TIMx_IER)

    12,状态寄存器 1(TIMx_SR1)

    13,状态寄存器 2(TIMx_SR2)

    四:步骤

    1,定时器3溢出中断软件优先级为级别1(寄存器ITC_SPR4)

    2,开全局中断

    3,开启定时器3外设时钟(寄存器CLK_PCKENR1)

    4,设置定时器3一通道(PD2)pwm模式1,输出比较1预装载使能,CC1通道被配置为输出(寄存器TIM3_CCMR1)

    5,OC1低电平有效,开启- OC1信号输出到对应的输出引脚(寄存器TIM3_CCER1)

    6,始化时钟分频器为1,即不分频(寄存器TIM3_PSCR)

    7,初始化自动装载寄存器,决定PWM 方波的频率(寄存器TIM3_ARRH , TIM3_ARRL)

    8,初始化比较寄存器,决定PWM 方波的占空比(寄存器  TIM3_CCR1H ,TIM3_CCR1L )

    9,设定定时器计数器的值,可要可不要(寄存器  TIM3_CNTRH=0x00,TIM3_CNTRL)

    10,预装载不使能,非单脉冲模式,所有更新事件都会发送中断请求,正常产生更新事件,计数器不使能(寄存器TIM3_CR1)

    11,允许更新中断(寄存器TIM3_IER)

    12,开启定时器(寄存器  TIM3_CR1)

    13,编写中断处理函数即可,记得要清除中断标志位。

    五:完整代码

    #include "iostm8s105s6.h"
    
    
    void delay(unsigned int t);
    
    
    void main()
    {
      if(CLK_CMSR!=0xB4)//判断当前时钟,如果不是HSE则自动切换成HSE
      {
        CLK_SWCR|=0x02;//SWEN置1,使能切换
        CLK_SWR=0xB4;//目标时钟源为HSE外部晶振
        while((CLK_SWCR&0x08)==0);//等待,直到切换成功,SWIF被置位
        CLK_SWCR=0;//清除标志位
      }
      
      
      PG_DDR=0X01;//配置PG0为输出
      PG_CR1=0X01;//配置PG0为推挽输出
      PG_CR2=0X00;//输出速率=2MHz
      
      PD_DDR |= 0X04;             //设置PD2端口为输出模式
      PD_CR1 |= 0X04;             //设置PD2端口为推挽输出模式
      PD_CR2 &= 0XFD;
      
      ITC_SPR4=0X40;//定时器3溢出中断软件优先级为级别1
      asm("rim");//开全局中断
      
      CLK_PCKENR1|=0x40;//开启定时器3外设时钟
      TIM3_CCMR1 =0X68;   //设置定时器3一通道(PD2)pwm模式1,输出比较1预装载使能,CC1通道被配置为输出
      TIM3_CCER1 = 0x03;     //OC1低电平有效,开启- OC1信号输出到对应的输出引脚。
      TIM3_PSCR = 0X00; //初始化时钟分频器为1,即不分频 
    
      //初始化自动装载寄存器,决定PWM 方波的频率
      TIM3_ARRH = 0X06;
      TIM3_ARRL = 0X40;
    
      //初始化比较寄存器,决定PWM 方波的占空比
      TIM3_CCR1H =0X03;
      TIM3_CCR1L =0X20;
    
      TIM3_CNTRH=0x00;//定时器计数器的值
      TIM3_CNTRL=0x00;
      
      TIM3_CR1=0x00;//预装载不使能,非单脉冲模式,所有更新事件都会发送中断请求,正常产生更新事件,计数器不使能
      TIM3_IER=0X01;//允许更新中断
      TIM3_CR1|=0x01;// 开启定时器
    
      while(1)
      {
        delay(50000);
      }
    }
    
    void delay(unsigned int t)
    {
      while(t--); 
    }
    #pragma vector=TIM3_OVR_UIF_vector 
    
    __interrupt void TIM3_UPD_OVF_IRQHandler (void)
    
    {
      static int w=0;
      TIM3_SR1&=~0X01;//清除中断标志位
    
      w++;
      if(w<3000)
      {
          PG_ODR|=0X01;//小灯亮
      }
      else
      {
          PG_ODR&=0XFE;//小灯灭
     
      }
      if(w==6000)
      {
         w=0;
      }
    }

     库函数的中断函数

    INTERRUPT_HANDLER(TIM2_UPD_OVF_IRQHandler, 13)
    {
      static int w;
      TIM2->SR1&=~0X01;//清除中断标志位
      GPIOA->ODR|=0X08;//小灯亮
      w++;
      if(w==6)
      {
          GPIOA->ODR|=0X08;//小灯亮
      }
      else if(w==12)
      {
          GPIOA->ODR&=0XF7;//小灯灭
           w=0;
      }
      
      
    } 

     

  • 相关阅读:
    java代码连接数据库编码实现
    ffmpeg工具的使用
    java的jar包服务实现开机启动
    mongodb的联合查询
    java8 stream多字段排序
    springboot调用webservice接口的两种方式,不使用axis
    使用highlight.js高亮你的代码
    使用弹性布局来解决令人烦恼的垂直居中问题~~
    使用less函数实现不同背景的CSS样式
    使用GitBook编写文档
  • 原文地址:https://www.cnblogs.com/caiya/p/11426006.html
Copyright © 2020-2023  润新知