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

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

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

Сообщение oleg110592 »

в чем принципиальное отличие external clock mode 1 от external clock mode 2
подробно расписано в AN4776 Application note General-purpose timer cookbook
Изображение
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

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

Сообщение baghear »

Спасибо!!!
Аватара пользователя
black_lizard
Встал на лапы
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

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

Сообщение black_lizard »

Ребят. Подскажите, что я делаю не так. Пытаюсь инициализировать прерывания от ноги мк. Камень f103. Не переходит в обработчик.

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

	
  //Init GPIOB 10 & 11
  GPIO_InitTypeDef  GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
		
  EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
	
  //Configure EXTI Line130
  EXTI_InitStructure.EXTI_Line = EXTI_Line10;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;   
  EXTI_Init(&EXTI_InitStructure);

  //Enable and set EXTI15_10 Interrupt
  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
		
  NVIC_EnableIRQ(EXTI15_10_IRQn);

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

void EXTI15_10_IRQHandler(void)
{
	addSym('!', BINARY(00111111), BINARY(00000000));
}
Добавлено after 50 minutes 30 seconds:
Поправочка - прерывания заработали. Но только на GPIOA почему-то, на GPIOB никак не реагирует :c
Собираю самопальный мини-компьютер
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

[uquote="black_lizard",url="/forum/viewtopic.php?p=3207014#p3207014"]Но только на GPIOA почему-то, на GPIOB никак не реагирует :c[/uquote]

Потому , что надо вместо бездумного тыканья в SPL, научиться читать документацию:

Изображение Изображение [url=http://radikal.ru]Изображение[/url
Koret
Родился
Сообщения: 6
Зарегистрирован: Пн окт 30, 2017 15:32:31

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

Сообщение Koret »

Ребята, не могу найти характеристики ОУ в STM32, не подскажите, где взять? Надо амперметр сделать, падение на шунте 3-10мВ, вот и думаю, необходимо ли отдельный ОУ ставить, например, LM358 или встроенного хватит?
Аватара пользователя
Fusion
Грызет канифоль
Сообщения: 272
Зарегистрирован: Пт ноя 13, 2009 10:39:32
Откуда: Москва
Контактная информация:

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

Сообщение Fusion »

В даташите. Вот для STM32F303:

0.5 mA output capability
Rail-to-rail input/output
Bandwidth 8.2 MHz
Slew rate 4.7 V/μs
Resistive load 4 kΩ
Capacitive load 50 pF
Max. Input offset voltage 3 mV
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

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

Сообщение Jman »

Привет ребята. Пробую тикать таймерами и использовать прерывания на STM32VLDiscovery. Взял код с сайта(не знаю, можно линк или нет, robocraft в общем), пытаюсь скомпилировать в Keil и он выдает две ошибки:
main.c(29): error: #268: declaration may not appear after executable statement in block
GPIO_InitTypeDef gpio;
main.c(45): error: #268: declaration may not appear after executable statement in block
TIM_TimeBaseInitTypeDef base_timer;
Как будто не в том месте объявлены.

Вот сам код.

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

#include <stm32f10x.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
/* В этом файле - всё для работы с таймерами */
#include <stm32f10x_tim.h>
/* В этом - для работы с NVIC */
#include <misc.h>

enum { BLUE_LED = GPIO_Pin_8, GREEN_LED = GPIO_Pin_9 };

void init_leds();
void init_timer();

int main()
{
  init_leds();
  GPIO_SetBits(GPIOC, BLUE_LED);
  GPIO_ResetBits(GPIOC, GREEN_LED);

  init_timer();

  do __NOP(); while (1);
}

void init_leds()
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

  GPIO_InitTypeDef gpio;
  GPIO_StructInit(&gpio);
  gpio.GPIO_Mode = GPIO_Mode_Out_PP;
  gpio.GPIO_Pin = BLUE_LED | GREEN_LED;
  GPIO_Init(GPIOC, &gpio);
}

void init_timer()
{
  /* Не забываем затактировать таймер */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

  /* Инициализируем базовый таймер: делитель 24000, период 500 мс.
   * Другие параметры структуры TIM_TimeBaseInitTypeDef
   * не имеют смысла для базовых таймеров.
   */
  TIM_TimeBaseInitTypeDef base_timer;
  TIM_TimeBaseStructInit(&base_timer);
  /* Делитель учитывается как TIM_Prescaler + 1, поэтому отнимаем 1 */
  base_timer.TIM_Prescaler = 24000 - 1;
  base_timer.TIM_Period = 500;
  TIM_TimeBaseInit(TIM6, &base_timer);

  /* Разрешаем прерывание по обновлению (в данном случае -
   * по переполнению) счётчика таймера TIM6.
   */
  TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
  /* Включаем таймер */
  TIM_Cmd(TIM6, ENABLE);

  /* Разрешаем обработку прерывания по переполнению счётчика
   * таймера TIM6. Так получилось, что это же прерывание
   * отвечает и за опустошение ЦАП.
   */
  NVIC_EnableIRQ(TIM6_DAC_IRQn);
}

void TIM6_DAC_IRQHandler()
{
  /* Так как этот обработчик вызывается и для ЦАП, нужно проверять,
   * произошло ли прерывание по переполнению счётчика таймера TIM6.
   */
  if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
  {
    /* Очищаем бит обрабатываемого прерывания */
    TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
    /* Инвертируем состояние светодиодов */
    GPIO_Write(GPIOC, GPIO_ReadOutputData(GPIOC) ^ (BLUE_LED | GREEN_LED));
  }
}

Я попробовал инициализацию структур порта и таймеров вытащить за мейн глобально. Но там посыпались другие ошибки...
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

29-ю строчку подними на 2 строки вверх, а 45-ю на 6
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

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

Сообщение Jman »

Ну да, порт тактируем до инита, и таймер так же.

Теперь посыпалось такое:

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

.\Objects\timer_example.axf: Error: L6218E: Undefined symbol TIM_ClearITPendingBit (referred from main.o).
.\Objects\timer_example.axf: Error: L6218E: Undefined symbol TIM_Cmd (referred from main.o).
.\Objects\timer_example.axf: Error: L6218E: Undefined symbol TIM_GetITStatus (referred from main.o).
.\Objects\timer_example.axf: Error: L6218E: Undefined symbol TIM_ITConfig (referred from main.o).
.\Objects\timer_example.axf: Error: L6218E: Undefined symbol TIM_TimeBaseInit (referred from main.o).
.\Objects\timer_example.axf: Error: L6218E: Undefined symbol TIM_TimeBaseStructInit (referred from main.o).
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

[uquote="Jman",url="/forum/viewtopic.php?p=3234800#p3234800"]Ну да, порт тактируем до инита, и таймер так же.[/uquote]Нет. переменные должны быть объявлены до кодогенеррмрующих команд, а не где попадя.
А дальнейшие ошибки сообщают об остутствии функций которые вы вызываете. Тут уж вам надо найти где нужные библиотеки и подключить их.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

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

Сообщение Jman »

Спасибо, просто забыл в spl галочку в TIM установить.
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

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

Сообщение prinv »

Такая проблема: есть STM32VLDISCOVERY с МК STM32F100RBT6B, а также есть Pinboard II c МК STM32F103C8T6 (ситуация в обоих вариантах одинаковая). При HCLK больше 12-16МГц некоторые устройства с шиной I²С не работают. Обращаю внимание, что не все устройства себя так ведут. Например, работают на любой частоте микросхемы DS3231 и DS1307 и отваливаются при повышении частоты RDA5807M и MPU-6050.
В чём может быть дело? Изменение скорости I²С (100-400 КГц) влияния не оказывает.
Keil 5.24a, STM32CubeMX 4.23.0, HAL.
Никакая контра не уйдёт от нас
Hardegen
Родился
Сообщения: 16
Зарегистрирован: Вт мар 28, 2017 12:32:15

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

Сообщение Hardegen »

удалено
Аватара пользователя
sawa330
Встал на лапы
Сообщения: 136
Зарегистрирован: Пт дек 28, 2012 04:41:38

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

Сообщение sawa330 »

Други помоЖите кто чем может....!?
Есть код написанный под какие то библиотеки вот он

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

// Функция для реализации задержки 

void MT_Delay(uint32_t us)
{
volatile uint32_t i;
RCC_ClocksTypeDef rcc;

RCC_GetClocksFreq (&rcc);
i = (rcc.HCLK_Frequency/10000000)*us;

for (; i != 0; i—);
}
Мне требА это самое реализовать по под халловские библиотеки.... у самого чёт нибельмеса не получается... КЕЙЛИ 5 выдаёт ошибку
"идентификатор "RCC_ClocksTypeDef" неопределен RCC_ClocksTypeDef rcc;" - что в принципе правильно(библиотеки то не те...)
Попробовал повыдёргивать со своего "STM32F1xx_HAL_RCC_H" ничего не получилось. Лучшее что получилось это такая ошибка -

"78\78.axf: Error: L6218E: Undefined symbol RCC_OscInitStruct (referred from main.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map."

Помогите пожалуйста
вот часть моего файла "STM32F1xx_HAL_RCC_H"

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

/* Peripheral Control functions  ************************************************/
void              HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv);
void              HAL_RCC_EnableCSS(void);
void              HAL_RCC_DisableCSS(void);
uint32_t          HAL_RCC_GetSysClockFreq(void);
uint32_t          HAL_RCC_GetHCLKFreq(void);
uint32_t          HAL_RCC_GetPCLK1Freq(void);
uint32_t          HAL_RCC_GetPCLK2Freq(void);
void              HAL_RCC_GetOscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct);
void              HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef  *RCC_ClkInitStruct, uint32_t *pFLatency);



/** @defgroup RCC_System_Clock_Type System Clock Type
  * @{
  */
#define RCC_CLOCKTYPE_SYSCLK             0x00000001U /*!< SYSCLK to configure */
#define RCC_CLOCKTYPE_HCLK               0x00000002U /*!< HCLK to configure */
#define RCC_CLOCKTYPE_PCLK1              0x00000004U /*!< PCLK1 to configure */
#define RCC_CLOCKTYPE_PCLK2              0x00000008U /*!< PCLK2 to configure */

/**
  * @}
  */

/** @defgroup RCC_System_Clock_Source System Clock Source
  * @{
  */
#define RCC_SYSCLKSOURCE_HSI             RCC_CFGR_SW_HSI /*!< HSI selected as system clock */
#define RCC_SYSCLKSOURCE_HSE             RCC_CFGR_SW_HSE /*!< HSE selected as system clock */
#define RCC_SYSCLKSOURCE_PLLCLK          RCC_CFGR_SW_PLL /*!< PLL selected as system clock */

Аватара пользователя
AndTer
Поставщик валерьянки для Кота
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

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

Сообщение AndTer »

Банальная задержка.
Рассчитываем значение i, сколько должно быть "тиков" ядра, чтобы задержка была нужное количество миллисекунд. И дальше их "тикаем".
Найти в сети хал код на подобное и вставить в тело функции.
Вообще слабо представляю уровень программиста, который писал задержку путём полного загруза МК... Он ничего не может делать в это время. А если прерывание произойдёт? Задержка уплывёт... В общем... Может не стоит оно?
Глупый не задает вопросы. Глупый и так все знает.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

В HAL есть функция задержки. Называется HAL_Delay.
Аватара пользователя
AndTer
Поставщик валерьянки для Кота
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

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

Сообщение AndTer »

[uquote="Мурик",url="/forum/viewtopic.php?p=3244059#p3244059"]HAL_Delay[/uquote]
Только выдаёт она +/- километр. И ещё в добавок она делает задержку в миллисекундах.

В Keil можно написать так:

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

void MT_Delay(uint32_t us)
{
volatile uint32_t i;

i = (SystemCoreClock/10000000)*us;

for (; i != 0; i—);
}
Или так красивее и меньше переменных:

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

void MT_Delay(uint32_t us)
{
us = (SystemCoreClock / 10000000)*us;
while (us--) ;
} 
Но задержка будет неверная. Нельзя от неё ждать микросекунд. Процентов на 10-20 соврёт. Можно скорректировать путём измерения частоты на ножке МК. Делить не на 10000000, а например на 9000000.
Впрочем, если прерывания вылезут, то ещё больше уплывёт и это не скорректировать.

Делать стоит всё же на таймере.
Глупый не задает вопросы. Глупый и так все знает.
Аватара пользователя
sawa330
Встал на лапы
Сообщения: 136
Зарегистрирован: Пт дек 28, 2012 04:41:38

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

Сообщение sawa330 »

Спасибо! Будем пробовать.....
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Как сделать грамотно ассемблерную вставку ?
в общем, нагуглил, что есть такая полезная команда как CLZ в Cortex-M3, поиском по файликам не нашел и решали сделать сам.

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

uint8_t  __CLZ_MY(uint32_t __count)
{
   asm volatile ("clz r0, r0");
}

После того как сделал компилятор начал ругаться что она уже есть :facepalm: в intrinsics.h
но там только описание, саму реализацию так и не нашел.

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

/* Architecture v5T, CLZ is also available in Thumb mode for Thumb2 cores */
__ATTRIBUTES unsigned char __CLZ( unsigned long );
В общем как правильно вернуть параметр?
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="pokk",url="/forum/viewtopic.php?p=3245745#p3245745"]В общем как правильно вернуть параметр?[/uquote]
Найти в том же cmsis любую что-то возвращающую функцию использующую ассм вставки, их там предостаточно.
Ответить

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