подробно расписано в AN4776 Application note General-purpose timer cookbookв чем принципиальное отличие external clock mode 1 от external clock mode 2
STM32 новичку в ARM что к чему
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: STM32 новичку в ARM что к чему
Спасибо!!!
- black_lizard
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вс сен 23, 2012 05:51:35
Re: STM32 новичку в ARM что к чему
Ребят. Подскажите, что я делаю не так. Пытаюсь инициализировать прерывания от ноги мк. Камень f103. Не переходит в обработчик.
Добавлено after 50 minutes 30 seconds:
Поправочка - прерывания заработали. Но только на GPIOA почему-то, на GPIOB никак не реагирует :c
Код: Выделить всё
//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));
}
Поправочка - прерывания заработали. Но только на GPIOA почему-то, на GPIOB никак не реагирует :c
Собираю самопальный мини-компьютер
Re: STM32 новичку в ARM что к чему
Ребята, не могу найти характеристики ОУ в STM32, не подскажите, где взять? Надо амперметр сделать, падение на шунте 3-10мВ, вот и думаю, необходимо ли отдельный ОУ ставить, например, LM358 или встроенного хватит?
- Fusion
- Грызет канифоль
- Сообщения: 272
- Зарегистрирован: Пт ноя 13, 2009 10:39:32
- Откуда: Москва
- Контактная информация:
Re: STM32 новичку в ARM что к чему
В даташите. Вот для 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
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 что к чему
Привет ребята. Пробую тикать таймерами и использовать прерывания на 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]
Re: STM32 новичку в ARM что к чему
29-ю строчку подними на 2 строки вверх, а 45-ю на 6
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- Jman
- Мучитель микросхем
- Сообщения: 414
- Зарегистрирован: Ср янв 26, 2011 13:43:30
- Откуда: С того берега моря
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Ну да, порт тактируем до инита, и таймер так же.
Теперь посыпалось такое:
Теперь посыпалось такое:
Код: Выделить всё
.\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]
Re: STM32 новичку в ARM что к чему
[uquote="Jman",url="/forum/viewtopic.php?p=3234800#p3234800"]Ну да, порт тактируем до инита, и таймер так же.[/uquote]Нет. переменные должны быть объявлены до кодогенеррмрующих команд, а не где попадя.
А дальнейшие ошибки сообщают об остутствии функций которые вы вызываете. Тут уж вам надо найти где нужные библиотеки и подключить их.
А дальнейшие ошибки сообщают об остутствии функций которые вы вызываете. Тут уж вам надо найти где нужные библиотеки и подключить их.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- Jman
- Мучитель микросхем
- Сообщения: 414
- Зарегистрирован: Ср янв 26, 2011 13:43:30
- Откуда: С того берега моря
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Спасибо, просто забыл в spl галочку в TIM установить.
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
- prinv
- Вымогатель припоя
- Сообщения: 677
- Зарегистрирован: Чт янв 20, 2011 09:07:08
- Откуда: Пермь
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Такая проблема: есть 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.
В чём может быть дело? Изменение скорости I²С (100-400 КГц) влияния не оказывает.
Keil 5.24a, STM32CubeMX 4.23.0, HAL.
Никакая контра не уйдёт от нас
Re: STM32 новичку в ARM что к чему
Други помоЖите кто чем может....!?
Есть код написанный под какие то библиотеки вот он
Мне требА это самое реализовать по под халловские библиотеки.... у самого чёт нибельмеса не получается... КЕЙЛИ 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"
Есть код написанный под какие то библиотеки вот он
Код: Выделить всё
// Функция для реализации задержки
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—);
}
"идентификатор "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 */
Re: STM32 новичку в ARM что к чему
Банальная задержка.
Рассчитываем значение i, сколько должно быть "тиков" ядра, чтобы задержка была нужное количество миллисекунд. И дальше их "тикаем".
Найти в сети хал код на подобное и вставить в тело функции.
Вообще слабо представляю уровень программиста, который писал задержку путём полного загруза МК... Он ничего не может делать в это время. А если прерывание произойдёт? Задержка уплывёт... В общем... Может не стоит оно?
Рассчитываем значение i, сколько должно быть "тиков" ядра, чтобы задержка была нужное количество миллисекунд. И дальше их "тикаем".
Найти в сети хал код на подобное и вставить в тело функции.
Вообще слабо представляю уровень программиста, который писал задержку путём полного загруза МК... Он ничего не может делать в это время. А если прерывание произойдёт? Задержка уплывёт... В общем... Может не стоит оно?
Глупый не задает вопросы. Глупый и так все знает.
Re: STM32 новичку в ARM что к чему
В HAL есть функция задержки. Называется HAL_Delay.
Re: STM32 новичку в ARM что к чему
[uquote="Мурик",url="/forum/viewtopic.php?p=3244059#p3244059"]HAL_Delay[/uquote]
Только выдаёт она +/- километр. И ещё в добавок она делает задержку в миллисекундах.
В Keil можно написать так:
Или так красивее и меньше переменных:
Но задержка будет неверная. Нельзя от неё ждать микросекунд. Процентов на 10-20 соврёт. Можно скорректировать путём измерения частоты на ножке МК. Делить не на 10000000, а например на 9000000.
Впрочем, если прерывания вылезут, то ещё больше уплывёт и это не скорректировать.
Делать стоит всё же на таймере.
Только выдаёт она +/- километр. И ещё в добавок она делает задержку в миллисекундах.
В 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--) ;
} Впрочем, если прерывания вылезут, то ещё больше уплывёт и это не скорректировать.
Делать стоит всё же на таймере.
Глупый не задает вопросы. Глупый и так все знает.
Re: STM32 новичку в ARM что к чему
Спасибо! Будем пробовать.....
Re: STM32 новичку в ARM что к чему
Как сделать грамотно ассемблерную вставку ?
в общем, нагуглил, что есть такая полезная команда как CLZ в Cortex-M3, поиском по файликам не нашел и решали сделать сам.
После того как сделал компилятор начал ругаться что она уже есть
в intrinsics.h
но там только описание, саму реализацию так и не нашел.
В общем как правильно вернуть параметр?
в общем, нагуглил, что есть такая полезная команда как CLZ в Cortex-M3, поиском по файликам не нашел и решали сделать сам.
Код: Выделить всё
uint8_t __CLZ_MY(uint32_t __count)
{
asm volatile ("clz r0, r0");
}
После того как сделал компилятор начал ругаться что она уже есть
но там только описание, саму реализацию так и не нашел.
Код: Выделить всё
/* Architecture v5T, CLZ is also available in Thumb mode for Thumb2 cores */
__ATTRIBUTES unsigned char __CLZ( unsigned long );Re: STM32 новичку в ARM что к чему
[uquote="pokk",url="/forum/viewtopic.php?p=3245745#p3245745"]В общем как правильно вернуть параметр?[/uquote]
Найти в том же cmsis любую что-то возвращающую функцию использующую ассм вставки, их там предостаточно.
Найти в том же cmsis любую что-то возвращающую функцию использующую ассм вставки, их там предостаточно.


[/url