27.09.2014, 22:35
|
|
Временная регистрация
Регистрация: 12.03.2005
Адрес: Москва
Сообщений: 61
Сказал спасибо: 42
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от STM32F0
|
...линкер требует функции с данными названиями.
|
Обыскался я эти функции. Спасибо.
Не понятно только, где они у него прописаны, что он их требует. И на кой чёрт именно они ему нужны?
Последний раз редактировалось sergeyye; 27.09.2014 в 23:14.
|
|
|
|
27.09.2014, 23:07
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: IAR Embedded Workbench
Это чисто ИАРовский черезжоп. Они вместе с STM славно постарались над обструкцией STM8. Одни не дописали по-человечески хедер (что допиливается ручками), другие надругались в остальном.
Но не переживайте, вариантов то не особо и ИАР даже не самый худший из них.
Тут уже было по EEPROM в STM8, можно же и без атрибута __eeprom.
|
|
|
|
30.09.2014, 00:27
|
|
Временная регистрация
Регистрация: 12.03.2005
Адрес: Москва
Сообщений: 61
Сказал спасибо: 42
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: IAR Embedded Workbench
Безуспешные попытки записать байт в ЕЕ на STM8S_Discovery продолжаются. IAR уже не ругается, но продолжает гадить из-под тишка, зараза. Процесс записи зацикливается на строке *EE_Num = Data, ради которой всё это и затевалось. Три дня на месте. Может, что не так пишу?
Выручайте, братцы!
PHP код:
|
u8 __eeprom *EE_Num; // Указатель на ячейку ЕЕ.
#pragma location = 0x4000 // Адрес ячейки в EEPROM.
__no_init u8 __eeprom EE_Number; // Имя ячейки.
void __eeprom_program_byte (u8 Data)
{
FLASH -› DUKR = 0xAE; // Запись первой половины ключа.
FLASH -› DUKR = 0x56; // Запись второй половины ключа.
while (FLASH -› IAPSR & FLASH_IAPSR_DUL ==0); // Ждём разрешения на запись.
*EE_Num = Data; // Запись данных в ЕЕ.
FLASH -› IAPSR &= 0xF7; // Запретить запись в EE.
}
|
|
|
|
|
30.09.2014, 06:08
|
|
Частый гость
Регистрация: 10.10.2006
Адрес: Новосибирск
Сообщений: 30
Сказал спасибо: 41
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: IAR Embedded Workbench
Тоже мучился в свое время, люди помогли.
подключить к проекту:
1. STM8S_StdPeriph_Driver\src\stm8s_flash.c
2. eeprom_facit_my.c
содержимое eeprom_facit_my.c :
Код:
|
//eeprom_facit_my.c
#pragma language=extended
// возвращает статус результата операции с ЕЕПРОМ
int __eeprom_wait_for_last_operation(void)
{
FLASH_Status_TypeDef status = FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
return !!(status & ( FLASH_STATUS_SUCCESSFUL_OPERATION
| FLASH_STATUS_END_HIGH_VOLTAGE));
}
// запись 1 байта в ЕЕПРОМ по адресному указателю dst
void __eeprom_program_byte(unsigned char __near * dst, unsigned char v)
{
FLASH_ProgramByte((u32)dst, (u8)v); //запись байта v
}
// запись 4-х байтового в ЕЕПРОМ по адресному указателю dst
void __eeprom_program_long(unsigned char __near * dst, unsigned long v)
{
FLASH_ProgramWord((u32)dst, (u32)v); //запись 4-х байтового v
}
// |
после этого работает инициализация ЕЕПРОМ и запись еепром:
Код:
|
__eeprom CONFIG_PKU config;
FLASH_Unlock(FLASH_MEMTYPE_DATA); // разблокировка ЕЕПРОМ для записи
config.status[CHAN_SO]=work_status[CHAN_SO]=ST_NORM; //
config.status[CHAN_SIRENA]=work_status[CHAN_SIRENA]=ST_NORM; //
config.status[CHAN_INVAL]=work_status[CHAN_INVAL]=ST_NORM; //
FLASH_Lock(FLASH_MEMTYPE_DATA); // заблокировать ЕЕПРОМ |
|
|
|
|
30.09.2014, 06:37
|
|
Временная регистрация
Регистрация: 06.06.2007
Сообщений: 55
Сказал спасибо: 2
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: IAR Embedded Workbench
Код:
|
while (FLASH -› IAPSR & FLASH_IAPSR_DUL == 0); |
Как минимум это условие не верно. Приоритет операции "равенства", выше чем "логическое И".
|
|
|
Сказали "Спасибо" Bear-ku
|
|
|
30.09.2014, 06:49
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от Bear-ku
|
while (FLASH -› IAPSR & FLASH_IAPSR_DUL == 0);
|
В таких случаях я обычно пишу так:
Код:
|
while (!(FLASH-›IAPSR & FLASH_IAPSR_DUL)); |
|
|
|
|
30.09.2014, 23:47
|
|
Временная регистрация
Регистрация: 12.03.2005
Адрес: Москва
Сообщений: 61
Сказал спасибо: 42
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: IAR Embedded Workbench
Большое спасибо всем откликнувшимся. Look22, сегодня всё свободное время было убито на попытки осмыслить написанное Вами. Увы, похвастаться нечем. Мало, что понял. Нехватка познаний в Си. Учить некому.
Короче, сделал так:
PHP код:
|
__near u8 __eeprom *EE_Num; // Указатель на ячейку ЕЕ с системным номером.
#pragma location = 0x4000 // Aдрес в EEPROM.
__no_init u8 __eeprom EE_Number; // Присваиваемый порядковый номер в системе.
/********************* Запись байта в EEPROM по адресу 0x4000 ******************/
void __eeprom_program_byte (u8 Data)
{
FLASH -› DUKR = 0xAE; // Запись первой половины ключа.
FLASH -› DUKR = 0x56; // Запись второй половины ключа.
while (!(FLASH -› IAPSR & FLASH_IAPSR_DUL)); // Ждём разрешения на запись.
*(__near u8*) EE_Num = Data; // Запись данных в ЕЕ.
FLASH -› IAPSR &= 0xF7; // Запретить запись в EE.
}
void __eeprom_program_long(void) // Не используется.
{}
void __eeprom_wait_for_last_operation(void) // Не используется.
{}
|
Запустил. Работает.
Имя этой функции должно быть именно таким - иначе ругается IAR. По той-же причине нужны и две последние пустые функции.
Последний раз редактировалось sergeyye; 16.10.2014 в 21:42.
|
|
|
|
01.10.2014, 05:46
|
|
Частый гость
Регистрация: 10.10.2006
Адрес: Новосибирск
Сообщений: 30
Сказал спасибо: 41
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от sergeyye
|
Что означает содержимое скобок?
|
__near указывает размер указателя равный 2 байтам
|
|
|
|
08.11.2014, 04:25
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: IAR Embedded Workbench
Комрады, кто сам писал функцию преобразования числа в строку? Интересует именно float to string. Я, конечно, написал, но коряво вышло. Работать-то работает, но удовлетворения от красоты кода не ощущаю.
|
|
|
|
08.11.2014, 18:59
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: IAR Embedded Workbench
Вот пример из гугля, мною доработанный т.к. отрицательные числа не выводил и числа около нуля тоже. Теперь работает с двумя костылями.
Код:
|
int intToStr(int x, char str[], int d)
{
int i = 0;
while (x)
{
str[i++] = (x%10) + '0';
x = x/10;
}
while (i ‹ d)
str[i++] = '0';
reverse(str, i);
str[i] = '\0';
return i;
}
// Converts a floating point number to string.
void ftoa(float n, char *res, int afterpoint)
{
char m = 0;
int ipart;
float fpart;
int i;
if (n ‹ 0)
{
n = -n;
m = 1;
res[0] = '-';
}
if ((char)n == 0)
{
res[1] = '0';
m++;
}
ipart = (int)n;
fpart = n - (float)ipart;
i = intToStr(ipart, res + m, 0);
if (afterpoint != 0)
{
res[i+m] = '.'; // add dot
fpart = fpart * pow(10, afterpoint);
intToStr((int)fpart, res + i + 1 + m, afterpoint);
}
}
void reverse(char *str, int len)
{
int i=0, j=len-1, temp;
while (i‹j)
{
temp = str[i];
str[i] = str[j];
str[j] = temp;
i++; j--;
}
} |
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Подниму тему WinAVR vs IAR
|
oleg110592 |
Микроконтроллеры, АЦП, память и т.д |
5 |
24.10.2015 14:06 |
Часовой пояс GMT +4, время: 08:16.
|
|