STM32F407 TIMER,PWM,DMA,GPIO

Başlatan alizone, 05 Aralık 2017, 16:52:01

alizone

Arkadaşlar Merhaba,

Bir proje için bir süredir uğraşıyorum ancak tıkandım kaldım. Nerde yanlış yapıyorum veya neyi eksik düşünüyorum artık göremiyorum. Yanıt verirseniz sevinirim.
Öncelikle yapmaya çalıştığım timer ve pwm output generation ile ürettiğim iki sinyal var ve ben bu sinyalleri dma yoluyla gpio ya aktarmak istiyorum. Ancak çıkışı bir türlü göremiyorum.

//----------------------------------------- TIM4 init function---------------------------------//
TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC1;
TIM_OC_InitTypeDef sConfigOC2;

uint8_t tim_period;
uint8_t timer_reset_pulse_period;
static void MX_TIM4_Init(void)
{
	__HAL_RCC_TIM4_CLK_ENABLE();
	
	tim_period =  SystemCoreClock / 800000; // 0,125us period (10 times lower the 1,25us period to have fixed math below)
	timer_reset_pulse_period = (SystemCoreClock / (320 * 60)); // 60us just to be sure

	uint32_t cc1 = (10 * tim_period) / 36;
	uint32_t cc2 = (10 * tim_period) / 15;
	
  htim4.Instance = TIM4;
	
  htim4.Init.Prescaler = 0;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = tim_period;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
	htim4.Init.RepetitionCounter =0;
	HAL_TIM_PWM_Init(&htim4);
	
	//----------- TIM4 interrupt Init---------------------/
  HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(TIM4_IRQn);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sConfigOC1.OCMode = TIM_OCMODE_PWM1;
  sConfigOC1.Pulse = cc1;
  sConfigOC1.OCPolarity = TIM_OCPOLARITY_HIGH;
	sConfigOC1.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC1.OCFastMode = TIM_OCFAST_DISABLE;
	HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC1, TIM_CHANNEL_1);
 
	sConfigOC2.OCMode = TIM_OCMODE_PWM1;
  sConfigOC2.Pulse = cc2;
  sConfigOC2.OCPolarity   = TIM_OCPOLARITY_HIGH;
  sConfigOC2.OCFastMode   = TIM_OCFAST_DISABLE;
	sConfigOC2.OCNPolarity  = TIM_OCNPOLARITY_HIGH;
	sConfigOC2.OCIdleState  = TIM_OCIDLESTATE_RESET;
	sConfigOC2.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC2, TIM_CHANNEL_2);
  
  HAL_TIM_Base_Start(&htim4);
	HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2);
	__HAL_TIM_DISABLE(&htim4);
}


static void MX_DMA_Init(void) 
{
  /* DMA controller clock enable */
  __HAL_RCC_DMA1_CLK_ENABLE();
	
	HAL_TIM_PWM_MspInit(&htim4);
  /* DMA interrupt init */
  /* DMA1_Stream0_IRQn interrupt configuration */
 // HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
  //HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
  /* DMA1_Stream3_IRQn interrupt configuration */
  //HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 0, 0);
  //HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn);
  /* DMA1_Stream6_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);

}

//----------------------------------DMA INIT-----------------------------------------//
uint16_t ws2812bDmaBitBuffer[24 * 2];
uint32_t WS2812_IO_Low[] = {GPIO_PIN_12<< 16};
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
{

  if(htim_pwm->Instance==TIM4)
  {
  /* USER CODE BEGIN TIM4_MspInit 0 */

  /* USER CODE END TIM4_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_TIM4_CLK_ENABLE();
  
    /* TIM4 DMA Init */
    /* TIM4_UP Init */
    hdma_tim4_up.Instance = DMA1_Stream6;
    hdma_tim4_up.Init.Channel = DMA_CHANNEL_2;
    hdma_tim4_up.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_tim4_up.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_tim4_up.Init.MemInc = DMA_MINC_DISABLE;
    hdma_tim4_up.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    hdma_tim4_up.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    hdma_tim4_up.Init.Mode = DMA_CIRCULAR;
    hdma_tim4_up.Init.Priority = DMA_PRIORITY_VERY_HIGH;
    hdma_tim4_up.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
		hdma_tim4_up.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
		hdma_tim4_up.Init.MemBurst = DMA_MBURST_SINGLE;
		hdma_tim4_up.Init.PeriphBurst = DMA_PBURST_SINGLE;
    
		HAL_DMA_DeInit(&hdma_tim4_up);
		HAL_DMA_Init(&hdma_tim4_up);
		
		HAL_DMA_Start(&hdma_tim4_up, (uint32_t)GPIO_PIN_12, (uint32_t)(&GPIOD->BSRR), 48);
    //__HAL_LINKDMA(htim_pwm,hdma[TIM_DMA_ID_UPDATE],hdma_tim4_up);

    /* TIM4_CH1 Init */
    hdma_tim4_ch1.Instance = DMA1_Stream0;
    hdma_tim4_ch1.Init.Channel = DMA_CHANNEL_2;
    hdma_tim4_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_tim4_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_tim4_ch1.Init.MemInc = DMA_MINC_ENABLE;
    hdma_tim4_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_tim4_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_tim4_ch1.Init.Mode = DMA_CIRCULAR;
    hdma_tim4_ch1.Init.Priority = DMA_PRIORITY_VERY_HIGH;
    hdma_tim4_ch1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
		hdma_tim4_ch1.Init.PeriphBurst = DMA_PBURST_SINGLE;
    hdma_tim4_ch1.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
		hdma_tim4_ch1.Init.MemBurst = DMA_MBURST_SINGLE;
		
		HAL_DMA_DeInit(&hdma_tim4_ch1);
		HAL_DMA_Init(&hdma_tim4_ch1);
		HAL_DMA_Start(&hdma_tim4_ch1, (uint32_t)ws2812bDmaBitBuffer, (uint32_t)(&GPIOD->BSRR), 48);
   
		//__HAL_LINKDMA(htim_pwm,hdma[TIM_DMA_ID_CC1],hdma_tim4_ch1);

    /* TIM4_CH2 Init */
    hdma_tim4_ch2.Instance = DMA1_Stream3;
    hdma_tim4_ch2.Init.Channel = DMA_CHANNEL_2;
    hdma_tim4_ch2.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_tim4_ch2.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_tim4_ch2.Init.MemInc = DMA_MINC_DISABLE;
    hdma_tim4_ch2.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    hdma_tim4_ch2.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    hdma_tim4_ch2.Init.Mode = DMA_CIRCULAR;
    hdma_tim4_ch2.Init.Priority = DMA_PRIORITY_VERY_HIGH;
		
    hdma_tim4_ch2.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
		hdma_tim4_ch2.Init.PeriphBurst = DMA_PBURST_SINGLE;
    hdma_tim4_ch2.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
		hdma_tim4_ch2.Init.MemBurst = DMA_MBURST_SINGLE;
    
		HAL_DMA_DeInit(&hdma_tim4_ch2);
		HAL_DMA_Init(&hdma_tim4_ch2);
    HAL_DMA_Start_IT(&hdma_tim4_ch2, (uint32_t)WS2812_IO_Low,(uint32_t)&GPIOD->BSRR, 48);
    //__HAL_LINKDMA(htim_pwm,hdma[TIM_DMA_ID_CC2],hdma_tim4_ch2);
    __HAL_DMA_ENABLE_IT(&hdma_tim4_ch2,DMA_IT_TC);
 }

static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  // GPIO Ports Clock Enable //
  __HAL_RCC_GPIOD_CLK_ENABLE();
	

	
  GPIO_InitStruct.Pin = GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  
	
	GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15 ;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);	
	
}

#include "main.h"
#include "stm32f4xx_hal.h"

TIM_HandleTypeDef htim4;
DMA_HandleTypeDef hdma_tim4_up;
DMA_HandleTypeDef hdma_tim4_ch1;
DMA_HandleTypeDef hdma_tim4_ch2;


void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_TIM4_Init(void);


void ws2812_init()
{
	HAL_Init();
  SystemClock_Config();
	
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_TIM4_Init();
}


int main(void)
{
	ws2812_init();

	 while (1)
  {
		
  }
}