佚名通过本文主要向大家介绍了stm32控制pwm波输出,stm32输出pwm波,stm32如何输出pwm波,stm32产生pwm波,stm32 pwm波等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
    
  
                问题: stm32中输出独立的PWM波和外部中断会干扰?
描述:
/> void RCC_Configuration(void);
void GPIO_Configuration(void); 
void TIM3_Configuration(void);
void NVIC_Configuration(void);
void EXTI_Configuration(void); 
void USART_Configuration(void);
int fputc(int ch,FILE *f) 
{ 
	USART_SendData(USART1,(u8)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); 
	return ch; 
}
int main(void)
/> { 
   RCC_Configuration();	 
   GPIO_Configuration();
EXTI_Configuration();
NVIC_Configuration();
TIM3_Configuration(); 
   USART_Configuration();
    
	 TIM_SetCompare2(TIM3,360);
while(1)
{ 
	}
   
}
 
void RCC_Configuration(void)
{
SystemInit();
/> RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); 
} 
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;//PWM输出 
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; 
	GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //外部中断
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
/> GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX,PA.9 
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX,PA.10
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
 
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;//2¢DDêy?Y?úPC.All
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void TIM3_Configuration(void)
{ 
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; 
	TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseStruct.TIM_Period=799;//3??μ 
	TIM_TimeBaseStruct.TIM_Prescaler=99; 
	TIM_TimeBaseStruct.TIM_ClockDivision=0; 
	TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;//?òé?
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStruct); 
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OC2Init(TIM3,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_Cmd(TIM3,ENABLE);
/> }
 
void EXTI_Configuration(void)
{ 
	EXTI_InitTypeDef EXTI_InitStructure;
 
	EXTI_ClearITPendingBit(EXTI_Line5); 
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5); 
EXTI_InitStructure.EXTI_Line=EXTI_Line5; 
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; 
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; 
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void NVIC_Configuration(void) 
{
NVIC_InitTypeDef NVIC_InitStructure;
 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; 
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure); 
}
void USART_Configuration(void) 
{ 
    USART_InitTypeDef USART_InitStructure; 
	USART_InitStructure.USART_BaudRate=9600;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No; 
	USART_InitStructure.USART_HardwareFlowC />
	USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
 
	USART_Init(USART1,&USART_InitStructure); 
	USART_Cmd(USART1,ENABLE); 
	USART_ClearFlag(USART1,USART_FLAG_TC);
 
}
外部中断的中断服务程序
void EXTI9_5_IRQHandler(void)
{ 
	u16 ReadValue=0;
/> if(EXTI_GetITStatus(EXTI_Line5)==SET) 
  { 
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)==Bit_RESET)	 
		{ 
		ReadValue =GPIO_ReadInputData(GPIOB); 
		printf("%d\r\n",ReadValue); 
}
EXTI_ClearITPendingBit(EXTI_Line5); 
	  delay_ms(10); 
  }	 
} 
问题是PWM波无法输出,去掉外部中断程序后才可以输出,但是这两个应该是独立的,现在有了干扰,不知道应该如何改。EXTI9_5这个通道我改为EXTI3,依然不能出波形。外部中断是由一个方波输入的,通过GPIOA_5产生下降沿时进中断程序
解决方案1:
                    
 
   
 
 
 
描述:
stm32PWM 中断
#include "pbdata.h"/> void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void EXTI_Configuration(void);
int fputc(int ch,FILE *f)
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
int main(void)
/> {
EXTI_Configuration();
NVIC_Configuration();
TIM3_Configuration();
while(1)
{
}
{
SystemInit();
/> RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;//PWM输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //外部中断
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
/> GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX,PA.9
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX,PA.10
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void TIM3_Configuration(void)
{
TIM_TimeBaseStruct.TIM_Period=799;//3??μ
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStruct);
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OC2Init(TIM3,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_Cmd(TIM3,ENABLE);
/> }
{
EXTI_InitStructure.EXTI_Line=EXTI_Line5;
EXTI_Init(&EXTI_InitStructure);
}
void NVIC_Configuration(void)
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_Init(&NVIC_InitStructure);
void USART_Configuration(void)
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
外部中断的中断服务程序
void EXTI9_5_IRQHandler(void)
{
/> if(EXTI_GetITStatus(EXTI_Line5)==SET)
}
EXTI_ClearITPendingBit(EXTI_Line5);
解决方案1:
中断中禁止延时,和长时间的程序运行,中断函数只是用来处理一些简单的程序,可以改变标志位之类的简单函数。禁止延时,禁止延时,禁止延时
解决方案2:            void EXTI9_5_IRQHandler(void)里面delay_ms(10);去掉
中断里面严禁加延时
重要的事情说三遍
        

