历史上的今天
今天是:2024年09月15日(星期日)
2020年09月15日 | stm8笔记2-定时3更新中断+pwm输出(IDE为IAR)
2020-09-15 来源:eefocus
一: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外部晶振
上一篇:stm8笔记3-ad连续采样
下一篇:pwm互补输出 死区设置
史海拾趣
|
有5个记录A、B、C、D、E存放在某磁盘的某一磁道上,假定这个磁道划分为5块,每块存放一个记录,现在要顺序处理这5个记录,如果磁盘旋转速度为20ms转1周,处理程序每读出一个记录后花6ms进行处理。试问(1)处理完5个记录的总时间是多少?(2)为减 ...… 查看全部问答> |
|
WindowsMobile 自带的camera应用能接收jpg type的数据吗 底层驱动直接传上来.jpg数据,用WindowsMobile 自带的camera应用测试,能得到数据并直接保存吗? 有哪位试过?… 查看全部问答> |
|
1、创建一个新的打印端口类型 2、可以将系统现有的打印机的端口修改成新端口 3、可以监管此端口上的打印任务 4、创建新的打印属性页 就是这个虚拟端口 无论对于网络上的其它PC来说还是本机来说都是一个打印端口 客户机发送打印文档到该端 ...… 查看全部问答> |
|
有没有人做过msp430F149单片机的spi通信的 为什么我们的UCLK出来的不是正常的方波; 有源代码更好;能不能把主机和从机调好再给我 下面是我们的程序(主机):但是不能正常的通信; #include void delay(void); void main(void) { ...… 查看全部问答> |
|
按照905的手册,当设置为发送模式时,如果发送数据成功,DR位会被置高,但是我一直检测不到为高的信号,这跟延时有关吗?还是信号根本就没有发出去呀? 那个数据通过SPI口写入寄存器,调用一直SPI_SendData()函数发送一个数据后寄存器会被清空吗?… 查看全部问答> |
|
STM32写华邦w25X16时读正确,却写不进去,用自己的程序可以读出例程写进去的的字符串,但是自己的程序写不进去内容 /*要写入到W25X16的字符串数组*/ const u8 TEXT_Buffer[]={\"神州三号 SPI 读写访问程序\"}; #define SIZE sizeof(TEXT_Buffer) ...… 查看全部问答> |




