微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?