Перейти к содержанию
    

STM32 – вопросы – проблемы - решения.

Правой мышкой тоже не получалось.

 

оказалось нужно было поменять:

 

USB\VID_b0c0&PID_0020&MI_00

- на -

USB\VID_b0c0&PID_0020&REV_0200

 

и все встало (ну проблемы у меня с виндой :)...). правда винда ругалась на производителя, но это уже ее проблемы...

спасибо еще раз большое.

 

Был рад помочь!

 

Да, Вы правы: я спросил коллегу, оказалось, что &MI_00 - это наше композитное устройство, Вы верно замену сделали.

Вот тут ссылка на информацию по теме от гуру в области USB - господина Тсунео (Tsuneo).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для информации.

 

Вожусь с 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите пожалуйста где взять все ПДФки с описанием всех настроек stm32f1xx (описание регистров, битов для настройки). А то на сайте ST нифига найти не могу, тока app notes, user manuals, а кокретно по настройке ничего.

Пытаюсь на них перелезть с tms320f28335, где все для людей: по АЦП, таймерам и т.д. отдельные даташиты с полным описанием и всеми регистрами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А то на сайте ST нифига найти не могу, тока app notes, user manuals, а кокретно по настройке ничего.

Reference Manual, там же, на сайте ST.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите пожалуйста с внешним прерыванием! Проблема в том, что при возникновении внешнего прерывания процессор на него реагирует, но не переходит в обработчик прерываний, а зависает где то! И в основной цикл не возвращается. Может кто знает в чем дело?

#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
[codebox]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите пожалуйста с внешним прерыванием! Проблема в том, что при возникновении внешнего прерывания процессор на него реагирует, но не переходит в обработчик прерываний, а зависает где то! И в основной цикл не возвращается. Может кто знает в чем дело?

 

Не оно?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите пожалуйста с внешним прерыванием! Проблема в том, что при возникновении внешнего прерывания процессор на него реагирует, но не переходит в обработчик прерываний, а зависает где то!

Если у вас обработчик расположен в *.cpp файле, то его надо объявить как extern "C":

extern "C" void EXTI0_IRQHandler(void)
{
...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если у вас обработчик расположен в *.cpp файле, то его надо объявить как extern "C":

extern "C" void EXTI0_IRQHandler(void)
{
...

 

Спасибо большое, но все равно не помогло :( Наверное дело в чем то другом! Будем думать!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как правильно запустить ШИМ на базе TIM1 в STM32f, а то перепробывал кучу разных вариантов даже готовые какието кем то деланные, но всёравно не работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как правильно запустить ШИМ на базе TIM1 в STM32f, а то перепробывал кучу разных вариантов даже готовые какието кем то деланные, но всёравно не работает.

Вот ШИМ на TIM1_CH2:

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
[codebox]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...