Tag: STM32F103



Приобретенная у продавца Kesun плата не содержит ничего лишнего. Похоже, что даже некоторые нужные компоненты на ней отсутствуют. Так, при подключении она не определяется как устройство последовательного доступа. .. continue reading ..






GPIO_Mode_AIN 0×00 аналоговый вход (англ. Analog INput)
GPIO_Mode_IN_FLOATING 0×04 вход без подтяжки, болтающийся (англ. Input float) в воздухе
GPIO_Mode_IPD 0×28 вход с подтяжкой к земле (англ. Input Pull-down)
GPIO_Mode_IPU 0×48 вход с подтяжкой к питанию (англ. Input Pull-up)
GPIO_Mode_Out_OD 0×14 выход с открытым стоком (англ. Output Open Drain)
GPIO_Mode_Out_PP 0×10 выход двумя состояниями (англ. Output Push-Pull — туда-сюда)
GPIO_Mode_AF_OD 0x1C выход с открытым стоком для альтернативных функций (англ. Alternate Function). Используется в случаях, когда выводом должна управлять периферия, прикрепленная к данному выводу порта (например, вывод Tx USART1 и т.п.)
GPIO_Mode_AF_PP 0×18 то же самое, но с двумя состояниями

http://cxem.net/mc/mc133.php






Микроконтроллер STM32F103VCT6 имеет четыре таймера общего назначения (TIM2, TIM3, TIM4, TIM5) и два расширенных таймера (TIM1, TIM8): .. continue reading ..






Информация об имеющихся на плате кнопках:

Button Port Примечание
S1 BOOT0
S2 RST
KeyA PC13 (S3)
KeyB PB2 (S4)





Информация об имеющихся на плате HY-Mini STM32V светодиодах:

LED Pin Примечание
LD1 USB Светодиод вверху слева: индикация работы USB
LD2 Pwr Светодиод вверху справа: индикация наличия питания 5В
LED1 PB0 Светодиод внизу слева (LD3)
LED2 PB1 Светодиод внизу справа (LD4)





Настройка таймера TIM6 на генерацию меандра частотой 100 кГц:

     TIM6->PSC = 71; // Это 1 MГц при тактовой частоте 72 МГц
     TIM6->ARR = 4; // При PSC 71 и ARR 4 прерывание каждые 5 мкс (200 кГц)
     TIM6->DIER |= TIM_DIER_UIE; // Разрешаем прерывание от таймера
     TIM6->CR1 |= TIM_CR1_CEN; // Начать отсчёт!
     NVIC_EnableIRQ(TIM6_IRQn); // Разрешение TIM6_IRQn прерывания

Разместив эти коды в программе и дополнив из процедурой обработки прерывания

void TIM6_IRQHandler(void) {
  if (PC3_flipflop) {
    GPIO_ResetBits(GPIOC, GPIO_Pin_3);
    PC3_flipflop = 0;
  }
  else {
    GPIO_SetBits(GPIOC, GPIO_Pin_3);
    PC3_flipflop = 1;
  }
  TIM6->SR &= ~TIM_SR_UIF; // без сбрасывания флага программа зависает!!!
}

на ножке PC3 получим сигнал, изменяющийся с периодичностью 10 мкс: 5 мкс HIGH, 5 мкс LOW.

Естественно, не забываем включить тактирование для используемой периферии:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	// разрешить тактирование GPIOC
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);	// разрешить тактирование TIM6

и правильно настроить используемый вывод:

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

В таком варианте приходится использовать обработку в рамках ISR.

Если хочется добиться полностью автоматической работы генератора меандра по принципу “настроил и забыл”, то естественным образом следует обратиться к ШИМ.

  Tim_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef       TIM_OCInitStructure;

Перво-наперво конфигурируем вывод PA1, с которого будем снимать сигнал

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	// разрешить тактирование GPIOA
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

Разрешаем тактирование таймера 2

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

Конфигурируем таймер: чтобы получить частоту меандра 100 кГц (период 10 мкс) при системной тактовой частоте 72 МГц, запишем в PSC 71, а в ARR – 9 (72,000,000/72 = 1,000,000 1,000,000/10 = 100,000)

  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/1000000 - 1;
  TIM_TimeBaseStructure.TIM_Period = 10 - 1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

После настройки таймера настраиваем ШИМ: Channel 2 / Edge-aligned / not single pulse mode

  TIM_OCStructInit(&TIM_OCInitStructure);
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;             // режим ШИМ -> непрерывные пульсации
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //
  TIM_OCInitStructure.TIM_Pulse = 4;                            // пульс длинной 5 тактов => 5/10 = 50%
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     // полярность => пульс - это единица (+3.3V)
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);                      // инициализация канала 2 таймера 2 -> PA1

Конфигурирование завершено, запускаем таймер

  TIM_Cmd(TIM2, ENABLE);

и с чувством глубокого удовлетворения пользуемся сигналом на выводе PA1.

———–

http://habrahabr.ru/post/161993/

Настройка таймера TIM5 на генерацию меандра с частотой 10 кГц:

    // Тоже самое, только теперь таймер №5 на частоте 10 kHz
    TIM_BaseConfig.TIM_Prescaler =  (SystemCoreClock / 10000) - 1;
    // Мигаем светодиодом 1 раз в секунду.
    TIM_BaseConfig.TIM_Period = 9999;
    TIM_BaseConfig.TIM_ClockDivision = 0;
    TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM5, &TIM_BaseConfig);

    TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCConfig.TIM_Pulse = 4999;
    TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High;

    // Первый выход - PA0
    TIM_OC1Init(TIM5, &TIM_OCConfig);

    TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);
    TIM_ARRPreloadConfig(TIM5, ENABLE);

    TIM_Cmd(TIM5, ENABLE);





В документах STMicroelectronics RM008 (раздел 11.9.3) кратко, а в AN3116 (раздел 2.2) более подробно рассматривается режим быстрых преобразований со смещением во времени. Используя этот режим, можно вдвое поднять и без того немалую скорость сэмплирования микроконтроллеров STM32F103xxx: до 1.7 мегавыборок/сек при системной тактовой частоте 72 МГц и до 2 мегавыборок – при частоте 56 МГц.

.. continue reading ..






Микроконтроллер STM32F103VCT6 имеет два модуля DAC: .. continue reading ..






Микроконтроллер STM32F103VCT6 имеет два модуля I2C: .. continue reading ..






Микроконтроллер STM32F103VCT6 имеет три модуля ADC: .. continue reading ..