|
STM3210X_LD_VL, табличная инициализация периферии |
|
|
|
Jan 26 2013, 11:15
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Привет. Озадачился сабжем на мелкие армы. От простого к сложному, сделал такую штуку.
batch_conf.zip ( 1.52 килобайт )
Кол-во скачиваний: 71Обновляю здесь, пока есть возможность редактировать.пример использования CODE #include "batch_conf.h" batch_BEGIN(main_tbl) batch_OR(&(RCC->CR),RCC_CR_HSEON) batch_WAIT(&(RCC->CR), RCC_CR_HSERDY) batch_WRITE(&(RCC->CFGR),RCC_CFGR_PLLMULL_0 |RCC_CFGR_PLLSRC) batch_OR(&(RCC->CR), RCC_CR_PLLON) batch_WAIT(&(RCC->CR), RCC_CR_PLLRDY) batch_OR(&(RCC->CFGR),2) batch_END;
batch_conf(main_tbl, NULL);
Создается таблица во флеше. Элемент - структура {uint32_t port, data;} Названия полей многоцелевые, поэтому чисто условные, можно unionom разделить для ясности В тетраду бит 24-27 поля port встроена команда Конфигуратор выполняет эти команды Функция заняла 316 байт в кейле. фрагмент, соответствующий примеру CODE RCC->CR |= RCC_CR_HSEON; while(!(RCC->CR & RCC_CR_HSERDY)); RCC->CFGR = RCC_CFGR_PLLMULL_0 |RCC_CFGR_PLLSRC ; RCC->CR |= RCC_CR_PLLON; while(!(RCC->CR & RCC_CR_PLLRDY)); RCC->CFGR |= 2; Разницы на коротких кусках практически нет. Т.е. смысл только в тотальном использовании такого метода с исключением вычислений этапа выполнения. Утоптать конфигуратор, конечно, можно. А также к байт-коду перейти.
Сообщение отредактировал _Pasha - Jan 26 2013, 16:27
|
|
|
|
|
 |
Ответов
|
Jan 26 2013, 12:51
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(_Pasha @ Jan 26 2013, 15:15)  Создается таблица во флеше. 1. Насколько я понимаю, сразу после того, как адреса периферии будут помещены в таблицу, они перестанут быть volatile. С потенциально возможными приколами и последствиями. 2. А как потом сопровождать эту помойку? 3. И главное. Как писать драйвера, с учетом этого "веяния"? Т.е. вместо DEV_X_DRV.h, где вызывается инициализация, например, пинов, все поубивать? А как быть, если пин расшарен и требует в разные моменты разной инициализации/конфигурации? "Не экономь память. Память, это г*вно. Производительность!" (с) Один умный человек, еще лет 10-12 назад сказал мне. P.S. А если попадётся вот такой, тяжелый случай, когда производитель свинью подложил, вместо SPI, снова менять концепцию инициализации периферии? CODE //////////////////////////////////////////////////////////////////////////////// // TRF7960_X_drv.h ////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// #ifndef TRF7960_X_DRV_H #define TRF7960_X_DRV_H
//////////////////////////////////////////////////////////////////////////////// #include <bsp.h>
//////////////////////////////////////////////////////////////////////////////// typedef BSP_U08 TRF796x_U08; typedef BSP_U16 TRF796x_U16; typedef BSP_U32 TRF796x_U32; typedef BSP_BOOL TRF796x_BOOL; typedef BSP_U08 TRF796x_DATA;
//////////////////////////////////////////////////////////////////////////////// #define TRF796x_X_Init() BspTrf796x_Init() #define TRF796x_X_Enable() BspTrf796x_Enable() #define TRF796x_X_Disable() BspTrf796x_Disable() #define TRF796x_X_IrqEnable() BspTrf796x_InterruptEnable() #define TRF796x_X_IrqDisable() BspTrf796x_InterruptDisable() #define TRF796x_X_TimerConfig( U08 ) BspTrf796x_TimerConfig( U08 ) #define TRF796x_X_TimerStart() BspTrf796x_TimerStart() #define TRF796x_X_TimerStop() BspTrf796x_TimerStop() #define TRF796x_X_Delay_mSec( U32 ) BspDelay_mSec( U32 )
#define TRF796x_DUMMY 0x00
//////////////////////////////////////////////////////////////////////////////// #pragma inline void TRF796x_X_Command( const TRF796x_U08 Command ) { // SLOA155 - TRF7960A Firmware Design Hints // 7.7 SPI With SS Pin Only – Single-Byte Direct Commands // Description // All single byte direct commands need an additional CLK cycle to work. // Workaround // All direct command functions need to have an additional DATA_CLK cycle // before Slave Select l line goes high.
BspSpiOpen(); BspSpiXfer08_Mode00( Command ); BspSpiXfer08_Mode00( TRF796x_DUMMY ); BspSpiClose(); }
//////////////////////////////////////////////////////////////////////////////// #pragma inline TRF796x_U08 TRF796x_X_Read( const TRF796x_U08 Addr ) { TRF796x_U08 Data;
//////////////////////////////////////////////////////////////////////////// BspSpiOpen(); BspSpiXfer08_Mode00( Addr ); Data = BspSpiXfer08_Mode01( TRF796x_DUMMY ); BspSpiClose();
return( Data ); }
//////////////////////////////////////////////////////////////////////////////// #pragma inline void TRF796x_X_ReadBurst( const TRF796x_U08 Addr, TRF796x_U08 * pData, TRF796x_U08 Count ) { BspSpiOpen(); BspSpiXfer08_Mode00( Addr ); while( Count-- ) { *pData++ = BspSpiXfer08_Mode01( TRF796x_DUMMY ); } BspSpiClose(); }
//////////////////////////////////////////////////////////////////////////////// #pragma inline void TRF796x_X_Write( const TRF796x_U08 Addr, const TRF796x_U08 Data ) { //////////////////////////////////////////////////////////////////////////// BspSpiOpen(); BspSpiXfer08_Mode00( Addr ); BspSpiXfer08_Mode00( Data ); BspSpiClose(); }
//////////////////////////////////////////////////////////////////////////////// #pragma inline void TRF796x_X_WriteBurst( const TRF796x_U08 Addr, TRF796x_U08 * pData, TRF796x_U08 Count ) { // SLOA155 - TRF7960A Firmware Design Hints // 7.2 SPI With SS Pin Only – Direct Commands // Description // Serial interface with SS pin only, the direct commands are not executed // if they are the last operation in the SPI communication. In the SPI interface // with SS pin the Stop condition clock pulse is missing (compared to // the parallel interface and SPI without SS pin). Some operations are relying // on this clock and they do not work as expected. // Workaround // If a direct command is the last operation in the SPI communication, // the SS pin goes high. Afterward, an additional clock pulse has to be sent.
BspSpiOpen(); BspSpiXfer08_Mode00( Addr ); while( Count-- ) { BspSpiXfer08_Mode00( *pData++ ); } BspSpiClose(); BspSpiXfer08_Mode00( TRF796x_DUMMY ); }
#endif //TRF7960_X_DRV_H
В данном случае, проблема вот в этом: Цитата 7.1 SPI With SS Pin Only – No High Impedance
Description Serial interface with SS pin only, the interface does not go to high impedance when SS is high. It is not possible to multiplex the serial port interface lines.
Workaround An external three-state buffer must be used if the chip is connected to a serial bus and the interface lines are multiplexed. И что будем делать? Сэкономим пару байт на инициализации и повесим снаружи железо, как они "советуют"?
|
|
|
|
|
Jan 26 2013, 13:32
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Tahoe @ Jan 26 2013, 16:51)  1. Насколько я понимаю, сразу после того, как адреса периферии будут помещены в таблицу, они перестанут быть volatile. С потенциально возможными приколами и последствиями. Спасибо. Дельное замечание. Поправлю. Цитата ... И что будем делать? Сэкономим пару байт на инициализации Вы в ответ на частное решение начали сыпать частностями, но из другой области  Да у Вас в самый худенький F100 не больше двух вменяемых драйверов влезет  а еще и что-то делать нужно. Более того, еще со времен ассемблера всегда старался таблично железо настраивать. Да и какая сложность, обернете batch_conf() с местно заданной табличкой в xxxx_Init() ? Единственный критерий - либо память либо скорость, хоть что-то должно быть на высоте. В общем, сущность уже есть, кривая она или не очень - каждый решает сам.
Сообщение отредактировал _Pasha - Jan 26 2013, 13:33
|
|
|
|
Сообщений в этой теме
_Pasha STM3210X_LD_VL Jan 26 2013, 11:15 scifi Цитата(Tahoe @ Jan 26 2013, 16:51) ... Jan 26 2013, 17:27 HHIMERA Цитата(_Pasha @ Jan 26 2013, 15:15) От пр... Jan 26 2013, 13:03 ReAl Подобным образом (парами адрес-данные в собираемой... Jan 26 2013, 14:01 _Pasha Цитата(ReAl @ Jan 26 2013, 18:01) (чего н... Jan 26 2013, 14:12  ReAl Цитата(_Pasha @ Jan 26 2013, 16:12) А ест... Jan 26 2013, 14:20   _Pasha Цитата(ReAl @ Jan 26 2013, 18:20) Зато им... Jan 26 2013, 14:45    AHTOXA Цитата(_Pasha @ Jan 26 2013, 20:45) За чт... Jan 26 2013, 14:53     _Pasha Цитата(AHTOXA @ Jan 26 2013, 17:53) То ес... Jan 26 2013, 16:11 Golikov A. Народ а можно в 2 словах в чем бизнес то? За что б... Jan 26 2013, 14:13 _Pasha Цитата(Golikov A. @ Jan 26 2013, 18:13) Н... Jan 26 2013, 14:17 Golikov A. что то я видать отстал от технологий...
я вообще ... Jan 26 2013, 14:35 Golikov A. не я правда что-то не втыкаю
почему
batch_OR(... Jan 26 2013, 14:58 _Pasha Цитата(AHTOXA @ Jan 26 2013, 18:53) +1:)
... Jan 26 2013, 15:26 Golikov A. чет я все равно не понимаю...
это для систем в к... Jan 26 2013, 15:32 kolobok0 Цитата(Golikov A. @ Jan 26 2013, 19:32) .... Jan 26 2013, 17:12  Golikov A. Цитата(kolobok0 @ Jan 26 2013, 21:12) про... Jan 26 2013, 18:25   AHTOXA Цитата(Golikov A. @ Jan 27 2013, 00:25) Т... Jan 26 2013, 18:52    HHIMERA Цитата(AHTOXA @ Jan 26 2013, 21:52) Плюс ... Jan 26 2013, 19:07    Golikov A. Цитата(AHTOXA @ Jan 26 2013, 22:52) Автор... Jan 26 2013, 19:26     AHTOXA Цитата(Golikov A. @ Jan 27 2013, 01:26) Т... Jan 26 2013, 19:39      Golikov A. Цитата(AHTOXA @ Jan 26 2013, 23:39) На ST... Jan 26 2013, 20:14       ReAl Цитата(Golikov A. @ Jan 26 2013, 22:14) а... Jan 26 2013, 20:37        Golikov A. Цитата(ReAl @ Jan 27 2013, 00:37) А у CM0... Jan 26 2013, 20:41        AHTOXA Цитата(ReAl @ Jan 27 2013, 02:37) И ещё к... Jan 26 2013, 20:43        _Pasha Цитата(ReAl @ Jan 27 2013, 00:37) Надо ум... Jan 26 2013, 20:45   _Pasha Цитата(Golikov A. @ Jan 26 2013, 22:25) Т... Jan 26 2013, 20:16 AHTOXA Цитата(Golikov A. @ Jan 27 2013, 02:14) а... Jan 26 2013, 20:23 _Pasha Цитата(AHTOXA @ Jan 27 2013, 00:23) Ну во... Jan 26 2013, 20:41 Golikov A. кажется начинаю понимать...
а сколько операций ух... Jan 26 2013, 20:38 Golikov A. Хоть плачь...
стандартный вариант
в регистр запи... Jan 26 2013, 20:55 AHTOXA Цитата(Golikov A. @ Jan 27 2013, 02:55) ч... Jan 26 2013, 20:58 Golikov A. код команды грузить же все равно надо?
данные груз... Jan 26 2013, 21:04 _Pasha Цитата(Golikov A. @ Jan 27 2013, 00:04) к... Jan 26 2013, 21:12 Golikov A. Можете расписать что происходит при записи допусти... Jan 26 2013, 21:15 _Pasha Цитата(Golikov A. @ Jan 27 2013, 00:15) М... Jan 26 2013, 21:18 Golikov A. ну да естественно как виртуальная машина обрабатыв... Jan 26 2013, 21:23 _Pasha Выбрали запись.
Декодировали команду >>24 ... Jan 26 2013, 21:35 Golikov A. ну все я понял в чем маза.
это короче разница та... Jan 26 2013, 21:44 _Pasha Цитата(Golikov A. @ Jan 27 2013, 01:44) С... Jan 26 2013, 21:59 Golikov A. Один раз вспоминается был проект где надо было сил... Jan 26 2013, 22:08 _Pasha Цитата(Golikov A. @ Jan 27 2013, 02:08) Ф... Jan 26 2013, 22:57 Golikov A. если упростить архиватор, и скармливать ему линейн... Jan 26 2013, 23:42 _Pasha Цитата(Golikov A. @ Jan 27 2013, 03:42) е... Jan 27 2013, 00:50  HHIMERA Цитата(_Pasha @ Jan 27 2013, 04:50) В раб... Jan 27 2013, 09:10 AlexandrY Цитата(_Pasha @ Jan 26 2013, 13:15) От пр... Jan 27 2013, 09:46 _Pasha Цитата(HHIMERA @ Jan 27 2013, 13:10) Лучш... Jan 27 2013, 09:55 khach Обычно в одном куске кода работаем с одной перифер... Jan 27 2013, 10:05
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|