Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM8S105, компилятор Ride7. Как установить
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > STM8
smk
Вот собственно не могу разобраться как получить доступ к регистрам конфигурации или как их правильно... Нашел пример под IAR, а под Ride7 не получается найти на примера ни описания. Хелп читаю, но пока не вижу явного упоминания. Нужна подсказка. Спасибо.
ChipKiller
Цитата("smk")
...не могу разобраться как получить доступ к регистрам конфигурации..
.. регистры расположены в Flash, так что если есть необходимость записи - Flash нужно разблокировать. Делается это записью последовательности в регистр FLASH_PUKR.
ЗЫ. ... в С вроде есть спец функции для этого
smk
Пытаюсь вот так, но что-то не получается. Читаются все нули.
Код
void Write_Option_Byte (unsigned long Address, unsigned char Data)
    {
        FLASH_DUKR = ((unsigned char)0xAE);        
        FLASH_DUKR = ((unsigned char)0x56);
        FLASH_CR2 |= (1<<7);
        FLASH_NCR2 &= ~(1<<7);    
        while (!(FLASH_IAPSR & (1<<3)));
        Address = Data;
        FLASH_IAPSR = (unsigned char)(~(0x08));
    }


Как это сделать? Спасибо.
ChipKiller
Цитата("smk")
Пытаюсь вот так, но что-то не получается........
FLASH_DUKR - отвечает за разрешение EEPROM, а Вам нужна FLASH (FLASH_PUKR).
Код
FLASH_PUKR = ((unsigned char)0x56);
FLASH_PUKR = ((unsigned char)0xAE);
......
smk
Цитата(ChipKiller @ Dec 28 2011, 19:01) *
FLASH_DUKR - отвечает за разрешение EEPROM, а Вам нужна FLASH (FLASH_PUKR).
Код
FLASH_PUKR = ((unsigned char)0x56);
FLASH_PUKR = ((unsigned char)0xAE);
......

Уверены? На картинке из даташита нарисовано, что область с байтами опций (0х4800...) принадлежит EEPROM. Да и написано в даташите, что установка этих байт не отличается от записи в EEPROM, только нужно записать биты
Код
        FLASH_CR2 |= (1<<7);
        FLASH_NCR2 &= ~(1<<7);


В библиотечном примере есть такая штука
Код
#define FLASH_CR2_OPT   ((u8)0x80) /*!< Select option byte mask */
#define FLASH_NCR2_NOPT   ((u8)0x80) /*!< Select option byte mask */


void FLASH_ProgramOptionByte(u16 Address, u8 Data)
{
    /* Check parameter */
    assert_param(IS_OPTION_BYTE_ADDRESS_OK(Address));

    /* Enable write access to option bytes */
    FLASH->CR2 |= FLASH_CR2_OPT;
    FLASH->NCR2 &= (u8)(~FLASH_NCR2_NOPT);

    /* Program option byte and his complement */
    *((NEAR u8*)Address) = Data;
    *((NEAR u8*)(Address + 1)) = (u8)(~Data);

    FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

    /* Disable write access to option bytes */
    FLASH->CR2 &= (u8)(~FLASH_CR2_OPT);
    FLASH->NCR2 |= FLASH_NCR2_NOPT;
}


Вот эти вот строчки не пон6имаю:
Код
    *((NEAR u8*)Address) = Data;
    *((NEAR u8*)(Address + 1)) = (u8)(~Data);


По идее это указатели на адрес в памяти, но что-то не пойму как его попроще...
ChipKiller
Цитата("smk")
Уверены? На картинке из даташита нарисовано, что область с байтами опций (0х4800...) принадлежит EEPROM.
... "божиться" не буду - глянул в PM0051 стр. 16. sm.gif
Цитата("smk")
В библиотечном примере есть такая штука
.....
.Вот эти вот строчки не пон6имаю:
Код
*((NEAR u8*)Address) = Data;
- запись 8-ми битного значения по 16-ти битному адресу (просто особенности адресации в stm8)
smk
А это можно как-то переписать чтоб понятнее?

Код
*((NEAR u8*)Address) = Data;


NEAR - вот до сути этого так и не докопался. Как его объявить?

STM8S105xx.pdf стр.14

Нажмите для просмотра прикрепленного файла

ChipKiller
Цитата("smk")
А это можно как-то переписать чтоб понятнее?
... использую Cosmic - там используется @tiny, @near, @far, с помощью которых компилятор выбирает, какие использовать команды для доступа @tiny - адрес 8-бит, @near - 16-бит, @far - 24.
Смотри User’s Guide для своего компилятора.
smk
Наконец получилось. Меня сбило с толку определение data, которое я принял за переменную. Привожу рабочие функции записи байта в EEPROM и Option Byte. Может кому и пригодится:
Для STVD и Raisonance.
Код
void Write_Option_Byte (unsigned long Address, unsigned char Data)
    {
        FLASH_DUKR = ((unsigned char)0xAE);        
        FLASH_DUKR = ((unsigned char)0x56);
        while (!(FLASH_IAPSR & (1<<3)));
        FLASH_CR2 = 0x80;
        FLASH_NCR2 = 0x7F;            
    *((data unsigned char*)Address) = Data;
    *((data unsigned char*)(Address + 1)) = (unsigned char)(~Data);
        FLASH_CR2 = 0x7F;
        FLASH_NCR2 = 0x80;
        FLASH_IAPSR = (unsigned char)(~(0x08));
    }


Код
void Write_EEPROM_Byte (unsigned long Address, unsigned char Data)
    {
        FLASH_DUKR = ((unsigned char)0xAE);        
        FLASH_DUKR = ((unsigned char)0x56);
        while (!(FLASH_IAPSR & (1<<3)));
        *((data unsigned char*) Address) = Data;
        FLASH_IAPSR = (unsigned char)(~(0x08));
    }
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.