|
|
  |
STM32 – вопросы – проблемы - решения. |
|
|
|
Nov 3 2011, 08:42
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(diwil @ Nov 3 2011, 09:29)  Правой мышкой тоже не получалось. оказалось нужно было поменять: USB\VID_b0c0&PID_0020&MI_00 - на - USB\VID_b0c0&PID_0020&REV_0200 и все встало (ну проблемы у меня с виндой  ...). правда винда ругалась на производителя, но это уже ее проблемы... спасибо еще раз большое. Был рад помочь! Да, Вы правы: я спросил коллегу, оказалось, что &MI_00 - это наше композитное устройство, Вы верно замену сделали. Вот тут ссылка на информацию по теме от гуру в области USB - господина Тсунео (Tsuneo).
|
|
|
|
|
Nov 5 2011, 12:18
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Для информации.
Вожусь с I2C (STM32F103).
Что этот интерфейс в камне есть совершенно непролазные дебри, уже всем известно. Я в свое время вроде хорошо разобрался с ним, даже с DMA он у меня качает туда-сюда. И тут вдруг при запуске чтения или записи натыкаюсь на занятость шины (в моих функциях-обертках доступа в начале идет проверка на занятость шины на случай многомастерной коммуникации).
Обнаружилось: уже после выдачи STOP в конце предыдущей операции по I2C бит BUSY еще стоит какое-то время, а процессор такой шустрый, что если вскорости вызвать очередную операцию по I2C, можно на этот бит и нарваться! Решение - типа недолгое ожидание (по эксперименту в районе времени передачи двух байт, на всякий случай с таймаутом на основе DWT), пока BUSY не уйдет.
Вторая заморочка: пока тестировал на 400kHz, не встречался, а опустил до 100kHz, наткнулся на прерывание по состоянию I2C_EVENT_MASTER_BYTE_TRANSMITTING. Я работал по I2C_EVENT_MASTER_BYTE_TRANSMITTED, т.к. это более удобно для особых случаев приема 1-го или 2-х байтов, а тут проскакивает _TRANSMITTING. Решение: приходится еще дожидаться в прерывании бита BTF, т.к. если просто вывалиться из прерывания, то I2C_EVENT_MASTER_BYTE_TRANSMITTED (то есть, установка бита BTF) его больше не вызывает, и машина приема виснет.
Может кому будет полезно.
Сообщение отредактировал KnightIgor - Nov 5 2011, 12:34
|
|
|
|
|
Nov 10 2011, 07:57
|
Группа: Новичок
Сообщений: 3
Регистрация: 10-11-11
Пользователь №: 68 232

|
.
Сообщение отредактировал rockmp4 - Nov 10 2011, 07:59
|
|
|
|
|
Nov 10 2011, 07:57
|
Группа: Новичок
Сообщений: 3
Регистрация: 10-11-11
Пользователь №: 68 232

|
Подскажите пожалуйста где взять все ПДФки с описанием всех настроек stm32f1xx (описание регистров, битов для настройки). А то на сайте ST нифига найти не могу, тока app notes, user manuals, а кокретно по настройке ничего. Пытаюсь на них перелезть с tms320f28335, где все для людей: по АЦП, таймерам и т.д. отдельные даташиты с полным описанием и всеми регистрами.
|
|
|
|
|
Nov 10 2011, 08:22
|
Группа: Новичок
Сообщений: 3
Регистрация: 10-11-11
Пользователь №: 68 232

|
Цитата(ViKo @ Nov 10 2011, 15:12)  Reference Manual, там же, на сайте ST. Спасибо, попробую поковырять.
|
|
|
|
|
Dec 8 2011, 12:51
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 10-11-11
Пользователь №: 68 243

|
Помогите пожалуйста с внешним прерыванием! Проблема в том, что при возникновении внешнего прерывания процессор на него реагирует, но не переходит в обработчик прерываний, а зависает где то! И в основной цикл не возвращается. Может кто знает в чем дело? CODE #include "stm32f10x.h"
int main() { RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
GPIOC->CRH |= GPIO_CRH_MODE9; GPIOC->CRH &=~ GPIO_CRH_CNF9; GPIOA->CRL |= GPIO_CRL_MODE0; GPIOA->CRL &=~ GPIO_CRL_CNF0_0; RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PA; EXTI->IMR |= EXTI_IMR_MR0; EXTI->EMR |= EXTI_EMR_MR0; EXTI->RTSR |= EXTI_RTSR_TR0; NVIC_SetPriority(EXTI0_IRQn, 7); NVIC_EnableIRQ(EXTI0_IRQn); __enable_irq (); while (1) { GPIOC->BSRR |= GPIO_BSRR_BS8; for (volatile int x=0; x<100000; x++){} GPIOC->BRR |= GPIO_BRR_BR8; for (volatile int x=0; x<100000; x++){} } } //Сам обработчик прерывания void EXTI0_IRQHandler(void) { if ((EXTI->PR & EXTI_PR_PR0)==0) { GPIOC->BSRR |= GPIO_BSRR_BS9; EXTI->PR |= EXTI_PR_PR0; } }
Сообщение отредактировал IgorKossak - Dec 8 2011, 20:48
Причина редактирования: [codebox]
|
|
|
|
|
Dec 8 2011, 16:00
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
А где размещен переход на EXTI0_IRQHandler?
--------------------
ASB
|
|
|
|
|
Dec 8 2011, 16:09
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 10-11-11
Пользователь №: 68 243

|
Цитата(Aleksandr Baranov @ Dec 8 2011, 19:00)  А где размещен переход на EXTI0_IRQHandler? В startup_stm32f10x_md_vl.s
|
|
|
|
|
Dec 8 2011, 16:56
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(IDL @ Dec 8 2011, 18:51)  Помогите пожалуйста с внешним прерыванием! Проблема в том, что при возникновении внешнего прерывания процессор на него реагирует, но не переходит в обработчик прерываний, а зависает где то! Если у вас обработчик расположен в *.cpp файле, то его надо объявить как extern "C": Код extern "C" void EXTI0_IRQHandler(void) { ...
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Dec 8 2011, 18:56
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 10-11-11
Пользователь №: 68 243

|
Цитата(AHTOXA @ Dec 8 2011, 19:56)  Если у вас обработчик расположен в *.cpp файле, то его надо объявить как extern "C": Код extern "C" void EXTI0_IRQHandler(void) { ... Спасибо большое, но все равно не помогло  Наверное дело в чем то другом! Будем думать!
|
|
|
|
|
Dec 8 2011, 19:18
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(ELEKTROS @ Dec 9 2011, 01:04)  Как правильно запустить ШИМ на базе TIM1 в STM32f, а то перепробывал кучу разных вариантов даже готовые какието кем то деланные, но всёравно не работает. Вот ШИМ на TIM1_CH2: CODE void pwm_init() { // Включаем тактирование порта A и альтернативных функций: RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN;
// Тактирование таймера: RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
// Настраиваем ногу TIM1_CH2 как альтернативный выход: Pin<'A', 9>::Direct(ALT_OUTPUT);
// Настраиваем таймер: TIM1->CR1 = TIM_CR1_ARPE; // Счёт вверх, без делителя TIM1->CR2 = 0; TIM1->ARR = timer_period; // Период TIM1->PSC = timer_prescaler; // Прескалер TIM1->RCR = 0; TIM1->EGR = TIM_EGR_UG; // Генерим событие для немедленного обновления прескалера
// Настраиваем канал OC2 (output compare 2) TIM1->CCER &= ~(TIM_CCER_CC2E | TIM_CCER_CC2P | TIM_CCER_CC2NE); // Отключаем выход TIM1->CCR2 = 0; // Период TIM1->CCMR1 = (TIM1->CCMR1 & ~(TIM_CCMR1_OC2M | TIM_CCMR1_CC2S | TIM_CCMR1_OC2M)) | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | // PWM 1 (0x6000), TIM_CCMR1_OC2PE; //;
TIM1->CCER |= TIM_CCER_CC2E; // Включаем выход TIM1->CR1 |= TIM_CR1_CEN; // Запускаем таймер TIM1->BDTR |= TIM_BDTR_MOE; // Специальная фишка у T1 и T8 - Main Output Enable }
void pwm_set(uint16_t value) { TIM1->CCR2 = value; }
Сообщение отредактировал AHTOXA - Dec 9 2011, 08:15
Причина редактирования: [codebox]
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|