佚名通过本文主要向大家介绍了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);去掉
中断里面严禁加延时
重要的事情说三遍