Register Seviyesinde Erişim Hakkında

Başlatan MrDarK, 11 Haziran 2015, 09:32:00

MrDarK

Merhaba arkadaşlar ;

Bugün emblocks ile çok enteresan bi hata ile sizlerle birlikteyim. Kullandığım mcu STM32L152VB. RTC donanımının bazı registerlarına erişirken sorun olmuyor fakat CR registerına erişmek istediğimde böyle bir hata üretti. Fakat kütüphane fonksiyonlarından CR registerına ulaşımları var. Neden kütüphane fonksiyonu erişebiliyorken ben erişemiyorum acaba bu registere.

Hata aldığım kod parçası

/***********************************************************
* Function Name  : SetStore_Operation
* Description    :
* Input          : None
* Return         : None
***********************************************************/
void SetStore_Operation(uint32_t Status)
{

    /* Disable the write protection for RTC registers */
    RTC->WPR = 0xCA;
    RTC->WPR = 0x53;

    RTC->CR = 0x00040000;

    /* Enable the write protection for RTC registers */
    RTC->WPR = 0xFF;


Hata Kodu ;
error: expected identifier before '(' token

RTC->CR registerını yoruma aldığımda hata ortadan kalkıyor. WPR registerlarına erişimde sıkıntı çıkartmamasına rağmen neden CR'ye hata veriyor anlayamadım.
Picproje Eğitim Gönüllüleri ~ MrDarK

z

Kütüphane de ne yapıldıysa sen de öyle erişmiyormusun?

Registere erişmek için önce kilidi açmış. Sen yapmıyormusun bu işlemi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

MrDarK

Hocam zaten bu örnek kod benim main dosyam içindeki örnek kod.

RTC->CR dediğimde tanımsızmış gibi uyarı variyor demek istiyorum. RTC->CR = 0x00040000; bu komuta hata veriyor. Fakat kütüphane dosyaları her türlü CR registerına ulaşabiliyor. Bana hata verip derlememesine anlam veremedim.
Picproje Eğitim Gönüllüleri ~ MrDarK

z

RTC CR farklı şekilde tanımlanmıştır. Kütüphane içindeki kodları da yazsana buraya. Açık kütüphane değilmi?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

MrDarK

Açık hocam standart peripheral library kodları

Bu örnek standart Lib'den
/**
  * @brief  Adds or substract one hour from the current time.
  * @param  RTC_DayLightSaveOperation: the value of hour adjustment.
  *   This parameter can be one of the following values:
  *     @arg RTC_DayLightSaving_SUB1H: Substract one hour (winter time).
  *     @arg RTC_DayLightSaving_ADD1H: Add one hour (summer time).
  * @param  RTC_StoreOperation: Specifies the value to be written in the BCK bit
  *                            in CR register to store the operation.
  *   This parameter can be one of the following values:
  *            @arg RTC_StoreOperation_Reset: BCK Bit Reset.
  *            @arg RTC_StoreOperation_Set: BCK Bit Set.
  * @retval None
  */
void RTC_DayLightSavingConfig(uint32_t RTC_DayLightSaving, uint32_t RTC_StoreOperation)
{
  /* Check the parameters */
  assert_param(IS_RTC_DAYLIGHT_SAVING(RTC_DayLightSaving));
  assert_param(IS_RTC_STORE_OPERATION(RTC_StoreOperation));

  /* Disable the write protection for RTC registers */
  RTC->WPR = 0xCA;
  RTC->WPR = 0x53;

  /* Clear the bits to be configured */
  RTC->CR &= (uint32_t)~(RTC_CR_BCK);

  /* Configure the RTC_CR register */
  RTC->CR |= (uint32_t)(RTC_DayLightSaving | RTC_StoreOperation);

  /* Enable the write protection for RTC registers */
  RTC->WPR = 0xFF;
}


Buda benimkisi
/***********************************************************
* Function Name  : SetStore_Operation
* Description    :
* Input          : None
* Return         : None
***********************************************************/
void SetStore_Operation(uint32_t Status)
{

    /* Disable the write protection for RTC registers */
    RTC->WPR = 0xCA;
    RTC->WPR = 0x53;

    RTC->CR |= RTC_StoreOperation_Set;

    /* Enable the write protection for RTC registers */
    RTC->WPR = 0xFF;
}


Benimkinde RTC->CR |= RTC_StoreOperation_Set; şu şekilde bir atamaya hata veriyor. Hatanın sebebi RTC_StoreOperation_Set bilgisinden kaynaklanmıyor. Herhangi sabit bir data da denedim yapmıyor. Bu kodu standart lib içine koyucam çözemezsem fakat çok saçma birşey nerede hata yapıyorum acaba.
Picproje Eğitim Gönüllüleri ~ MrDarK

z

RTC->CR = (uint32_t) (Sabit);

Bu şekilde dene.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

MrDarK

Alıntı yapılan: z - 11 Haziran 2015, 10:05:25
RTC->CR = (uint32_t) (Sabit);

Bu şekilde dene.

Herhangi bir değişim yok hata aynı. Kütüphane kodu içine ekledim yazdığım o ek yeri. Derlendi ve çalışıyor. Bu ve bunun gibi bir ihtiyacım olduğunda nasıl yapacağım ben bu işi. Biraz daha derinlemesine insek mi hocam. Her problem yaşadığımda kütüphaneye kod eklemek saçma olur. Ayrıca MCU değiştirdiğimde kütüphaneleri unutma olasılığımda yüksek.
Picproje Eğitim Gönüllüleri ~ MrDarK

z

Üstüne git bu sorunun.

  RTC->CR |= (uint32_t)(RTC_DayLightSaving | RTC_StoreOperation);
Üsttekinde sorun olmuyor alttakinde sorun oluyorsa

  RTC->CR |= RTC_StoreOperation_Set;

Aşağıdaki yazıma da kızmaması lazım.

  RTC->CR |= (uint32_t)(RTC_StoreOperation_Set);

Eğer kızmıyorsa RTC_StoreOperation_Set nasıl tanımlanmış ona da bir bakmak lazım.

Hala kızıyorsa anlam veremedim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

MrDarK

Hocam zaten kızdığı şey RTC_StoreOperation_Set yazmak değil dediğim gibi ;

RTC->CR registerına main kodum içinden herhangi bir şekilde işlem yapmama kızıyor. Emblocks forumlarına da yazayım belki bi cevap gelir.
Picproje Eğitim Gönüllüleri ~ MrDarK

yldzelektronik

İlk mesajında verdiğin hata kodu sanki syntax hatası yapmışsın gibi gözüküyor?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

z

Kütüphane dosyasının başında bir şeyler include edilmişmi peki?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

MrDarK

Alıntı yapılan: yldzelektronik - 11 Haziran 2015, 10:24:20
İlk mesajında verdiğin hata kodu sanki syntax hatası yapmışsın gibi gözüküyor?
Evet ilk mesajımda buraya yapıştırırken sorun olmuş, ikincisinde böyle düşünebileceğiniz için düzelttim.

Alıntı yapılan: z - 11 Haziran 2015, 10:25:09
Kütüphane dosyasının başında bir şeyler include edilmişmi peki?

Hocam onuda düşündüm, eklediği dosyaları kendi main dosyama da ekledim. Oda işe yaramadı. Zaten beni sinir eden WPR registerına her türlü eriştiriyorken CR registerına takması. Bu arada kütüphanedeki include dosyaları.

/* Includes ------------------------------------------------------------------*/
#include "stm32l1xx_rtc.h"
#include "stm32l1xx_rcc.h"

/** @addtogroup STM32L1xx_StdPeriph_Driver
  * @{
  */

/** @defgroup RTC
  * @brief RTC driver modules
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/

/* Masks Definition */
#define RTC_TR_RESERVED_MASK    ((uint32_t)0x007F7F7F)
#define RTC_DR_RESERVED_MASK    ((uint32_t)0x00FFFF3F)
#define RTC_INIT_MASK           ((uint32_t)0xFFFFFFFF)
#define RTC_RSF_MASK            ((uint32_t)0xFFFFFF5F)
#define RTC_FLAGS_MASK          ((uint32_t)(RTC_FLAG_TSOVF | RTC_FLAG_TSF | RTC_FLAG_WUTF | \
                                            RTC_FLAG_ALRBF | RTC_FLAG_ALRAF | RTC_FLAG_INITF | \
                                            RTC_FLAG_RSF | RTC_FLAG_INITS | RTC_FLAG_WUTWF | \
                                            RTC_FLAG_ALRBWF | RTC_FLAG_ALRAWF | RTC_FLAG_TAMP1F | \
                                            RTC_FLAG_TAMP2F | RTC_FLAG_TAMP3F | RTC_FLAG_RECALPF | \
                                            RTC_FLAG_SHPF))

#define INITMODE_TIMEOUT         ((uint32_t) 0x00002000)
#define SYNCHRO_TIMEOUT          ((uint32_t) 0x00008000)
#define RECALPF_TIMEOUT          ((uint32_t) 0x00001000)
#define SHPF_TIMEOUT             ((uint32_t) 0x00002000)


Kendi koduma ekleyip çalışmadığını gördüğüm için kaldırmayı tercih ettim.
Picproje Eğitim Gönüllüleri ~ MrDarK

yldzelektronik

Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

MrDarK

Picproje Eğitim Gönüllüleri ~ MrDarK

CLR

Bu problem erişememe problemi değil ki, editörde oluşan bir hatadan dolayı compile hatası.

Ayrıca erişilmeyecek registeri kullansan bile compiler onu hatasız derler ama işlemci ulaşamaz.

Muhtemelen

RTC->CR = 0x00040000;

bu satır içinde bir yerde editörün gördüğü ama senin göremediğin bir karakter vardır. Normal C'de program yazarkende karşılaşılabilir(registerlerle alakası yok), genelde o program parçacığını bir yerden koplaya yapıştır yaparken oluşur.

Veya heycanla program yazarken keyboard üzerinde saçma bir tuş basma kombinasyonu oluşursa böyle karakterler oluşabiliyor.
 
Çözümü ise, komple o satırı silip yeniden elle yazmak veya boşukları silip tekrar boşluk vermekle  çözülebilir. Komple satırı silersen aynı kodu bir yerden kopyala /yapıştır yaparsan yine çözülmeyebilir. 
Knowledge and Experience are Power