sonycman 0 4 июня, 2009 Опубликовано 4 июня, 2009 · Жалоба Там еще есть System Handler Priority Registers 3 регистра Спасибо большое! :) В STM у нас всего 16 уровней приоритетов, вроде? Приходится затачивать его ужасный I2C контроллер под них, так, как в последней эррате советуют... на макс. приоритет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 4 июня, 2009 Опубликовано 4 июня, 2009 · Жалоба В STM у нас всего 16 уровней приоритетов, вроде? Да, насолько я помню 4 бита используется. Но надо учитывать что старших 4 бита! Еще надо про PRIGROUP в Application Interrupt and Reset Control Register не забыть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 4 июня, 2009 Опубликовано 4 июня, 2009 · Жалоба А как сменить приоритет для прераваний без порядкового номера? К примеру, для SysTick - системного таймера? В таблице указано, что можно менять, но регистры Interrupt Priority Registers начинаются с номера 0, а это Window watchdog interrupt и ниже... Что-то непонятно как-то :( core_cm3.h: static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, int32_t priority) { if(IRQn < 0) { SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */ else { NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ } stm32f10x.h: typedef enum IRQn { ... SysTick_IRQn = -1, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 5 июня, 2009 Опубликовано 5 июня, 2009 · Жалоба core_cm3.h: static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, int32_t priority) Спасибо, вроде разобрался. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gr9 0 10 июня, 2009 Опубликовано 10 июня, 2009 · Жалоба Обнаружил странную вещь. При использовании кейловской ОС RL-RTX, если настроить прерывание от ADC1, то запуск первой же ОС функции os_sys_init() приводит к вылету в прерывание HardFaultException() и, соответственно, зависанию процессора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gr9 0 11 июня, 2009 Опубликовано 11 июня, 2009 · Жалоба Разобрался. Не учел, что файлы STM32F10x.s (от Keil) и stm32f10x_vector.s (от ST) содержат в себе разные названия функций для обработки прерываний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miksher2008 0 13 июня, 2009 Опубликовано 13 июня, 2009 · Жалоба Здравствуйте Посмотрите пожалуйста пример программки миганием светодиода (не получается помигать) В чем ошибка? //******************************************************************************** ***************** //******************* Настойка тактирования процессора ******************************************** //******************************************************************************** ***************** void SetupClock(void) { // 1. включаем внутренний генератор RCC_CR_bit.HSION = 1; // включаем внутренний генератор while(RCC_CR_bit.HSIRDY != 1){} // ожидаем потверждения включения внутреннего генератора // 2. %%%%%%%%%%%% отключаем SYSCLK %%%%%%%%%%%%%%%%%%%%%%%%%% RCC_CFGR_bit.SW = 0; // системный clock не выбран while(RCC_CFGR_bit.SWS != 0){} // ожидаем потверждения выключения SYSCLK // 3. отключаем внешний генератор RCC_CR_bit.HSEON = 0; // отключаем внешний генератор RCC_CR_bit.HSEBYP = 0; // не замыкаем внешний генратор с SYSCLK while(RCC_CR_bit.HSERDY != 0){} // ожидаем потверждения выключения внешнего генератора // 4. ******ВЫКЛЮЧАЕМ PLL******** RCC_CR_bit.PLLON = 0; // выключаем PLL while(RCC_CR_bit.PLLRDY != 0 ){} // ожидаем потверждения выключения PLL // 5. настаеваем SYSCLK RCC_CFGR_bit.PLLSRC = 0; // HSI (внутренний генератор) выбирается как вход PLL, при этом делится на 2 RCC_CFGR_bit.PLLXTPRE = 0; // HSE (внешний генератор) не делится на 2 во вход в PLL RCC_CFGR_bit.PLLMUL = 0xA; // установка умнажителя на 12 (8 МГц -> /2 -> 4 МГц -> *12 -> 48 МГц) // 6. ********ВКЛЮЧАЕМ PLL******* RCC_CR_bit.PLLON = 1; // включаем PLL while(RCC_CR_bit.PLLRDY == 0){} // ожидаем потверждения включения PLL // 7. настраемаем AHB предделитель RCC_CFGR_bit.HPRE = 0x0; // преддилитель AHB = 1 // 8. настраемаем APB1 предделитель RCC_CFGR_bit.PPRE1 = 0x4; // преддилитель APB1 = 2 // 9. настраемаем APB2 предделитель RCC_CFGR_bit.PPRE2 = 0x0; // преддилитель APB2 = 1 RCC_CR_bit.CSSON = 0; // отключаем внешний детектор clock // 12. %%%%%%%%%%%%%%%%%%% включаем SYSCLK %%%%%%%%%%%%%%%%%%%%% RCC_CFGR_bit.SW = 2; // PLL как системный clock while(RCC_CFGR_bit.SWS != 2){} // ожидаем потверждения включения SYSCLK } //******************************************************************************** ***************** //******************************************************************************** ***************** //******************* Инициализация порта D ******************************************************* //******************************************************************************** ***************** void PortDInit(void) { RCC_APB2ENR_bit.IOPDEN = 1; // включаем clock к GPIOA RCC_APB2RSTR_bit.IOPDRST = 1; // сброс GPIOA GPIOD_BRR_bit.BR2 = 1; // сброс PD2 GPIOD_CRL_bit.MODE2 = 3; // Output mode, max speed 50 MHz. GPIOD_CRL_bit.CNF2 = 0; // output Push-pull GPIOD_ODR_bit.ODR2 = 0; // output Push-pull } затем в main() while(1) { GPIOD_BRR_bit.BR2 = 1; myDelay(3000000); GPIOD_BSRR_bit.BS2 = 1; myDelay(3000000); } Может кто-нибудь поможет с примером программы мигания светодиода Мой микроконтроллер: STM32F103xxE, LQFP64, светодиод на 54 ноге (порт D, 2-ой пин) Внешнего генератора нет использую внутренний Пример программы в прикрепленном архиве stm.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 13 июня, 2009 Опубликовано 13 июня, 2009 · Жалоба Может кто-нибудь поможет с примером программы мигания светодиода Бог (IAR) подаст :-) Посмотрите проекты для Олимексовского старт-кита, там 16 светодиодов на плате, и моргают все! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 17 июня, 2009 Опубликовано 17 июня, 2009 · Жалоба Мужики, подскажите, кто работал с USB данных чипов. Начал с ним разбираться - в первый раз. :rolleyes: Мой девайс будет питаться от своего источника. Что произойдёт, если устройство не запитано, но производится его подключение кабелем к PC? Не будет ли напряжение с порта пытаться запитать контроллер через защитные диоды портов? (так как обычно сигнал с порта USB +5v подаётся на порт контроллера для детектирования подключенного кабеля...) Какова правильная схемотехника для данного случая? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 18 июня, 2009 Опубликовано 18 июня, 2009 · Жалоба Кажися, я нашёл потенциальный глюк в фирменной ST-шной библиотеке USB-FS-Device development kit v3.0.1. Это касается модификации регистров конечных точек USB_EPnR. Регистры выглядят так: Мягко говоря, весьма поганый набор битов с различными режимами доступа - и обычные rw, и read_only_cleared_by _writing_zero (rc_w0), и даже toggle биты, меняющие своё состояние только при записи единички... Так вот, процедуры модификации полей TYPE и STAT работают очень просто - читают регистр, затем маскируют (AND) биты, требующие модификации и toggle биты (оставляя без изменения остальные rw и rc_w0 биты). Затем записывают по OR нужное значение и всё это дело пишется обратно в регистр. Вот код: #define _GetENDPOINT(bEpNum) ((uint16_t)(*(EP0REG + bEpNum))) #define _SetENDPOINT(bEpNum,wRegValue) (*(EP0REG + bEpNum)= \ (uint16_t)wRegValue) #define EPREG_MASK (EP_CTR_RX|EP_SETUP|EP_T_FIELD|EP_KIND|EP_CTR_TX|EPADDR_FIELD) #define EPTX_DTOGMASK ( 0x0030 | EPREG_MASK) #define _SetEPTxStatus(bEpNum,wState) {\ register uint16_t _wRegVal; \ _wRegVal = _GetENDPOINT(bEpNum) & EPTX_DTOGMASK;\ /* toggle first bit ? */ \ if((EPTX_DTOG1 & wState)!= 0) \ _wRegVal ^= EPTX_DTOG1; \ /* toggle second bit ? */ \ if((EPTX_DTOG2 & wState)!= 0) \ _wRegVal ^= EPTX_DTOG2; \ _SetENDPOINT(bEpNum, _wRegVal); \ } /* _SetEPTxStatus */ void SetEPTxStatus(uint8_t bEpNum, uint16_t wState) { _SetEPTxStatus(bEpNum, wState); } Но! Ведь таким "макаром" можно стереть rc_w0 бит, в случае, если он был установлен железом в момент между чтением и записью регистра! То есть читаем такоой бит как "0", затем записываем его, естественно, тоже как "0", тем самым перезаписывая новое его значение! По идее, если я правильно понял, после маскирования биты rc_w0 надо ещё и принудительно устанавливать в "1", чтобы при записи гарантированно не потерять момент изменения состояния... Странно, почему у фирмачей не так? :laughing: Вот даже мануал говорит, что: Read-modify-write cycles on these registers should be avoided because between the read and the write operations some bits could be set by the hardware and the next write would modify them before the CPU has the time to detect the change. For this purpose, all bits affected by this problem have an ‘invariant’ value that must be used whenever their modification is not required. It is recommended to modify these registers with a load instruction where all the bits, which can be modified only by the hardware, are written with their ‘invariant’ value. Так почему же это не выполняется? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serj78 0 23 июня, 2009 Опубликовано 23 июня, 2009 · Жалоба Кто-нибудь изучал, как ведут себя контроллеры STM32F103xxx при перегрузке выходов по току? Если вывод на 100 ом нагрузить(защитные сопротивления) - это не страшно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 23 июня, 2009 Опубликовано 23 июня, 2009 · Жалоба Ммм, ковыряюсь в ST-шном примере USB Mass Storage. В коде не увидел обработки битов синхронизации (DTOG_TX и DTOG_RX) для нулевого канала. Ну я могу ещё допустить, что они сбрасываются автоматически при приёме SETUP и сами переключаются на последующих пакетах данных. Но как же быть с последним, подтверждающим пакетом, где эти биты всегда должны быть в единичке? Не думаю, что и эта ситуация может быть автоматически обработана контроллером, так как он не сможет предсказать, какой именно пакет будет последним... Эх, кажется, намучаюсь я ещё с этим примерчиком... :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zksystem 0 24 июня, 2009 Опубликовано 24 июня, 2009 · Жалоба Мужики, подскажите, кто работал с USB данных чипов. Начал с ним разбираться - в первый раз. :rolleyes: Мой девайс будет питаться от своего источника. Что произойдёт, если устройство не запитано, но производится его подключение кабелем к PC? Не будет ли напряжение с порта пытаться запитать контроллер через защитные диоды портов? (так как обычно сигнал с порта USB +5v подаётся на порт контроллера для детектирования подключенного кабеля...) Какова правильная схемотехника для данного случая? если Ваш девайс имеет собственное питание, то в этом случае ИМХО просто пренебречь линией +5В от USB, использовать ее как факт подключения к USB. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 24 июня, 2009 Опубликовано 24 июня, 2009 · Жалоба ... просто пренебречь линией +5В от USB, использовать ее как факт подключения к USB. Именно в этом случае и может возникнуть нежелаемый эффект. Если Вы не хотите питать Ваш девайс от USB, имеет смысл контролировать +5V через буфер, напр. полевик. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 24 июня, 2009 Опубликовано 24 июня, 2009 · Жалоба Да, тоже остановился на буфере из транзисторов/полевике, чтобы не допустить прямой подачи +Uusb на контроллер. Ну а линии D+ и D- - с ними не надо заморачиваться? Надеюсь, на них нет никаких диодов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться