1 votos

problema con el código del temporizador

Escribí un código simple para parpadear un LED conectado a PA3 en la placa STM32F4 Discovery cada 1sec usando timer4. No he declarado ninguno de los pines swd de la placa para gpio, sin embargo obtengo el siguiente error" Target not connected" ¿Por qué es así? ¿Hay alguna línea en el código que cause este problema?

#include "stm32f4xx_hal.h"
#include "stm32f4xx.h"
#include "stm32f407xx.h"
#include "stdint.h"
#include "string.h"
#include "stm32f4xx_hal_rcc.h"

//NVIC_EnableIRQ(UART4_IRQn); // Enable IRQ for UART4 in NVIC 
    void Timer_init()
    {
        RCC->APB1ENR|=(1UL<<2); //TIM4 connected to APB1, hence enable clk though this register
        RCC->AHB1ENR |= 1;  //clock to GPIOA
        TIM4->PSC=42000;// 42MHZ/42000=1KHZ, 1millisec between two ticks
        TIM4->ARR=1000;//count will increment for every one sec
        //TIM4->DIER|=0X0001;//update interupt enable;
        TIM4->CR1=0X0000;//UPCOUNTER;
        GPIOA->MODER=0X00000040;
        GPIOA->OSPEEDR=0X00000040;
        TIM4->CR1|=0x0001;// enable counter
    }

//#########################Clock Configuration#################
void SystemClock_Config(void) {
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  /* Enable Power Control clock */
  __HAL_RCC_PWR_CLK_ENABLE();

  /* The voltage scaling allows optimizing the power consumption when the
     device is clocked below the maximum system frequency (see datasheet). */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /* Enable HSE Oscillator and activate PLL with HSE as source */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 25;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
     clocks dividers */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 |
                                RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
}
//########################################################

    int main (void)
        {
      SystemClock_Config();
            Timer_init();
            while(1)
            {
                if(TIM4->SR&0x0001)// CHECK UIF FLAG
                {
                    TIM4->SR&=!(0X0001);//CLEAR UIF FLAG
                    GPIOA->ODR^=(1<<3); //TOGGLE PIN A3
   /* while(!(TIM4->SR&0X0001));
            if((GPIOA->ODR)&(1<<3))
            GPIOA->BSRR=((1<<3)+16);
            else
                GPIOA->BSRR=(1<<3);*/

                }
            }

    }

0voto

berendi Puntos 316

No he declarado ninguno de los pines swd de la placa para gpio

Sí, en esta línea:

GPIOA->MODER=0X00000040;

SWD utiliza los pines PA13 y PA14. Estos pines se inicializan en modo de función alternativa al reiniciar el dispositivo, para permitir que el depurador los utilice. Según el Manual de Referencia, GPIOA->MODER se establece en 0xA8000000 en reset, funciones alternas para PA13, PA14 y PA15 (PA15 no se usa con SWD, pero sí con depuración JTAG)

La línea anterior establece todos los pines GPIOA excepto PA3 como entrada. Haz algún enmascaramiento para preservar los bits de modo de puerto:

GPIOA->MODER = (GPIOA->MODER & ~0xC0) | 0x40;

0voto

Alan Williams Puntos 11

Su cálculo para el registro de recarga automática del temporizador para 1 sec está mal. El valor correcto es aprox para prescalar es 641D y 0x281H y el valor Arr será 0xFFFF . Hice los cálculos para el temporizador de 16 bits.

Método de cálculo:

AS APB1 tiene 42Mhz reloj. La cuenta del temporizador aumentará en cada 1/42Mhz sec approx 23.8 nS . Para 1sec or 1000000000 nS Valor de recuento debe ser 1000000000/23.8 approx 42016806 counts . Como temporizador de 16 bits tiene valor máximo a 65535 entonces Valor preescalar 42016806 / 65535 approx to 641 in decimal y Arr value will be 65535 .

-1voto

Ethane Das Puntos 19

En el menú, seleccione

opción para el objetivo → depuración (elija la opción de depuración) → configuración → comunicación con el objetivo (SWD/JTAG).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X