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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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作为函数的前缀,表⽰这是中断处理函数。

⼆:中断优先级说明
100级(主程序)
01级别1
00级别2
113级(=禁⽤软件优先级)
STM8的中断采⽤软件优先级+硬件优先级的控制⽅法,来控制优先级分组。

软件优先级优先于硬件优先级。

硬件优先级由向量号确定,向量号越⼩,优先级越⾼。

asm("sim");//关全局中断
asm("rim");//开全局中断
先定义中断优先级,然后开总中断。

三:定时器3寄存器介绍
1,外设时钟门控寄存器(CLK_PCKENR1)
位 7:0PCKEN1[7:0]:外设时钟使能
由软件写⼊。

使能或禁
⽌fMASTER时钟与对应外设的连接。

参见表9
0:禁⽌fMASTER与外设连接
1:使能fMASTER与外设的连接
外设时钟门控位:
控制位外设PCKEN17TIM1 PCKEN16TIM3 PCKEN15TIM2 PCKEN14TIM4 PCKEN13UART2/3 PCKEN12UART1 PCKEN11SPI PCKEN10I2C
外设时钟门控寄存器 2(CLK_PCKENR2)
位 7:0PCKEN2[7:0]:外设时钟使能
由软件写⼊。

使能或禁
⽌fMASTER时钟与对应外设的连接。

参见表10
0:禁⽌fMASTER与外设连接
1:使能fMASTER与外设的连接
外设时钟门控位
控制位外设
PCKEN27CAN PCKEN26Reserved PCKEN25Reserved PCKEN24Reserved PCKEN23ADC PCKEN22AWU PCKEN21Reserved PCKEN20Reserved
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;
}
}。

相关文档
最新文档