Да согласен насчет синхронизации, забыл упомянуть что контроллер работает на 128МГц, немного больше чем ему положено и тактирование таймера происходит с этойже частотой и если завести на частотомер частоту 1ГГц то на МК после делителя будет частота 100МГц. На МК сигнал подводим на вывод TIM1_ETR, в моём камне это 33 ножка.
Да согласен насчет синхронизации, забыл упомянуть что контроллер работает на 128МГц, немного больше чем ему положено и тактирование таймера происходит с этойже частотой и если завести на частотомер частоту 1ГГц то на МК после делителя будет частота 100МГц. На МК сигнал подводим на вывод TIM1_ETR, в моём камне это 33 ножка.
Я также думал использовать TIM1_ETR. А с учетом 48МГц тактовой, и 4 МГц максимальной входной думаю ничего не должно конфликтовать
jeka_tm, а что не в дуне пишешь? Там весь частотометр на 10 строчек будет. И наверное есть смысл считать 32-битным таймером( вход TIM2_CH1_ETR) раз уж он там есть..
jeka_tm, я всё программирую в Arduino , совершенно лень изучать что-то ещё, когда всё и так устраивает :) (2) эта строчка просто ждёт результата - когда время задающий таймер остановится. (3) по идее Fmax=F_CPU/3 но там ещё делители есть, биты ETPS так что можно мерить до (F_CPU*8)/3
Внесу ясность: я не умею программировать STM, ну совсем: не понимаю в таймерах и т.д. Даташит читать не умею.
Iar использую потому что под нее была написана библиотека smletslib. Я ее пытался запустить под Keil, но выдало много ошибок, поэтому забил. Вообще мне эта библиотека понравилась потому она удобнее мне чем тот же Hal использовать (от его названий функций меня до сих пор коробит как вспомню), и знаком с автором, и могу задать вопросы.
Вообще мне Keil больше нравится, но скорее внешний вид, под удобству.
Но с учетом возможности программировать под Ардуино высока вероятность что в ней буду писать. Каждому свое, не нужно меня переубеждать, это выбор каждого, зачем усложнять себе жизнь. Я же не программист.
Если бы Dimax не помог я бы просто забил на частотомер раз сам не могу сделать. Все просто)
Я собрал его чтобы менять кварцы из наличия и проверить работу на разных частотах.
Возникла проблема. Используя следующий код:
#include <smcom/platform/stm32f030x4.hpp> // основная с нужным чипом
#include <smcom/platform/stm32/f0/mcu.hpp> // основная
#include <smcom/platform/stm32/f0/gpio.hpp> // для цифровых пинов
#include <LCD1202.cpp>
using mcu = Smcom::STM32::MCU<Smcom::STM32::MCUCommon::HSI_IN8_OUT48MHz>;
// Частотометр прямого счёта на stm32f030f4p6 вход PA0 или PA5
#define TIM2 ((TIM_TypeDef *) (APBPERIPH_BASE + 0x00000000UL))
#define F_CPU 48000000
uint32_t n1,n2,n3;
uint32_t frequency=0;
int main()
{
mcu::Init(); // инициализация МК
LCD_Init();
RCC->AHBENR |= 1<<17;// enable clock: pioa
RCC->APB2ENR |=1<<11; //enable clock: tim1
RCC->APB1ENR |=3; //enable clock: tim2,3
//GPIOA->MODER |= (1<<1) ; //PA0 Alternate function mode
//GPIOA->AFR[0] |= (1<<1); //af02 pa0
//или можно вход на PA5
GPIOA->MODER |= (1<<11) ; //PA5 Alternate function mode
GPIOA->AFR[0] |= (1<<21); //pa5 af02 Mode
TIM2->SMCR= (1<<14)|(0<<12)|(5<<0);// ECE, ETPS:00 ,TS:000(TIM1),SMS:101
TIM2->ARR=0xFFFFFFFF; //считать до максимума
TIM2->CR1|=(1<<0);//start timer2
uint16_t psc=1;
uint32_t tim_arr = F_CPU/10;// измерять 100мс
while ( (tim_arr/psc) > 65536) {psc++;}
TIM1->PSC=psc-1;//
TIM1->ARR=(tim_arr/psc)-1;
TIM1->CR1=(1<<3)|(1<<2);//один импульс, без прерываний
TIM1->CR2=(1<<4); //MMS:001 сигнал разрешения работы таймеру2
TIM1->CR1|=(1<<0);
while(1){
while (TIM1->CR1&1) {asm volatile("nop"); }
frequency=456859637;
//frequency=(TIM2->CNT) *10;
LCD_setXY(0, 10);
n1=frequency%1000;
frequency=frequency/1000;
n2=frequency%1000;
frequency=frequency/1000;
n3=frequency%1000;
LCD_print("Частотомер");
LCD_setXY(10, 20);
LCD_print_num(n3);
LCD_setXY(35, 20);
LCD_print_num(n2);
LCD_setXY(60, 20);
LCD_print_num(n1);
LCD_Update();
TIM2->CNT=0;
TIM1->CR1|=(1<<0);
}
}
Выводится число (вывод по тысячам специально делал)
frequency=456859637;
Но стоит раскомментировать строку
frequency=(TIM2->CNT) *10;
Выводится только текст, а там где должны быть числа вообще пусто. В настройках проекта также пробовал выставлять STM32F031F6, не помогло. Есть мысли куда копать?
В ИАРе стремный отладчик. В Кейле в твоем распоряжении вся периферия, память, регистры. Пишешь такую прогу
int main(){}
и запускаешь отладчик. Включаешь/выключаешь всё что тебе хочется.
В ИАР лучший отладчик. В любой момент без тормозов среды (!) имеешь доступ к любому регистру и можешь в любой момент изменить любой бит и это сразу будет изменено в процессоре. Очень удобно в том же таймере двинуть бит и посмотреть что измениться на выходе, не переписывая программу. В Кейле всё медленнее и печальнее, но тоже отлаживается нормально.
1. Среда Iar
2. Бесплатно. Нужен аналогичный кусок кода описанный в http://we.easyelectronics.ru/STM32/chastotomer-do-1ggc-na-stm32.html
3. Одноканальный до 4 мгц, от второго канала решил отказаться. Осциллографом посмотрю. На экране буду отображать частоту и полосу уровня сигнала
4. Время измерения 0,1-1 секунда например. По моим прикидкам и 0,1 с достаточно для допустимой точности
5. В наличии есть кварц 24Мгц, выше нет.
2. Бесплатно. Нужен аналогичный кусок кода описанный в http://we.easyelectronics.ru/STM32/chastotomer-do-1ggc-na-stm32.html
А чем не устраивает тот код?
5. В наличии есть кварц 24Мгц, выше нет.
На поиграться можно и на HSI разогнать системную до 64МГц.
не устраивает тот код?
У меня STM32f030F4P6. Или думаете что подойдет без переделки?
Разогнать можно, но думаю про кварц был поднят вопрос из-за необходимости точности временного интервала подсчета импульсов.
Там в любом случае пришлось бы дописывать :
Инит тактовой (да и не очевидно вообще какая системная тактовая и шин)
Драйвер LCD отсутствует, да и инита пинов нет - что куда , где сигнал...
Тайминги таймеров под свой кварц.
Нет майн.
Проверить на ляпы ибо на первый взгляд уже есть :
Ну и это как шаблон вообще...
Но есть хоть что-то в камментах:
Да согласен насчет синхронизации, забыл упомянуть что контроллер работает на 128МГц, немного больше чем ему положено и тактирование таймера происходит с этойже частотой и если завести на частотомер частоту 1ГГц то на МК после делителя будет частота 100МГц. На МК сигнал подводим на вывод TIM1_ETR, в моём камне это 33 ножка.
Инит тактовой уже есть 16 или 48 HSI. Шин не знаю, не разбираюсь. Использую библиотеку Axill.
Для начала на собранном макете с дисплеем хочу проверить. Драйвер LCD мне не нужен, я ногодрыгом прекрасно им управляю, уже писал с этим проблем нет.
Нужна инициализация таймеров через регистры и как считать измеренное значение.
Тогда лучше сразу определится: на данный момент будет 48мгцHSI, и от этого отталкиваться.
Но есть хоть что-то в камментах:
Да согласен насчет синхронизации, забыл упомянуть что контроллер работает на 128МГц, немного больше чем ему положено и тактирование таймера происходит с этойже частотой и если завести на частотомер частоту 1ГГц то на МК после делителя будет частота 100МГц. На МК сигнал подводим на вывод TIM1_ETR, в моём камне это 33 ножка.
Я также думал использовать TIM1_ETR. А с учетом 48МГц тактовой, и 4 МГц максимальной входной думаю ничего не должно конфликтовать
Драйвер LCD мне не нужен, я ногодрыгом прекрасно им управляю, уже писал с этим проблем нет.
Ногодрыг это тот же драйвер...
jeka_tm, а что не в дуне пишешь? Там весь частотометр на 10 строчек будет. И наверное есть смысл считать 32-битным таймером( вход TIM2_CH1_ETR) раз уж он там есть..
Блин похоже не получится, в корпусе TSSOP20 не выведен пин PA12, на котором TIM1_ETR (если конечно я правильно понял даташит)
jeka_tm, именно . А входа TIM2_CH1_ETR аж 2 штуки :)
jeka_tm, именно . А входа TIM2_CH1_ETR аж 2 штуки :)
И хде ?
И у каналов нет ETR ...
Хорошо. Ссылка на проект Iar с дисплеем: https://yadi.sk/d/h2Wy5BBBqSX2Kg
jeka_tm, именно . А входа TIM2_CH1_ETR аж 2 штуки :)
И хде ?
И у каналов нет ETR ...
Алексей... не грузи новичка...
ETR TIM2 там есть... и 24МГц кварца ему хватит... для 10МГц входной...
Да и ETR ему не нужен... обычного входа хватит... у него уже есть делитель на 128...
Блин похоже не получится, в корпусе TSSOP20 не выведен пин PA12, на котором TIM1_ETR (если конечно я правильно понял даташит)
Всё получится... ибо всё уже делалось и проверялось... и оно работало...
У кого получится?))) Говорю же я сам не смогу настроить таймеры
ssss , где увидеть? Или как всегда в мануалах на старшие в линейке?
Как ваше драгоценное?
У кого получится?))) Говорю же я сам не смогу настроить таймеры
Инит таймеров уже есть , осталось подогнать под свои частоты...
Вот тут A5021 проверил наличие 32-битного таймера TIM2
Хорошо. Ссылка на проект Iar с дисплеем: https://yadi.sk/d/h2Wy5BBBqSX2Kg
библиотека https://github.com/axillent/smletslib
Да как всегда...
=======
В последнее время... что-то не очень... старость подпирает... ((( Но "Не дождётесь!"(с)... )))))))))))
Вот тут A5021 проверил наличие 32-битного таймера TIM2
Дык... это ж я ему и сказал... )))))))
Но эта Фома неверующая... вместо чтобы референс прочитать... в опыты ударился... зато типа блеснул... ))))))))
Ну чудненько, а то у нас уже психоз с этим короновирусом.
Ага нашел в F031.
Тогда ткни плиз носом где переключалка для пина ETR<-> канал
Но эта Фома неверующая... вместо чтобы референс прочитать... в опыты ударился... зато типа блеснул... ))))))))
Не знал))
ssss, или у них тупо TIM2_CH1 и TIM2_ETR подключены к одному пину и нет переключалки?
ssss, или у них тупо TIM2_CH1 и TIM2_ETR подключены к одному пину и нет переключалки?
Пин один... а что и как... зависит от настроек таймера...
А, ну да .
Интересно, если канал как выход сконфигурен - на ETR с выхода прилетит?
jeka_tm, специально для тебя :)
Спасибо dimax. Вечером попробую после работы
dimax, что так все печально ?
jeka_tm, специально для тебя :)
stm32f030f4p6 программируешь в ардуино? Там же наверно пин только инициировать половину памяти съедает, uart оставшуюся. Или я ошибаюсь?
И еще вопросы:
1. Код скомпилировался, уже радует))
2. Нужно ли какую то фукнцию запускать для измерения, или это оно и есть:
3. Какое верхнее значение измеряемой частоты при тактовой 48МГц?
jeka_tm, я всё программирую в Arduino , совершенно лень изучать что-то ещё, когда всё и так устраивает :) (2) эта строчка просто ждёт результата - когда время задающий таймер остановится. (3) по идее Fmax=F_CPU/3 но там ещё делители есть, биты ETPS так что можно мерить до (F_CPU*8)/3
А как stm32f0 программировать? Что нужно поставить? Стандартного ядра для STMF103 хватит или еще какие то нюансы? Мне честно сказать iar не нравится.
jeka_tm, у меня стоит стандартный стм-мовский аддон https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json Там есть выбор stm32f030f4 demo board
Спасибо попробую. Спаял генератор на транзисторе и 4МГц кварце для проверки, он завелся на 3 гармонике
Думаю вы не так поняли. st-link у меня есть и 2 штуки. Я спрашивал как это делать в ардуино среде, а не вообще. Но все равно он почти черный квадрат))
Использую. Без него не смог бы дисплей запустить. Но использовать можно по разному. Я несколько переменных чтобы посмотреть
В ИАРе стремный отладчик. В Кейле в твоем распоряжении вся периферия, память, регистры. Пишешь такую прогу
int main(){}
и запускаешь отладчик. Включаешь/выключаешь всё что тебе хочется.
Внесу ясность: я не умею программировать STM, ну совсем: не понимаю в таймерах и т.д. Даташит читать не умею.
Iar использую потому что под нее была написана библиотека smletslib. Я ее пытался запустить под Keil, но выдало много ошибок, поэтому забил. Вообще мне эта библиотека понравилась потому она удобнее мне чем тот же Hal использовать (от его названий функций меня до сих пор коробит как вспомню), и знаком с автором, и могу задать вопросы.
Вообще мне Keil больше нравится, но скорее внешний вид, под удобству.
Но с учетом возможности программировать под Ардуино высока вероятность что в ней буду писать. Каждому свое, не нужно меня переубеждать, это выбор каждого, зачем усложнять себе жизнь. Я же не программист.
Если бы Dimax не помог я бы просто забил на частотомер раз сам не могу сделать. Все просто)
Спаял генератор на транзисторе и 4МГц кварце для проверки, он завелся на 3 гармонике
Да не нужен никакой генератор на транзисторе... Достаточно запустить любой свободный таймер в режиме PWM на самом МК...
И осваивайте железо на СТМ32... без него всё будет грустно...
Я собрал его чтобы менять кварцы из наличия и проверить работу на разных частотах.
Возникла проблема. Используя следующий код:
Выводится число (вывод по тысячам специально делал)
Но стоит раскомментировать строку
Выводится только текст, а там где должны быть числа вообще пусто. В настройках проекта также пробовал выставлять STM32F031F6, не помогло. Есть мысли куда копать?
А нет это я невнимательный, питание генератора не подключил. Работает)))
jeka_tm, Делай в ардуинеIDE :)
Поменял кварц на 24МГц, узнал предел частотомера:
Отличный запас с учетом необходимой 4МГц.
Всем спасибо, особенно Dimax, буду доводить до ума.
jeka_tm, Делай в ардуинеIDE :)
Попробую обязательно, уже пробовал скомпилировать.
В ИАРе стремный отладчик. В Кейле в твоем распоряжении вся периферия, память, регистры. Пишешь такую прогу
int main(){}
и запускаешь отладчик. Включаешь/выключаешь всё что тебе хочется.
В ИАР лучший отладчик. В любой момент без тормозов среды (!) имеешь доступ к любому регистру и можешь в любой момент изменить любой бит и это сразу будет изменено в процессоре. Очень удобно в том же таймере двинуть бит и посмотреть что измениться на выходе, не переписывая программу. В Кейле всё медленнее и печальнее, но тоже отлаживается нормально.