STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

isx писал(а):Может с настройками что не так?
вроде SYSCFG->EXTICR[0] вместо SYSCFG->EXTICR[1]
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

uldemir писал(а): Однако вопрос остаётся. Нужен ли CMSIS или нет. И на что влияет галочка в Library Configurations -> CMSIS ?
Достаточно ли iostm32f051 для несложной фирмвари на тему поморгать светодиодом по прерываниям?

Галочка подключает CMSIS что в IAR'вской поставке .
И без IAR'вских хэдеров можно и лучше вообще без IAR. Keil рулит...
Реклама
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: STM32 новичку в ARM что к чему

Сообщение isx »

oleg110592 писал(а):вроде SYSCFG->EXTICR[0] вместо SYSCFG->EXTICR[1]
Пробовал. Тоже самое :(
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

isx, внешнюю подтяжку попробуй ...

Здесь на PA2 но на F4 . SYSCFG и EXTI line не тревожу ибо PA по дефолту

Код: Выделить всё

  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN ;
    
    GPIOA->MODER &=~ GPIO_MODER_MODER2; 
                                 
      GPIOA->PUPDR&= ~ GPIO_PUPDR_PUPDR2;
      GPIOA->PUPDR|=GPIO_PUPDR_PUPDR2_0;
                               
  
     EXTI->IMR |= EXTI_IMR_MR2;
     EXTI->FTSR |=EXTI_FTSR_TR2;
     NVIC_SetPriority(EXTI2_IRQn ,15);
     NVIC_EnableIRQ(EXTI2_IRQn );
Хэндлер

Код: Выделить всё

void EXTI2_IRQHandler (void)
    {
      бла,бла,бла ...


          EXTI->PR |=EXTI_PR_PR2;
       
    }
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

странности:
PA2 сконфигурирован на вывод, а от него ожидаются прерывания

Код: Выделить всё

GPIOA->MODER |= GPIO_MODER_MODER14_1 | GPIO_MODER_MODER13_1 | GPIO_MODER_MODER6_1 | GPIO_MODER_MODER2_0;
подтяжка, наверное планировалась на PA0

Код: Выделить всё

GPIOA->PUPDR |= GPIO_PUPDR_PUPDR1_0 | GPIO_PUPDR_PUPDR2_0;
Реклама
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Chip115 »

Всем привет!
Контроллер STM32F100C4T6B
Нужна тупая функция задержки, которая позволяет получить задержку в 1 us.
Для этого решил заюзать SysTick_Config.
Генератор HSI. Настроил на максимум - 24 МГц.

Код: Выделить всё

  uint8_t Clock=0; 
  RCC_ClocksTypeDef RCC_Clock;
  RCC_DeInit();
  RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_6);
  RCC_PLLCmd(ENABLE);
  RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);
  Clock = RCC_GetSYSCLKSource ();
  RCC_GetClocksFreq(&RCC_Clock);
Убедился, действительно источником является PLL, 24000000

Проблема в том, что МК постоянно находится в SysTick_Handler.

Код: Выделить всё

unsigned long ulstm32f10x_it_SysTime = 0;

void SysTick_Handler(void)
  {
    ulstm32f10x_it_SysTime++;
  }
Почему так происходит?

Вот код main

Код: Выделить всё

void main(void)
{
  uint8_t Clock=0; 
  RCC_ClocksTypeDef RCC_Clock;
  RCC_DeInit();
  RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_6);
  RCC_PLLCmd(ENABLE);
  RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);
  Clock = RCC_GetSYSCLKSource ();
  RCC_GetClocksFreq(&RCC_Clock);  
  SysTick_Config (SystemCoreClock/1000000);    // SystemCoreClock==24000000
  
  uint8_t test; 
   
  while(1) 
  {
     vOWWriteBit (0x93);
  }
}
call stack

Код: Выделить всё

SysTick_Handler
<Exception frame>
vOWWriteBit
main
[_call_main + 0x9]
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Реклама
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 953
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение GARMIN »

В прерывании таймера нужно ручками снять флаг, вызвавший прерывание.
Флагов много, прерываний мало, вот и приходится определять, по какому флагу произошло прерывание.
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Chip115 »

GARMIN писал(а):В прерывании таймера нужно ручками снять флаг, вызвавший прерывание.
Флагов много, прерываний мало, вот и приходится определять, по какому флагу произошло прерывание.
На миллисекундах работает. Не в нем дело. Да и ни в одном примере не встречал что бы у этого таймера флаги вручную сбрасывали
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: STM32 новичку в ARM что к чему

Сообщение uk8amk »

Chip115 писал(а):Всем привет!
Проблема в том, что МК постоянно находится в SysTick_Handler.
1мкс на 24МГц - это 24 такта. Сколько тактов занимает вход в прерывание+его тело+выход?
А там дальше систик переполняется и снова делает запрос.
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Chip115 »

uk8amk писал(а):
Chip115 писал(а):Всем привет!
Проблема в том, что МК постоянно находится в SysTick_Handler.
1мкс на 24МГц - это 24 такта. Сколько тактов занимает вход в прерывание+его тело+выход?
А там дальше систик переполняется и снова делает запрос.
А как это проверить? CYCLECOUNTER в дебаггере постоянно кажет нуль.
Запускаю через симулятор - вообще не входит в прерывание, но CYCLECOUNTER считает что-то.
Пишу в IAR.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: STM32 новичку в ARM что к чему

Сообщение uk8amk »

Что проверить?
То что только на вход и выход из обработчика тратится по 12 циклов?

Такие мелкие задержки лучше реализовать не через прерывания, а опросом статусного флага таймера в цикле. Если конечно в прерывании не висит конечный автомат. И в этом случае оно будет длинее чем 1 мкс.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: STM32 новичку в ARM что к чему

Сообщение isx »

Сделал поправки:

Код: Выделить всё

void EXTI0_IRQHandler(void)
   {

				   switch (GPIOA->IDR & GPIO_IDR_1) {
						 case 0:
							 TIM16->CCR1 = 0x0000; break;
						 case 1: 
							 TIM16->CCR1 = 0xFFFF; break;
						 default:
							          ;}						       	
												
     EXTI->PR |= EXTI_PR_PR0; 
   }

void EXTI2_IRQHandler(void)
   {
     TIM16->CCR1 = 500;
     EXTI->PR |= EXTI_PR_PR2;
   }

int main()
{

        NVIC_EnableIRQ(TIM14_IRQn); 
	NVIC_EnableIRQ(EXTI0_1_IRQn);
	NVIC_EnableIRQ(EXTI2_3_IRQn);
	NVIC_SetPriority(TIM14_IRQn, 3);	
	NVIC_SetPriority(EXTI0_1_IRQn, 2);
	NVIC_SetPriority(EXTI2_3_IRQn, 1);

		
	RCC->AHBENR |= RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOAEN;
	RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
	RCC->APB1ENR |= RCC_APB1ENR_TIM14EN;
	RCC->APB2ENR |= RCC_APB2ENR_TIM16EN;
	RCC->APB2ENR |= RCC_APB2ENR_SYSCFGCOMPEN;
		
	GPIOA->MODER |= GPIO_MODER_MODER14_1 | GPIO_MODER_MODER13_1 | GPIO_MODER_MODER6_1;
	GPIOA->MODER &=~ GPIO_MODER_MODER2; 
	GPIOB->MODER |= GPIO_MODER_MODER6_1;
	GPIOA->AFR[0] |= 0x05000000;
	GPIOB->AFR[0] |= 0x02000000;
	GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR0 | GPIO_OSPEEDR_OSPEEDR1 | GPIO_OSPEEDR_OSPEEDR2 | GPIO_OSPEEDR_OSPEEDR3 |  GPIO_OSPEEDR_OSPEEDR6;
	GPIOB->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR0 | GPIO_OSPEEDR_OSPEEDR1 | GPIO_OSPEEDR_OSPEEDR6;
	GPIOA->PUPDR = 0x5555C555;
	
	SYSCFG->EXTICR[1] |= SYSCFG_EXTICR1_EXTI0_PA | SYSCFG_EXTICR1_EXTI2_PA;
	
	EXTI->RTSR |= EXTI_RTSR_TR2;
	EXTI->FTSR |= EXTI_FTSR_TR0 | EXTI_FTSR_TR2;
	EXTI->IMR |= EXTI_IMR_MR0 | EXTI_IMR_MR2;
	EXTI->PR |= EXTI_PR_PR0; 
	EXTI->PR |= EXTI_PR_PR2; 
Только вот он один фиг не идет в обработчик. В отладке в KEIL видно, что биты регистра IDR меняют значение при нажатии на кнопку.
oleg110592 писал(а):PA2 сконфигурирован на вывод, а от него ожидаются прерывания
Это я просто в 3 часа ночи как только не пытался его завести :)))
dosikus писал(а):Здесь на PA2 но на F4 . SYSCFG и EXTI line не тревожу ибо PA по дефолту
Я уже для верности и флаги после инициализации пробовал сбросить, но ему вообще пофиг на меня.
Я уже понятия не имею чё ему не хватает :dont_know:
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

непонятно, вроде должно работать. Вот на всякий мой код - из сна по прерываниям на ногах и по часам все нормально выходит.

Код: Выделить всё

    //Set up EXTI
    EXTI->FTSR |= EXTI_FTSR_TR0; //INR
    EXTI->RTSR |= EXTI_RTSR_TR13; //HK
    EXTI->RTSR |= EXTI_RTSR_TR17; //RTC
    EXTI->IMR  = (EXTI_IMR_MR0 | EXTI_IMR_MR13 | EXTI_IMR_MR17);
    
    //EXTI to port  connection
    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
    SYSCFG->EXTICR[0] = SYSCFG_EXTICR1_EXTI0_PA;
    SYSCFG->EXTICR[3] = SYSCFG_EXTICR4_EXTI13_PC;
    RCC->APB2ENR &= ~RCC_APB2ENR_SYSCFGEN;
    NVIC_EnableIRQ(EXTI0_1_IRQn);
    NVIC_SetPriority(EXTI0_1_IRQn, 0);
    NVIC_EnableIRQ(EXTI4_15_IRQn);
    NVIC_SetPriority(EXTI4_15_IRQn, 0);
    NVIC_SetPriority(RTC_IRQn, 0);
    NVIC_EnableIRQ(RTC_IRQn);
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

isx, подождешь до вторника? Железа под рукой нет ...
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: STM32 новичку в ARM что к чему

Сообщение isx »

oleg110592 писал(а):Вот на всякий мой код - из сна по прерываниям на ногах и по часам все нормально выходит.
Тоже не работает :( .
dosikus писал(а):подождешь до вторника? Железа под рукой нет ...
А куда мне деваться :))) . Сижу пока, копаю просторы интернета.

Вот сделал отдельный проект без иной периферии. Проверьте кто может...
Вложения
DEL.zip
(325.02 КБ) 148 скачиваний
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Chip115 »

uk8amk писал(а):Что проверить?
То что только на вход и выход из обработчика тратится по 12 циклов?

Такие мелкие задержки лучше реализовать не через прерывания, а опросом статусного флага таймера в цикле. Если конечно в прерывании не висит конечный автомат. И в этом случае оно будет длинее чем 1 мкс.
Понял. Спасибо, буду думать!
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

isx писал(а):Вот сделал отдельный проект без иной периферии. Проверьте кто может...
так проверил на железке F051C - работает:

Код: Выделить всё

#include "stm32f0xx.h"

volatile int8_t step = 0;

int main()
{
	RCC->AHBENR |=  RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN;
    GPIOB->MODER = GPIO_MODER_MODER14_0; //output
	GPIOA->PUPDR |= ( GPIO_PUPDR_PUPDR0_0 | GPIO_PUPDR_PUPDR2_0 ); // pull-up
	RCC->APB2ENR |= RCC_APB2ENR_SYSCFGCOMPEN;
	SYSCFG->EXTICR[0] = SYSCFG_EXTICR1_EXTI0_PA | SYSCFG_EXTICR1_EXTI2_PA;
    RCC->APB2ENR &= ~RCC_APB2ENR_SYSCFGCOMPEN;
	//EXTI->RTSR |= EXTI_RTSR_TR2;
	EXTI->FTSR |= (EXTI_FTSR_TR0 | EXTI_FTSR_TR2);
	EXTI->IMR = (EXTI_IMR_MR0 | EXTI_IMR_MR2);
	NVIC_EnableIRQ(EXTI0_1_IRQn);
	NVIC_EnableIRQ(EXTI2_3_IRQn);
	NVIC_SetPriority(EXTI0_1_IRQn, 0);
	NVIC_SetPriority(EXTI2_3_IRQn, 0);
    while(1){
                if((step & (uint8_t)0x01) != 0) GPIOB->ODR |= GPIO_ODR_14;
                else GPIOB->ODR &= ~GPIO_ODR_14;
    }
}

void EXTI0_1_IRQHandler(void)
{
    if ((EXTI->PR & EXTI_PR_PR0) != 0)  /* Check line 0 has triggered the IT */
    {
        step++;						
        EXTI->PR |= EXTI_PR_PR0;
    }
}

void EXTI2_3_IRQHandler(void)
{
    if ((EXTI->PR & EXTI_PR_PR2) != 0)  /* Check line 2 has triggered the IT */
    {

        step--;
        EXTI->PR |= EXTI_PR_PR2;
    }
}
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: STM32 новичку в ARM что к чему

Сообщение uldemir »

Может кто глянет, что не так? Хочу получить PWM от TIM16 CH1. Но на выходе, похоже высокий импеданс. Таймер работает, так как по прерыванию переполнения у меня светодиоды перемигиваются. кристалл stm32F051

Код: Выделить всё

  GPIOB_MODER_bit.MODER8 = 2; // Alternate function PB8 <- AF2 (TIM16_CH1)
  GPIOA_MODER_bit.MODER6 = 2; // Alternate function PA6 <- AF5 (TIM16_CH1)

  GPIOB_AFRH_bit.AFRH0 = 2; // AF2 
  GPIOA_AFRL_bit.AFRL6 = 5; // AF5


  TIM16_CR1_bit.CEN = 0; // disable timer
  TIM16_CCER_bit.CC1E = 0 ; // CCP output disable
  
  TIM16_PSC = 610;     // for DEBUG *******************************
  TIM16_ARR = 13107; // 8MHz / 13108 = 610Hz / 5 = 122 Hz
  TIM16_CCR1 = 5000;

  TIM16_CR1_bit.URS = 1; // only overfow generate UEV
  TIM16_CR2_bit.CCPC = 1; // Capture/compare preload enable
  TIM16_DIER_bit.UIE = 0; // Update interrupt 1 for enable.
    
  TIM16_OCMR1_bit.OC1S = 0; // 00: CC1 channel is configured as output 
  TIM16_OCMR1_bit.OC1M = 7; // PWM mode 2 inactive until TIMx_CNT<TIMx_CCR1 else active
  TIM16_OCMR1_bit.OC1FE = 0; // fast disable
  TIM16_OCMR1_bit.OC1PE = 1; // Preload enable
  TIM16_CCER_bit.CC1P = 0 ; // Polarity active high

  TIM16_BDTR_bit.MOE = 1 ; // OC and OCN outputs are enabled if their respective enable bits are set 
  TIM16_CCER_bit.CC1E = 1 ; // CCP output enable  
  TIM16_CR1_bit.CEN = 1; //enable timer
 
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: STM32 новичку в ARM что к чему

Сообщение isx »

oleg110592 писал(а):так проверил на железке F051C - работает:
Работает!!! :beer:
Спасибо огромное, я две ночи мучался)
Ошибка была в заголовке обработчика прерывания:
было это

Код: Выделить всё

void EXTI0_IRQHandler(void)
.....
void EXTI2_IRQHandler(void)
А нужно было это:

Код: Выделить всё

void EXTI0_1_IRQHandler(void)
....
void EXTI2_3_IRQHandler(void)
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: STM32 новичку в ARM что к чему

Сообщение uk8amk »

uldemir
Интересный подход к доступу к битам регистров. Что у вас за заголовочные файлы?
Ответить

Вернуться в «ARM»