3 2- STM8更新タイマ割り込み+ PWM出力(IARのIDE)を注

A:IARコンパイラ割り込み機能の説明

IARでその下に、IARはiostm8s105s6.hファイルに追加する必要があり、最終的に次のファイルにあります:

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

 *ベクトル割り込み番号

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

に#define SPI_TXE_vector 0x0Cの

に#define SPI_RXNE_vector 0x0Cの

に#define SPI_WKUP_vector 0x0Cの

に#define SPI_CRCERR_vector 0x0Cの

# SPI_OVR_vector 0x0CのDEFINE

の#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の

ADC1_AWS9_vector 0x18のに#define

の#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タイマーとして、自分自身を記述する必要があり、割り込みベクタテーブルを制御する
ベクトル= TIM3_OVR_UIF_vectorの#pragma

__interrupt TIM3_UPD_OVF_IRQHandler空隙(ボイド)

{
  TIM3_SR = 0X00; //クリア割込みフラグ
  }

キーワードを使用してくださいに#pragmaベクトル=この割り込みハンドラは数、キーワード中断する指さ指摘__interruptを、これが割り込みハンドラであることを、プレフィックス機能として。

2:割り込み優先度説明

1 0 0 メイン
0 1 レベル1
0 0 レベル2
1 1 3 レベル(= 無効ソフトウェアプライオリティ

STM8は、優先度のパケットを制御するために、ハードウェアの優先制御方式を使用して、優先度+ソフトウェアを中断します。ハードウェアの優先順位への優先ソフトウェア。ベクトルによって決定さハードウェア優先順位番号、ベクタ番号、優先度の高いです。

ASM( "SIM"); //オフグローバル割り込み
ASM( "リム"); //オープングローバル割り込み

割り込み優先順位を定義して、合計中断を開きます。

3:はじめにタイマ3レジスタ

図1に示すように、周辺クロック・ゲーティング・レジスタ(CLK_PCKENR1)

7:0 PCKEN1の[7:0] 周辺クロックが有効に
ソフトウェアによって書かれました。有効または無効にFをMASTERは、対応する周辺クロックに接続されています。参照9。
0 :無効F MASTER 周辺接続を有する
1 :有効FをMASTERは、周辺機器に接続されています

 

 周辺クロックゲーティングビット:

制御ビット 周辺機器
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] 周辺クロックが有効に
ソフトウェアによって書かれました。有効または無効にFをMASTERは、対応する周辺クロックに接続されています。参照10
0 無効:F MASTER と周辺機器の接続を
1 :有効Fをマスタが周辺装置に接続されています。

 

周辺クロックゲーティングビット

制御ビット 周辺機器
PCKEN27 できる
PCKEN26 予約済み
PCKEN25 予約済み
PCKEN24 予約済み
PCKEN23 ADC
PCKEN22 良く
PCKEN21 予約済み
PCKEN20 予約済み

図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;
  }
}

 

 

 

おすすめ

転載: www.cnblogs.com/caiya/p/11426006.html