реклама на сайте
подробности

 
 
> STM8S105, компилятор Ride7. Как установить, бит AFR7 в регистре OPT2
smk
сообщение Dec 28 2011, 09:45
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Вот собственно не могу разобраться как получить доступ к регистрам конфигурации или как их правильно... Нашел пример под IAR, а под Ride7 не получается найти на примера ни описания. Хелп читаю, но пока не вижу явного упоминания. Нужна подсказка. Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
ChipKiller
сообщение Dec 28 2011, 11:45
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 26-12-11
Пользователь №: 69 097



Цитата("smk")
...не могу разобраться как получить доступ к регистрам конфигурации..
.. регистры расположены в Flash, так что если есть необходимость записи - Flash нужно разблокировать. Делается это записью последовательности в регистр FLASH_PUKR.
ЗЫ. ... в С вроде есть спец функции для этого
Go to the top of the page
 
+Quote Post
smk
сообщение Dec 28 2011, 16:11
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Пытаюсь вот так, но что-то не получается. Читаются все нули.
Код
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));
    }


Как это сделать? Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
ChipKiller
сообщение Dec 28 2011, 17:01
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 26-12-11
Пользователь №: 69 097



Цитата("smk")
Пытаюсь вот так, но что-то не получается........
FLASH_DUKR - отвечает за разрешение EEPROM, а Вам нужна FLASH (FLASH_PUKR).
Код
FLASH_PUKR = ((unsigned char)0x56);
FLASH_PUKR = ((unsigned char)0xAE);
......
Go to the top of the page
 
+Quote Post
smk
сообщение Dec 28 2011, 17:34
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(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);


По идее это указатели на адрес в памяти, но что-то не пойму как его попроще...


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
ChipKiller
сообщение Dec 28 2011, 18:46
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 26-12-11
Пользователь №: 69 097



Цитата("smk")
Уверены? На картинке из даташита нарисовано, что область с байтами опций (0х4800...) принадлежит EEPROM.
... "божиться" не буду - глянул в PM0051 стр. 16. sm.gif
Цитата("smk")
В библиотечном примере есть такая штука
.....
.Вот эти вот строчки не пон6имаю:
Код
*((NEAR u8*)Address) = Data;
- запись 8-ми битного значения по 16-ти битному адресу (просто особенности адресации в stm8)
Go to the top of the page
 
+Quote Post
smk
сообщение Dec 29 2011, 05:48
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



А это можно как-то переписать чтоб понятнее?

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


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

STM8S105xx.pdf стр.14

Прикрепленное изображение




--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
ChipKiller
сообщение Dec 29 2011, 07:39
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 26-12-11
Пользователь №: 69 097



Цитата("smk")
А это можно как-то переписать чтоб понятнее?
... использую Cosmic - там используется @tiny, @near, @far, с помощью которых компилятор выбирает, какие использовать команды для доступа @tiny - адрес 8-бит, @near - 16-бит, @far - 24.
Смотри User’s Guide для своего компилятора.
Go to the top of the page
 
+Quote Post
smk
сообщение Dec 29 2011, 08:18
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Наконец получилось. Меня сбило с толку определение 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));
    }


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th August 2025 - 17:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01418 секунд с 7
ELECTRONIX ©2004-2016