STM32产生PWM是非常的方便的,要需要简单的设置定时器,即刻产生!当然,简单的设置对于新手来讲,也是麻烦的,主要包括:
(1)使能定时器时钟:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
复制代码
(2)定义相应的GPIO:
/ PA2,3,4,5,6输出->Key_Up,Key_Down,Key_Left,Key_Right,Key_Ctrl /
GPIO_InitStructureGPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructureGPIO_Mode = GPIO_Mode_IPU; //下拉接地,检测输入的高电平
GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
GPIO_Init(GPIOA, &GPIO_InitStructure);
/ PA7用于发出PWM波,即无线数据传送 /
GPIO_InitStructureGPIO_Pin = GPIO_Pin_7;
GPIO_InitStructureGPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
GPIO_Init(GPIOA, &GPIO_InitStructure);
复制代码
(3)如果是产生PWM(频率不变,占空比可变),记得打开PWM控制,在TIM_Configuration()中。
TIM_Cmd(TIM3,ENABLE);
/ TIM1 Main Output Enable /
TIM_CtrlPWMOutputs(TIM1,ENABLE);
复制代码
利用定时器产生不同频率的PWM
有时候,需要产生不同频率的PWM,这个时候,设置与产生相同PWM的程序,有关键的不一样。
(一) 设置的原理
利用改变定时器输出比较通道的捕获值,当输出通道捕获值产生中断时,在中断中将捕获值改变,这时, 输出的I/O会产生一个电平翻转,利用这种办法,实现不同频率的PWM输出。
(二)关键设置
在定时器设置中:
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);
复制代码
在中断函数中:
if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
capture = TIM_GetCapture2(TIM3);
TIM_SetCompare2(TIM3, capture + Key_Value);
}
复制代码
一个定时器四个通道,分别产生不同频率(这个例子网上也有)
vu16 CCR1_Val = 32768;
vu16 CCR2_Val = 16384;
vu16 CCR3_Val = 8192;
vu16 CCR4_Val = 4096;void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/ TIM2 clock enable /
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/ ---------------------------------------------------------------
TIM2 Configuration: Output Compare Toggle Mode:
TIM2CLK = 36 MHz, Prescaler = 0x2, TIM2 counter clock = 12 MHz
CC1 update rate = TIM2 counter clock / CCR1_Val = 3662 Hz
CC2 update rate = TIM2 counter clock / CCR2_Val = 7324 Hz
CC3 update rate = TIM2 counter clock / CCR3_Val = 14648 Hz
CC4 update rate = TIM2 counter clock / CCR4_Val = 29296 Hz
--------------------------------------------------------------- // Time base configuration /
TIM_TimeBaseStructureTIM_Period = 65535;
TIM_TimeBaseStructureTIM_Prescaler = 2;
TIM_TimeBaseStructureTIM_ClockDivision = 0;
TIM_TimeBaseStructureTIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);/ Channel 1 Configuration in PWM mode /
TIM_OCInitStructureTIM_OCMode = TIM_OCMode_Toggle; //PWM模式2
TIM_OCInitStructureTIM_OutputState = TIM_OutputState_Enable; //正向通道有效
TIM_OCInitStructureTIM_OutputNState = TIM_OutputNState_Disable;//反向通道无效
TIM_OCInitStructureTIM_Pulse = CCR1_Val; //占空时间
TIM_OCInitStructureTIM_OCPolarity = TIM_OCPolarity_Low; //输出极性
TIM_OCInitStructureTIM_OCNPolarity = TIM_OCNPolarity_High; //互补端的极性
TIM_OCInitStructureTIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructureTIM_OCNIdleState = TIM_OCIdleState_Reset;TIM_OC1Init(TIM2,&TIM_OCInitStructure); //通道1
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);TIM_OCInitStructureTIM_Pulse = CCR2_Val; //占空时间
TIM_OC2Init(TIM2,&TIM_OCInitStructure); //通道2
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);TIM_OCInitStructureTIM_Pulse = CCR3_Val; //占空时间
TIM_OC3Init(TIM2,&TIM_OCInitStructure); //通道3
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);TIM_OCInitStructureTIM_Pulse = CCR4_Val; //占空时间
TIM_OC4Init(TIM2,&TIM_OCInitStructure); //通道4
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);
/ TIM2 counter enable /
TIM_Cmd(TIM2,ENABLE);
/ TIM2 Main Output Enable /
//TIM_CtrlPWMOutputs(TIM2,ENABLE);/ TIM IT enable /
TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);}void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;/允许总线CLOCK,在使用GPIO之前必须允许相应端的时钟
从STM32的设计角度上说,没被允许的端将不接入时钟,也就不会耗能,
这是STM32节能的一种技巧,/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
/ PA2,3,4,5,6,7输出->LED1,LED2,LED3,LED4,LED5,LED6 /
GPIO_InitStructureGPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructureGPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
GPIO_Init(GPIOA, &GPIO_InitStructure);
/ PB0,1输出->LED7,LED8/
GPIO_InitStructureGPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructureGPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
GPIO_Init(GPIOB, &GPIO_InitStructure);
/ PA0,1->KEY_LEFT,KEY_RIGHT/
GPIO_InitStructureGPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructureGPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);/ PC13->KEY_UP/
GPIO_InitStructureGPIO_Pin = GPIO_Pin_13;
GPIO_InitStructureGPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOC, &GPIO_InitStructure);/ PB5->KEY_DOWN/
GPIO_InitStructureGPIO_Pin = GPIO_Pin_5;
GPIO_InitStructureGPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);/ GPIOA Configuration:TIM2 Channel1, 2, 3 and 4 in Output /
GPIO_InitStructureGPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructureGPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
}void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;/ Configure one bit for preemption priority /
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructureNVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructureNVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructureNVIC_IRQChannelSubPriority=1;
NVIC_InitStructureNVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}u16 capture = 0;
extern vu16 CCR1_Val;
extern vu16 CCR2_Val;
extern vu16 CCR3_Val;
extern vu16 CCR4_Val;void TIM2_IRQHandler(void)
{/ TIM2_CH1 toggling with frequency = 1831 Hz /
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 );
capture = TIM_GetCapture1(TIM2);
TIM_SetCompare1(TIM2, capture + CCR1_Val );
}
/ TIM2_CH2 toggling with frequency = 3662 Hz /
if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
capture = TIM_GetCapture2(TIM2);
TIM_SetCompare2(TIM2, capture + CCR2_Val);
}/ TIM2_CH3 toggling with frequency = 7324 Hz /
if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
capture = TIM_GetCapture3(TIM2);
TIM_SetCompare3(TIM2, capture + CCR3_Val);
}/ TIM2_CH4 toggling with frequency = 14648 Hz /
if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
capture = TIM_GetCapture4(TIM2);
TIM_SetCompare4(TIM2, capture + CCR4_Val);
}}
复制代码
一个定时器一个通道,产生不同频率
其它的设置都一样,就是在主函数中修改一个参数,然后在定时器中断中,根据这个参数,改变频率。
#include "stm32lib\\stm32f10xh"
#include "halh"volatile u16 Key_Value=1000; //用于保存按键相应的PWM波占空比值
int main(void)
{
ChipHalInit();
ChipOutHalInit();while(1)
{
if( (!Get_Key_Up)&(!Get_Key_Down)&(!Get_Key_Left)&(!Get_Key_Right)&(!Get_Key_Ctrl) )
{
Key_Value=12000;
}
else
{
if(Get_Key_Up) //按键前进按下 ,对应1kHz
{
Key_Value=6000;
}
else if(Get_Key_Down) //按键后退按下 ,对应2kHz
{
Key_Value=3000;
}
Delay_Ms(20); //10ms延时if(Get_Key_Left) //按键左转按下,对应3kHz
{
Key_Value=2000;
}
else if(Get_Key_Right) //按键右转按下,对应4kHz
{
Key_Value=1500;
}
Delay_Ms(20); //10ms延时if(Get_Key_Ctrl) //按键控制按下,对应5kHz
{
Key_Value=1200;
}
Delay_Ms(20); //10ms延时
}
}
}extern volatile u16 Key_Value;
u16 capture=0;
void TIM3_IRQHandler(void)
{
/ TIM2_CH2 toggling with frequency = 3662 Hz /
if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
capture = TIM_GetCapture2(TIM3);
TIM_SetCompare2(TIM3, capture + Key_Value);
}
}void TIM3_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;/ TIM2 clock enable /
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);/TIM1时钟配置/
TIM_TimeBaseStructureTIM_Prescaler = 5; //预分频(时钟分频)72M/6=12M
TIM_TimeBaseStructureTIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseStructureTIM_Period = 65535; //装载值选择最大
TIM_TimeBaseStructureTIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructureTIM_RepetitionCounter = 0x0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);/ Channel 1 Configuration in PWM mode /
TIM_OCInitStructureTIM_OCMode = TIM_OCMode_Toggle; //PWM模式2
TIM_OCInitStructureTIM_OutputState = TIM_OutputState_Enable; //正向通道有效
TIM_OCInitStructureTIM_OutputNState = TIM_OutputNState_Disable;//反向通道无效
TIM_OCInitStructureTIM_Pulse = Key_Value; //占空时间
TIM_OCInitStructureTIM_OCPolarity = TIM_OCPolarity_Low; //输出极性
TIM_OCInitStructureTIM_OCNPolarity = TIM_OCNPolarity_High; //互补端的极性
TIM_OCInitStructureTIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructureTIM_OCNIdleState = TIM_OCIdleState_Reset;TIM_OC2Init(TIM3,&TIM_OCInitStructure); //通道2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);
/ TIM1 counter enable /
TIM_Cmd(TIM3,ENABLE);
/ TIM1 Main Output Enable /
//TIM_CtrlPWMOutputs(TIM1,ENABLE);
TIM_ITConfig(TIM3, TIM_IT_CC2 , ENABLE);
}
复制代码
注意:在计算PWM频率的时候,TIMx的时钟都是72Mhz,分频后,因为翻转两次才能形成一个PWM波,因为,PWM的频率是捕获改变频率的1/2。
中断控制器可以处理多个中断源,其中一些中断源可能是硬件设备(如输入/输出设备或时钟),而另一些可能是软件中断请求(例如系统调用)。
以下是一些可能的中断源列表:
时钟中断:这是处理器的定时器产生的中断,可以用于系统节拍或进程调度。
输入/输出设备中断:这包括键盘、鼠标、网络接口卡、磁盘驱动器和打印机等设备。
硬件故障中断:这包括处理器缓存错误、内存错误和总线错误等硬件错误。
软件中断:这是由程序显式触发的中断请求,例如系统调用。
外部中断:这是由外部设备(如信号线、触发器、传感器等)产生的中断请求。
DMA(直接内存访问)中断:这是在高速数据传输期间由DMA控制器发出的中断请求。
错误检查和纠正中断:这是在内存、总线或其他硬件上检测到错误并进行纠正时发出的中断请求。
需要注意的是,不同的计算机体系结构和中断控制器可能支持不同的中断源。
89C51/52的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套 。
1、(P32)可由IT0(TCON0)选择其为低电平有效还是下降沿有效。当CPU检测到P32引脚上出现有效的中断信号时,中断标志IE0(TCON1)置1,向CPU申请中断。
2、(P33)可由IT1(TCON2)选择其为低电平有效还是下降沿有效。当CPU检测到P33引脚上出现有效的中断信号时,中断标志IE1(TCON3)置1,向CPU申请中断。
3、TF0(TCON5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。
4、TF1(TCON7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。
5、RI(SCON0)或TI(SCON1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。
IE寄存器:
中断允许控制寄存器分为两层结构,第一级结构为中断允许总控制EA,只有当EA处于中断允许状态,中断源中断请求才能够得到允许;当EA处于不允许状态时,无论IE寄存器中其他位处于什么状态,中断源中断请求都不会得到允许。第二级结构为5个中断允许控制位,分别对应5个中断源的中断请求,当对应中断允许控制位为1时,中断源中断请求得到允许。
EX0:外部中断0允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。当EX0=1( SETB EX0 )时,同时单片机P32引脚上出现中断信号时,单片机中断主程序的执行而“飞”往中断服务子程序,执行完后通过中断返回指令RET 动返回主程序。当EX0=0( CLR EX0)时,即使单片机P32引脚上出现中断信程序也不会从主程序“飞” 出去执行,因为此时单片机的CPU相当于被“堵上了耳朵”,根本接收不到P32引脚上的中断信号,但是这并不表示这个信号不存在。如果单片机的CPU有空查一下TCON中的IE0位,若为1就说明有中断信号出现过。
ET0:T0溢出中断允许位。ET0=1,允许T0中断;ET0=0,禁止T0中断。
EX1:外部中断1允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。当EX1=1( SETB EX1)时,并且外部P33引脚上出现中断信号时,单片机CPU会中断主程序而去执行相应的中断服务子程序;当EX1=0( CLR EX1)时使外部P33引脚上即使出现中断信号,单片机的CPU也不能中断主程序转而去行中断服务子程序。 [3] 因此,可以这样认为,EX0和EX1是决定CPU能否感觉到外部引脚P32P33上的中断信号的控制位。
ET1:T1溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。
ES:串行中断允许位。ES=1,允许串行口中断;ES=0,禁止串行口中断。
EA:中断总允许位。EA=1,CPU开放中断;EA=0,CPU禁止所有的中断请求。总允许EA好比一个总开关。EA就相当于每家水管的总闸,如果总闸不开,各个龙头即使开了也不会有水;反过来,如果总闸开了而各个分闸没开也不会有水,所当我们想让P32和P33引脚上的信号能够中断主程序则必须将EA位设置为0(CLR EA)。
TCON寄存器:
各位的标识如下:
TF1:定时器1溢出标志位。当定时器1计满溢出时,由硬件使TF1置1,并且申请中断,进入中断服务程序,有硬件自动清0 ,在查询方式下用软件清0
TR1:定时器运行控制位,TR1置1是开启定时器1,TR1置0时关闭定时器1
TF0:定时器0溢出标志位。当定时器0计满溢出时,由硬件使TF0置1,并且申请中断,进入中断服务程序,有硬件自动清0 ,在查询方式下用软件清0
TR0:定时器运行控制位,TR0置1是开启定时器0,TR0置0时关闭定时器0
IE1:外部中断1请求标志位。
IT1:外部中断1触发方式选择位。当IT1置0时,为低电平触发;当IT1置1时,为下降沿触发。
IE0:外部中断0请求标志位。
IT0:外部中断0触发方式选择位。当IT0置0时,为低电平触发;当IT0置1时,为下降沿触发。
51单片机外部中断响应条件:
1、中断源有中断请求;
2、中断源的中断允许位为1(设置IE寄存器相关位);
3、CPU开中断(设置IE寄存器开中断,即EA=1)
CPU时序的有关知识:
振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)
状态周期:2个振荡周期为1个状态周期,用S表示。
机器周期:1个机器周期含6个状态周期,12个振荡周期。
指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。
定时器的其他知识点:
1、51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。
2、定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。
3、51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。
4、有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。CPU转而处理一些复杂的事情。同时可以实现精确定时作用。
与定时器/计数器有关的寄存器:
1、TMOD寄存器
2、TCON寄存器
3、IE寄存器
4、THx/TL寄存器
工作方式寄存器TMOD:
工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:
M1M0:工作方式设置位。定时/计数器有四种工作方式。一般我们厅方式1和方式2:
控制寄存器TCON:
TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如下:
TF1(TCON7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
TR1(TCON6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。
TF0(TCON5):T0溢出中断请求标志位,其功能与TF1类同。
TR0(TCON4):T0运行控制位,其功能与TR1类同。
IE中断开关寄存器:
用于开启cpu中断和对应的中断位。
THx和TL定时/计数存储寄存器:
THx存储高8位数据,TLx存储低8位数据。
定时器/计算器初值计数公式:
计数个数与计数初值的关系为:X=2^n-N
N是需要计数的值;n与设置定时器/计数器的工作方式有关(可能为8、13、16);X是需要设置在THx和TLx的初值。
使用定时器/计算器的初始化流程:
1、对TMOD赋值,以确定T0和T1的工作方式。
2、计算初值,并将其写入TH0、TL0或TH1、TL1。
3、中断方式选择,则对EA赋值,开放定时器中断。
4、使TR0或TR1置位,启动定时/计数器定时或计数。
ITC_SetSoftwarePriority(ITC_IRQ_TIM2_OVF, ITC_PRIORITYLEVEL_0);//定时器TIM2溢出中断
ITC_SetSoftwarePriority(ITC_IRQ_ADC2, ITC_PRIORITYLEVEL_1);//ADC2中断优先级为1,比TIM2高
你确定有ADC1?ITC_SetSoftwarePriority的中断源中,我没有看到ADC1也。
望采纳~
首先,对于定时器/计数器T0,T1是内部中断源,这是毫无疑问的,也是必须掌握的。其次,写程序也根本就不用判断,不论是内部还是外部中断源,采用中断方式时都必须写中断程序,而中断程序是不用区分内外中断源的。
外部中断0:入口:0003H
定时器0: 入口:000BH
外中断1: 入口:0013H
定时器1: 入口:001BH
串口中断:入口:0023H
11个串口中断,地址:0x98H;外部中断和定时计数器中断:设置地址:0x88H;定时计数器设置地址:TMOD:0x89H,TL0;8AH TL0;8BH TH0;8CH :TH1: 8DH。
扩展资料:
向量中断:对应每一级中断都有一个向量,这些向量顺序存放在主存的指定单元中。向量的内容是:相应的中断服务程序起始地址和处理机状态字(主要是指令地址)。在中断响应时,由中断部件提供中断向量的地址,就可取出该向量。中断响应和处理 *** 作的第⑤步就是取中断向量 *** 作。在采用向量中断的机器中一般不再使用程序状态字。
参考资料来源:百度百科-中断
以上就是关于怎么用STM32配置产生PWM全部的内容,包括:怎么用STM32配置产生PWM、中断控制器处理的中断源有哪些、51单片机中断/定时器/计数器等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)