ADC 中断不适用于产生 PWM 的 TIMER3 中断

问题描述

我一直在尝试在 STM32F411re 上使用 IAR 工作台编写一些代码,以了解有关 Cortex 的更多信息。我尝试实现 TIMER3 PWM 模式(中心对齐),每调用一次 TIMER 2(半秒,第二秒与执行 LED 闪烁无关)并且 ADC 在一个通道上执行连续的常规转换。我已经尝试使用中断来实现这一切。 TIMER3 中断将在上溢和下溢时产生,并且在 ISR 内,我将使用 ADC 的值更改 PWM 宽度(随电位计更改)。

我在创建项目时遇到的问题似乎是,当 TIMER3 被激活时,程序既没有在 while(1) 循环内的任何程序行中击中断点(不进入)ADC ISR 例程。当我评论 TIMER 3 时,程序通常会通过 ADC ISR。

#include "stdio.h"
void Uart6Configuration(void);
void send_data (uint8_t c);
void init_PWM(void);
void init_ADC(void) ;
void init_Interupts(void);
unsigned long vrednost_ADC=0;
float temp=0;
unsigned long counter=0;
int main()
{
 
 RCC->APB1ENR|=(1<<0); //TIMER 2
 RCC->AHB1ENR|=(1<<0); //GPIOA    
 RCC->AHB1ENR|=(1<<2); //GPIOC
 GPIOA->MODER|=(1<<10); 
 RCC->APB2ENR|=(1<<5);    // USART6[PC6,PC7]
 
 /* Define TIMER-a 3 */
 RCC->APB1ENR|=(1<<1); //TIMER 3
 GPIOB->MODER|=(1<<9);
 GPIOB->AFR[0]|=(1<<17);
  
 TIM2->PSC=89;
 TIM2->ARR=0xFFFF;

 TIM2->DIER|= (1<<0); 
 TIM2->EGR|= (1<<0);

  Uart6Configuration();
  init_PWM();   
  init_ADC();    
  init_Interupts();
  TIM2->CR1|=(1<<0);
  TIM3->CR1|=(1<<0);
  while(!(TIM2->SR & (1<<0)));
  ADC1->CR2|=(1<<30); // START ADC

/*GLAVNA PROGRAMSKA PETLJA*/
  
 while(1)
 {
      counter++;
  if(counter>100000)
  {
    printf("AD konverzija=%f \n\r",temp); //Terminal I/O 
    counter=0;
  }    
 }
 
/* ************************/   
 
 return 0;
}
void TIM2_IRQHandler(void )
{


 if(TIM2->SR & TIM_SR_UIF)
  {
   TIM2->SR &= ~TIM_SR_UIF; 
   GPIOA->ODR^=(1<<5);
   }
  TIM2->SR =0;
}
void Uart6Configuration (void) 
{
  
  
  GPIOC->MODER |= (2<<12);  //  --> Alternate Function for Pin PA11
  GPIOC->MODER |= (2<<14);  // --> Alternate Function for Pin PA12
  GPIOC->OSPEEDR|=(3<<12)|(3<<14);
  GPIOC->AFR[0] |= (8<<24);  //AF7 bitovi 8,9,10,11 PC6
  GPIOC->AFR[0] |= (8<<28);   //AF7 bitovi 15,14,13,12 PC7
  USART6->CR1=0;
  USART6->CR1|=(1<<13);
  USART6->CR1 &= ~(1<<12); 
  USART6->BRR=(3<<0)|(104<<4);  
  USART6->CR1|=(1<<2);
  USART6->CR1|=(1<<3);
}
void send_data (uint8_t c)
{
        
        while(!(USART6->SR & (1<<6)));
        USART6->DR=c;
              
}
uint8_t UART6_GetChar (void)
{
   /*********** STEPS FOLLOWED *************   
   1. Wait for the RXNE bit to set. It indicates that the data has been received and can be read.
   2. Read the data from USART_DR  Register. This also clears the RXNE bit 
   ****************************************/
   uint8_t temp;   
   while (!(USART2->SR & (1<<5)));  // wait for RXNE bit to set
   temp = USART2->DR;  // Read the data. This clears the RXNE also
   return temp;
}
void init_PWM(void)
{
 /*PB_4*/
   TIM3->PSC=15;
   TIM3->ARR=750;
   TIM3->CR1|= (1<<5)|(1<<6) | (1<<2); // PWM CENTAR EDGE MODE
   TIM3->CCER|=(1<<0); //Capture/Compare 1 output enable.
   TIM3->CCR1=500;   //DUTY CYCLE
   TIM3->CCMR1|=(1<<5)|(1<<6);  // PWM MODE bit 5 i6
   TIM3->DIER|=(1<<0);

}
void init_ADC(void) 
{
   RCC->APB2ENR|=(1<<8);  // Clock za adc 
   GPIOA->MODER|=(1<<2)|(1<<3);  // Analog mode PA.1
   ADC1->SQR3|=(1<<0);  // Choose channel ADC1/1
   ADC1->CR1|=(1<<5); //EOCIE interupt generates when ADC finish conversion
   ADC1->CR2|=(1<<1)|(1<<0); // Continious mode,ADC ON
}
void ADC_IRQHandler(void)
{
 
    vrednost_ADC=ADC1->DR;
    temp=(float)((vrednost_ADC/4095.0)*3.3) ;
     
}
void TIM3_IRQHandler(void )
{   

 if((TIM3->CNT & 10)<=0) // DETECTOVATI  UNDERFLOW
 {
    TIM3->CCR1=(vrednost_ADC/4095)*1000;
    TIM3->EGR|=(1<<0);
 }
}
void init_Interupts(void)
{
NVIC_SetPriority (ADC_IRQn,(13));
NVIC_SetPriority (TIM2_IRQn,14); 
NVIC_SetPriority (TIM3_IRQn,15); 
NVIC_EnableIRQ(TIM2_IRQn);
NVIC_EnableIRQ(TIM3_IRQn);  
NVIC_EnableIRQ(ADC_IRQn );
}```

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...