Ребята, не могу найти характеристики ОУ в STM32, не подскажите, где взять? Надо амперметр сделать, падение на шунте 3-10мВ, вот и думаю, необходимо ли отдельный ОУ ставить, например, LM358 или встроенного хватит?
Заголовок сообщения: Re: STM32 новичку в ARM что к чему
Добавлено: Чт ноя 16, 2017 21:13:55
Мучитель микросхем
Карма: 4
Рейтинг сообщений: 15
Зарегистрирован: Ср янв 26, 2011 13:43:30 Сообщений: 414 Откуда: С того берега моря
Рейтинг сообщения:0
Привет ребята. Пробую тикать таймерами и использовать прерывания на 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>
/* Инициализируем базовый таймер: делитель 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)); } }
Я попробовал инициализацию структур порта и таймеров вытащить за мейн глобально. Но там посыпались другие ошибки...
_________________ - Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует!
Заголовок сообщения: Re: STM32 новичку в ARM что к чему
Добавлено: Чт ноя 16, 2017 21:29:49
Мучитель микросхем
Карма: 4
Рейтинг сообщений: 15
Зарегистрирован: Ср янв 26, 2011 13:43:30 Сообщений: 414 Откуда: С того берега моря
Рейтинг сообщения:0
Ну да, порт тактируем до инита, и таймер так же.
Теперь посыпалось такое:
Код:
.\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).
_________________ - Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует!
Нет. переменные должны быть объявлены до кодогенеррмрующих команд, а не где попадя. А дальнейшие ошибки сообщают об остутствии функций которые вы вызываете. Тут уж вам надо найти где нужные библиотеки и подключить их.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Заголовок сообщения: Re: STM32 новичку в ARM что к чему
Добавлено: Пт ноя 17, 2017 10:50:32
Мучитель микросхем
Карма: 4
Рейтинг сообщений: 15
Зарегистрирован: Ср янв 26, 2011 13:43:30 Сообщений: 414 Откуда: С того берега моря
Рейтинг сообщения:0
Спасибо, просто забыл в spl галочку в TIM установить.
_________________ - Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует!
Такая проблема: есть 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.
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"
Банальная задержка. Рассчитываем значение i, сколько должно быть "тиков" ядра, чтобы задержка была нужное количество миллисекунд. И дальше их "тикаем". Найти в сети хал код на подобное и вставить в тело функции. Вообще слабо представляю уровень программиста, который писал задержку путём полного загруза МК... Он ничего не может делать в это время. А если прерывание произойдёт? Задержка уплывёт... В общем... Может не стоит оно?
_________________ Глупый не задает вопросы. Глупый и так все знает.
Только выдаёт она +/- километр. И ещё в добавок она делает задержку в миллисекундах.
В 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. Впрочем, если прерывания вылезут, то ещё больше уплывёт и это не скорректировать.
Делать стоит всё же на таймере.
_________________ Глупый не задает вопросы. Глупый и так все знает.
Как сделать грамотно ассемблерную вставку ? в общем, нагуглил, что есть такая полезная команда как CLZ в Cortex-M3, поиском по файликам не нашел и решали сделать сам.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения