21.01.2013, 12:03
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от wellcom
|
будем ждать
|
Изделия все мелкосерийные (до нескольких тысяч), изменеия частые, соответственно сложился определённый стиль. Это позволяет быстро вносить изменения, поддерживать единую версию проги, для разных версий п/п, быстро перейти на другой проц. Своё мнение не навязываю, просто описываю к чему я пришёл. Понятно что вариантов решения великое множество.
1. Создаю файл в проекте local.h. Где описываю аппаратуру. Примерно так:
Код:
|
// Порт PA0. PWR_GOOD
#define PWR_GOOD 0
#define PWR_GOOD_PORT GPIOA
// Порт PA1. ETH_REF_CLK
#define ETH_REF_CLK 1
#define ETH_REF_CLK_PORT GPIOA
// Порт PA2. ETH_MDIO
#define ETH_MDIO 2
#define ETH_MDIO_PORT GPIOA
// Порт PA3. LCD_LIGHT
#define LCD_LIGHT 3
#define LCD_LIGHT_PORT GPIOA
// Порт PA4. AT45DB_CS
#define AT45DB_CS 4
#define AT45DB_CS_PORT GPIOA
// Порт PA5. SPI1_CLK
#define SPI1_CLK 5
#define SPI1_CLK_PORT GPIOA
....
// Инициализация порта A
#define PORTA_INIT GPIOA-›MODER = PIN2X(PWR_GOOD,AN)|PIN2X(ETH_REF_CLK,AF)|PIN2X(ETH _MDIO,AF)|PIN2X(LCD_LIGHT,AF)|PIN2X(AT45DB_CS,OUT) |PIN2X(SPI1_CLK,AF)|\
PIN2X(SPI1_MISO,AF)|PIN2X(ETH_CRS_DV,AF)|PIN2X(USA RT1_TX,AF)|PIN2X(USART1_RX,AF)|PIN2X(USART1_CTS,AF )|PIN2X(USART1_RTS,AF)\
|PIN2X(JTAG_JTMS_SWDIO,AF)|PIN2X(JTAG_JTCK_SWCLK,A F)|PIN2X(JTAG_JTDI,AF);\
GPIOA-›OSPEEDR = PIN2X(ETH_REF_CLK,S100MHZ)|PIN2X(ETH_MDIO,S100MHZ) |PIN2X(LCD_LIGHT,S2MHZ)|PIN2X(AT45DB_CS,S100MHZ)|P IN2X(SPI1_CLK,S50MHZ)|\
PIN2X(SPI1_MISO,S50MHZ)|PIN2X(ETH_CRS_DV,S100MHZ)| PIN2X(USART1_TX,S2MHZ)|PIN2X(USART1_RX,S2MHZ)|PIN2 X(USART1_CTS,S2MHZ)|PIN2X(USART1_RTS,S2MHZ);\
GPIOA-›PUPDR = PIN2X(PWR_GOOD,PUP_NOPULL)|PIN2X(ETH_REF_CLK,PUP_U P)|PIN2X(ETH_MDIO,PUP_UP)|PIN2X(LCD_LIGHT,PUP_UP)| PIN2X(AT45DB_CS,PUP_UP)|PIN2X(SPI1_CLK,PUP_UP)|\
PIN2X(SPI1_MISO,PUP_UP)|PIN2X(ETH_CRS_DV,PUP_UP)|P IN2X(USART1_TX,PUP_UP)|PIN2X(USART1_RX,PUP_UP)|PIN 2X(USART1_CTS,PUP_UP)|PIN2X(USART1_RTS,PUP_UP)\
|PIN2X(JTAG_JTMS_SWDIO,PUP_UP)|PIN2X(JTAG_JTCK_SWC LK,PUP_DOWN)|PIN2X(JTAG_JTDI,PUP_UP);\
GPIOA-›ODR = PIN(AT45DB_CS);\
GPIOA-›AFR[0] = PIN4X(ETH_REF_CLK,ETHAF)|PIN4X(ETH_MDIO,ETHAF)|PIN 4X(LCD_LIGHT,TIM2AF)|PIN4X(SPI1_CLK,SPI1AF)|\
PIN4X(SPI1_MISO,SPI1AF)|PIN4X(ETH_CRS_DV,ETHAF);\
GPIOA-›AFR[1] = PIN4X(USART1_TX-8,USART1AF)|PIN4X(USART1_RX-8,USART1AF)|PIN4X(USART1_CTS-8,USART1AF)|PIN4X(USART1_RTS-8,USART1AF)
......
// Работа с ADC битами портов
#define ADC_CS_ON ADC_CS_PORT-›BSRRH = PIN(ADC_CS); DelayTacts(TIM_SMALLWAIT,NANOSEC(130)) // Подать выборку АЦП
#define ADC_CS_OFF ADC_CS_PORT-›BSRRL = PIN(ADC_CS) // Снять выборку АЦП
#define ADC_CHAN(N) ADC_PORT-›BSRRL = ((N&0x3)‹‹ADC_A0);ADC_PORT-›BSRRH = (((~N)&0x3)‹‹ADC_A0)
#define ADC_CSI0 ADC_PORT-›BSRRH = PIN(ADC_E2)|PIN(ADC_E3);ADC_PORT-›BSRRL = PIN(ADC_E1)
#define ADC_CSI1 ADC_PORT-›BSRRH = PIN(ADC_E1)|PIN(ADC_E3);ADC_PORT-›BSRRL = PIN(ADC_E2)
#define ADC_CSR ADC_PORT-›BSRRH = PIN(ADC_E1)|PIN(ADC_E2);ADC_PORT-›BSRRL = PIN(ADC_E3)
// Работа с ножкой готовности АЦП
#define ADCPIN_DOUT GPIOC-›MODER = PIN2X(SPI3_MISO,AF)|MODER_C
#define ADCPIN_RDY GPIOC-›MODER = PIN2X(SPI3_MISO,IN)|MODER_C
// Настройка прерывания по готовности (свалу импульса)
#define ADCPIN_RDY_INTEN EXTI-›IMR |= PIN(SPI3_MISO)
#define ADCPIN_RDY_INTDIS EXTI-›IMR &= ~PIN(SPI3_MISO)
#define ADCPIN_RDY_INIT EXTI-›FTSR |= PIN(SPI3_MISO); SYSCFG-›EXTICR[2] = PORTC_PIN‹‹12
#define ADCPIN_RDY_INTCLR EXTI-›PR = PIN(SPI3_MISO) |
По этому файлу фактически можно восстановить суть схемы принципиальной, и понять общее подключение.... Если имеется несколько модификаций платы я ввожу версию и делаю условные ветки, где описываю отличия.
Особо хочу отметить, что не использую макросы типа PINSET, а стараюсь использовать макросы несущие смысловую нагрузку. Например LEDON. Это даёт возможность например поменять полярность ТОЛЬКО в файле local.h, не затрагивая программу.
===
По сути видно что установка / сброс линии порта есть лишь одна команда. И вызывать для этого функцию, как это сделано в стандартной библиотеке, совершенно избыточно. Примерно также работают и другие узлы и блоки.
2. Пишу драйвер аппаратуры проца. Например spi.
3. Пишу драйвер оборудования на основе, драйвера 2. Например драйвер AD7192 и at45db.
Драйвер аппаратуры пишу таким образом чтобы работал софтовый один в один.
При таком подходе софтовый драйвер как правило переносится с проца на проц практически без изменений. Сразу после объявления пинов в local.h. То есть вы можете подключить софтовые драйвера в свой новый проект в новый камень и начать работать. (Драйвера оборудования тем более переносятся). А потом заменить софтовые драйвера на аппаратные.
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
21.01.2013, 12:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Мда .... В этой каше разбираться без стакана ...
Обычно определяется не какой сигнал сидит на ноге, а на какую ногу посадить сигнал. Пэтому, берешь устройство и пишешь на него привязку к ногам. При этом мне совсем до фонаря, что на другие ноги этого же порта посадит мой коллега в инициализации своего устройства.
Если Вы одиночка, то можно делать что угодно и как угодно, но в команду, боюсь, Вас с такими подходами могут и не взять.
|
|
|
|
21.01.2013, 14:10
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от Boba_spb
|
Мда .... В этой каше разбираться без стакана ...
|
Это потому, что не Ваша каша... А на самом деле в ней и не надо разбираться. Если инициализация, то там это пишется - используется один раз.
На самом деле Ваш подход я тоже приветствую. И использую. От проекта зависит. В текущем проекте я делаю заголовочники для задач. Потому как планирую перезапускать задачи при висе. Естественно можно это привязывать и к периферии. Но можно и так как я, один файл на устройство и просто у каждого в проекте данный файл лежит. Какие вопросы?
Как я уже говорил, я не навязываю. Просто работа практически с любым устр-вом процессора значительно меньше, чем на самом деле в раздутой библиотеке... И преимуществ я не вижу.
Ну например ШИМ подсветки:
Инициализация:
Код:
|
// Инициализация таймера ШИМ подсветки
TIM_PWM_LIGHT-›CR1 = TIM_CR1_CEN /*| TIM_CR1_ARPE*/; // Включить таймер
TIM_PWM_LIGHT-›CCMR2 = /*TIM_CCMR2_OC4CE |*/ TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1;// PWM1
TIM_PWM_LIGHT-›CCER = TIM_CCER_CC4E; // Включить канал CH4
TIM_PWM_LIGHT-›PSC = FPWM_PSC-1; // Прескалер
TIM_PWM_LIGHT-›ARR = FPWM_MAX-1; // Частота ШИМ 200 Гц |
Управление:
Код:
|
TIM_PWM_LIGHT-›CCR4 = teklight; |
|
|
|
|
21.01.2013, 15:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от SasaVitebsk
|
На самом деле Ваш подход я тоже приветствую.
|
Это не мой подход - это правило -"При изменении "своих бит" в переменных, а тем более в регистрах НИКОГДА НЕ ЗАТРАГИВАТЬ биты, которые к тебе не относятся.
Хорошо если устройство подключено и инициализируется в начале программы, а если на лету ?
Если Вы не видите преимуществ, то это не значит что их нет.
|
|
|
|
21.01.2013, 16:38
|
|
Прописка
Регистрация: 20.02.2006
Сообщений: 284
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Разбираюсь с EXTI, что такое прерывание (interrupt) понятно. А вот что такое событие (event) и для чего оно нужно и чем отличается от прерывания понять не могу, может кто знает. И кстати, куда ведет стрелка? (выделено красным)
Figure 20 из RM0008.
|
|
|
|
21.01.2013, 16:42
|
|
Прописка
Регистрация: 29.06.2010
Сообщений: 104
Сказал спасибо: 14
Сказали Спасибо 9 раз(а) в 7 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
|
|
|
|
22.01.2013, 10:26
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от Boba_spb
|
Если Вы не видите преимуществ, то это не значит что их нет.
|
А если Вы не видете недостатков в своём подходе, то это тоже не значит, что их нет.
Собирается команда. Она пишет на каком уровне? Или у вас она пишет на уровне периферии?. Обычно используется логический уровень. То есть уровень задач. Одна задача может использовать и, как правило использует несколько драйверов. Таким образом, на уровне железа разные разработчики используют одни драйвера. Пример - работа с архивами spi/dataflash.. Второй - измерительная - spi/АЦП... Тот же dataflash используется всеми для сохранения ошибок... И если каждый будет городить огород, то плохо заканчивается.
Поэтому дрова пишет один. Остальные подключают дрова и работают в прикладном уровне.
Последний проект пишу один. Такое тоже бывает. Практически весь проект написал в QT. Всё эмулировал. Сейчас допиливаю в железе. Вообще планирую перенести практически всё в QT. Очень мне понравилось в плане отладки.... Можно наработать драйвера и 90% нового проекта отлаживать на большом брате. Как обычно времени не хватает ... Попробую в след проекте ...
|
|
|
|
22.01.2013, 11:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
К примеру.
Вы думаете, что один и тот же человек пишет программу для измерения по 16 изолированным ADC, перед которыми стоят коммутаторы, для измерения "джентельменского набора" (токи, напряжения, потенциометры, термопары, термосопротивления) с контролем обрыва линий и прочей диагностики, и программу обмена по Ethernet c кучей всяких всяких сообщений и сервер HTTP.
Причем это не уренометр, а именно универсальный измерительный модуль с утверждением типа и всеми вытекающими последствиями.
А все это крутится на одном ARMe.
Поэтому каждый занимается своей задачей и каждый инициирует свое и не торогает соседа. И никаких проблем, правда без централизованной системой управления версиями тут уж не обходится.
А еще надо упраалять этим модулем с PC, т.е. к нему надо OPC сервер сделать что б SCADA работала с ним. И метрологию надо для него делать.
|
|
|
|
22.01.2013, 11:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Картинка проекта
|
|
|
|
22.01.2013, 14:12
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от Boba_spb
|
К примеру.
Вы думаете, что один и тот же человек ...
|
Вы угадали... Я сейчас именно такое и пишу.... Один, пока ... И что? Исток новый делаю...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:29.
|
|