stm32f103c8 uart interrupts sorunu

Başlatan 10f200.h, 21 Haziran 2019, 00:19:27

10f200.h

arkadaşlar merhaba.
stm32f103c8 denetleyicisiyle uart üzerinden kesme ile veri almaya çalışıyorum.Deneme yapmak amacıyla yazdığım kod da rx üzerinden herhangi bir veri gelirse PC13 deki ledi yakmayı amaçladım ama sonuç vermedi.Kodlar şu şekilde :
#include "main.h"
uint8_t rx_buff[1];
UART_HandleTypeDef huart1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);

void USART1_IRQHandler(void)
{

  HAL_UART_IRQHandler(&huart1);

}
int main(void)
{

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_USART1_UART_Init();
  HAL_UART_Receive_IT(&huart1,rx_buff,1);

  while (1)
  {

if(rx_buff[0]>=1)
{
	HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
	rx_buff[0]=0;
}

  }

}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /**Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /**Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_USART1_UART_Init(void)
{


  huart1.Instance = USART1;
  huart1.Init.BaudRate = 9600;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }


}

static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}

void Error_Handler(void)
{

}
yardımlarınızı beklerim.iyi çalışmalar.

tekosis

#1
HAL_UART_Receive_IT(&huart1,rx_buff,1);
         __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
main içinde uart kesmesini aktifleştirin.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

10f200.h

hocam cevabınız için teşekkür ederim.
dediğiniz gibi denedim ama yine olmadı.sonsuz döngüdeki kodda hata olabilir mi?   

Tagli

Bence kesmeleri ve veri alımını boşver, önce bir veri göndermeyi dene bakalım bilgisayar tarafında sorunsuz görebilecek misin. Eğer göndermede de sorun varsa, hatayı yanlış yerde arıyorsun demektir.
Gökçe Tağlıoğlu

10f200.h

evet hocam veri gönderemeyi denedim ve oluyor.hatanın usart1 modülünde olduğunu düşünüp usart2 ile deneme yaptım bu seferde ilk veri gönderişimde led yanarken diğer göndermelerimde değişiklik olmuyor.kesme bayrağını sıfırlamadığım aklıma geldi.bazı sitelerde kesme bayrağının hal kütüphanesi tarafından sıfırlandığını yazmışlar.ben yine de bayrağı sıfırladım ama değişiklik olmadı.

tekosis

cumemx kullanıyorsun sanırım. kodunda static void MX_NVIC_Init(void) fonksiyonu olması lazımdı, göremiyorum. benim kodumdaki kısmı ekleyim;
  HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(USART1_IRQn);
bunu while'dan öncesine ekler misin? Aşağıdaki gibi videoları da dikkatlice, sabırla takip edersen işleyişi baya öğrenirsin.

İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

10f200.h

çok sağolun hocam video çok yardımcı oldu.videodaki gibi cubemx de yeniden proje oluşturunca düzeldi.
teşekkürler iyi çalışmalar.

tekosis

#7
Rica ederim. Çalışmayan kodunuzla çalışan kodunuz arasında ne gibi bir farklılık var incelediniz mi hata nerede? İncelerseniz iyi olur.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

10f200.h

#8
hocam sizin koda eklememi söylediğiniz kısım cubemx tarafından üretilmiyordu.videoda gösterildiği şekilde yapınca o kısımda eklendi.ayrıca ilginç bir şekilde kesme fonksiyonu içinde
HAL_UART_IRQHandler(&huart2); yazan kısmın üst tarafına
HAL_UART_RECEIVE_IT(&huart2,data,1); yazdığımda programın istediğim gibi çalışmadığını gördüm.Bunun programın düzgün çalışmasında doğrudan ilgisi var mı bilmiyorum ama alt tarafa yazınca düzgün bir şekilde çalıştı.

volkanunal

Alıntı yapılan: 10f200.h - 24 Haziran 2019, 14:38:04hocam sizin koda eklememi söylediğiniz kısım cubemx tarafından üretilmiyordu.videoda gösterildiği şekilde yapınca o kısımda eklendi.ayrıca ilginç bir şekilde kesme fonksiyonu içinde
HAL_UART_IRQHandler(&huart2); yazan kısmın üst tarafına
HAL_UART_RECEIVE_IT(&huart2,data,1); yazdığımda programın istediğim gibi çalışmadığını gördüm.Bunun programın düzgün çalışmasında doğrudan ilgisi var mı bilmiyorum ama alt tarafa yazınca düzgün bir şekilde çalıştı.


Kodun hiyararşisinden dolayı olduğunu düşünüyorum. Öncelikle IRQhandler de ilgili register kurulumları USART2 kanalı için aktif edilmeden , data alımı için gerekli interrupt fonksiyonu çalışmayacaktır.
Primum nil nocere