Программирование 32-х разрядных МК

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

1. Среда Iar

2. Бесплатно. Нужен аналогичный кусок кода описанный в http://we.easyelectronics.ru/STM32/chastotomer-do-1ggc-na-stm32.html

3. Одноканальный до 4 мгц, от второго канала решил отказаться. Осциллографом посмотрю. На экране буду отображать частоту и полосу уровня сигнала

4. Время измерения 0,1-1 секунда например. По моим прикидкам и 0,1 с достаточно для допустимой точности

5. В наличии есть кварц 24Мгц, выше нет.

dosikus
Offline
Зарегистрирован: 11.03.2017

jeka_tm пишет:

 

2. Бесплатно. Нужен аналогичный кусок кода описанный в http://we.easyelectronics.ru/STM32/chastotomer-do-1ggc-na-stm32.html

 

 

А чем не устраивает тот код?

dosikus
Offline
Зарегистрирован: 11.03.2017

jeka_tm пишет:

 

5. В наличии есть кварц 24Мгц, выше нет.

 

На поиграться можно и на HSI  разогнать системную до 64МГц.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

dosikus пишет:

не устраивает тот код?

У меня STM32f030F4P6. Или думаете что подойдет без переделки?

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

dosikus
Offline
Зарегистрирован: 11.03.2017

Там в любом случае пришлось бы дописывать :

Инит тактовой (да и не очевидно вообще какая системная тактовая и шин)

Драйвер LCD отсутствует, да и инита пинов нет - что куда , где сигнал...

Тайминги таймеров под свой кварц.

Нет майн.

Проверить на ляпы ибо на первый взгляд уже есть :

TIM1->ARR = 50000;             
TIM3->ARR = 2000;                             

Ну и это как шаблон вообще...

dosikus
Offline
Зарегистрирован: 11.03.2017

Но есть хоть что-то в камментах:

Да согласен насчет синхронизации, забыл упомянуть что контроллер работает на 128МГц, немного больше чем ему положено и тактирование таймера происходит с этойже частотой и если завести на частотомер частоту 1ГГц то на МК после делителя будет частота 100МГц. На МК сигнал подводим на вывод TIM1_ETR, в моём камне это 33 ножка.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Инит тактовой уже есть 16 или 48 HSI. Шин не знаю, не разбираюсь. Использую библиотеку Axill.

Для начала на собранном макете с дисплеем хочу проверить. Драйвер LCD мне не нужен, я ногодрыгом прекрасно им управляю, уже писал с этим проблем нет. 

Нужна инициализация таймеров через регистры и как считать измеренное значение.

Тогда лучше сразу определится: на данный момент будет 48мгцHSI, и от этого отталкиваться.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

dosikus пишет:

Но есть хоть что-то в камментах:

Да согласен насчет синхронизации, забыл упомянуть что контроллер работает на 128МГц, немного больше чем ему положено и тактирование таймера происходит с этойже частотой и если завести на частотомер частоту 1ГГц то на МК после делителя будет частота 100МГц. На МК сигнал подводим на вывод TIM1_ETR, в моём камне это 33 ножка.

Я также думал использовать TIM1_ETR. А с учетом 48МГц тактовой, и 4 МГц максимальной входной думаю ничего не должно конфликтовать

dosikus
Offline
Зарегистрирован: 11.03.2017

jeka_tm пишет:

 Драйвер LCD мне не нужен, я ногодрыгом прекрасно им управляю, уже писал с этим проблем нет. 

 

 

Ногодрыг это тот же драйвер...

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

jeka_tm, а что не в дуне пишешь? Там весь частотометр на 10 строчек  будет. И наверное есть смысл считать 32-битным таймером( вход TIM2_CH1_ETR) раз уж он там есть..

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Блин похоже не получится, в корпусе TSSOP20 не выведен пин PA12, на котором TIM1_ETR (если конечно я правильно понял даташит)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

jeka_tm, именно . А входа TIM2_CH1_ETR аж 2 штуки :)

dosikus
Offline
Зарегистрирован: 11.03.2017

dimax пишет:

jeka_tm, именно . А входа TIM2_CH1_ETR аж 2 штуки :)

 

И хде ?

И у каналов нет ETR ...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Хорошо. Ссылка на проект Iar с дисплеем: https://yadi.sk/d/h2Wy5BBBqSX2Kg

ssss
Offline
Зарегистрирован: 01.07.2016

dosikus пишет:

dimax пишет:

jeka_tm, именно . А входа TIM2_CH1_ETR аж 2 штуки :)

 

И хде ?

И у каналов нет ETR ...

Алексей... не грузи новичка...

ETR TIM2 там есть... и 24МГц кварца ему хватит... для 10МГц входной...

Да и ETR ему не нужен... обычного входа хватит... у него уже есть делитель на 128...

ssss
Offline
Зарегистрирован: 01.07.2016

jeka_tm пишет:

Блин похоже не получится, в корпусе TSSOP20 не выведен пин PA12, на котором TIM1_ETR (если конечно я правильно понял даташит)

Всё получится... ибо всё уже делалось и проверялось... и оно работало...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

У кого получится?))) Говорю же я сам не смогу настроить таймеры

dosikus
Offline
Зарегистрирован: 11.03.2017

ssss ,    где увидеть? Или как всегда в мануалах на старшие в линейке?

Как ваше драгоценное?

dosikus
Offline
Зарегистрирован: 11.03.2017

jeka_tm пишет:

У кого получится?))) Говорю же я сам не смогу настроить таймеры

 

Инит таймеров уже есть , осталось подогнать под свои частоты...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Вот тут A5021 проверил наличие 32-битного таймера TIM2

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

jeka_tm пишет:

Хорошо. Ссылка на проект Iar с дисплеем: https://yadi.sk/d/h2Wy5BBBqSX2Kg

библиотека https://github.com/axillent/smletslib

ssss
Offline
Зарегистрирован: 01.07.2016

Да как всегда...

=======

В последнее время... что-то не очень... старость подпирает... ((( Но "Не дождётесь!"(с)... )))))))))))

 

ssss
Offline
Зарегистрирован: 01.07.2016

jeka_tm пишет:

Вот тут A5021 проверил наличие 32-битного таймера TIM2

Дык... это ж я ему и сказал... )))))))

Но эта Фома неверующая... вместо чтобы референс прочитать... в опыты ударился... зато типа блеснул... ))))))))

dosikus
Offline
Зарегистрирован: 11.03.2017

 

Ну чудненько, а то у нас уже психоз с этим короновирусом.

Ага нашел в F031.

Тогда ткни плиз носом где переключалка для пина ETR<-> канал

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ssss пишет:

Но эта Фома неверующая... вместо чтобы референс прочитать... в опыты ударился... зато типа блеснул... ))))))))

Не знал))

dosikus
Offline
Зарегистрирован: 11.03.2017

ssss,   или у них тупо TIM2_CH1  и TIM2_ETR подключены к одному пину и нет переключалки?

ssss
Offline
Зарегистрирован: 01.07.2016

dosikus пишет:

ssss,   или у них тупо TIM2_CH1  и TIM2_ETR подключены к одному пину и нет переключалки?

Пин один... а что и как... зависит от настроек таймера...

dosikus
Offline
Зарегистрирован: 11.03.2017

А, ну да . 

Интересно, если канал как выход сконфигурен - на ETR с выхода прилетит?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

jeka_tm, специально для тебя :)


// Частотометр прямого счёта на stm32f030f4p6 вход PA0 или PA5 
#define TIM2   ((TIM_TypeDef *) (APBPERIPH_BASE + 0x00000000UL))
void setup() {
Serial1.setRx(PA10); Serial1.setTx(PA9);
Serial1.begin(9600); 
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);
}

void loop() {
while (TIM1->CR1&1) {asm volatile("nop");   }
Serial1.println( (TIM2->CNT) *10  );
TIM2->CNT=0;
TIM1->CR1|=(1<<0);
}
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Спасибо dimax. Вечером попробую после работы

dosikus
Offline
Зарегистрирован: 11.03.2017

dimax, что так все печально ?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

dimax пишет:

jeka_tm, специально для тебя :)

stm32f030f4p6 программируешь в ардуино? Там же наверно пин только инициировать половину памяти съедает, uart оставшуюся. Или я ошибаюсь?

И еще вопросы:

1. Код скомпилировался, уже радует))

2. Нужно ли какую то фукнцию запускать для измерения, или это оно и есть:

while (TIM1->CR1&1) {asm volatile("nop");

3. Какое верхнее значение измеряемой частоты при тактовой 48МГц?

 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

jeka_tm, я всё программирую в Arduino , совершенно лень изучать что-то ещё, когда всё и так устраивает :)    (2) эта строчка просто ждёт результата - когда время задающий таймер остановится. (3) по идее Fmax=F_CPU/3   но там ещё делители есть, биты ETPS так что можно мерить до (F_CPU*8)/3 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

А как stm32f0 программировать? Что нужно поставить? Стандартного ядра для STMF103 хватит или еще какие то нюансы? Мне честно сказать iar не нравится.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

jeka_tm, у меня стоит стандартный стм-мовский аддон https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json  Там есть выбор stm32f030f4 demo board 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

jeka_tm пишет:
А как stm32f0 программировать? Что нужно поставить? Стандартного ядра для STMF103 хватит или еще какие то нюансы? Мне честно сказать iar не нравится.
Кейл тебе в помощь. И разживись j-Link или st-Link, что бы смотреть на stm не как на черный квадрат.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Спасибо попробую. Спаял генератор на транзисторе и 4МГц кварце для проверки, он завелся на 3 гармонике

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Andy пишет:

jeka_tm пишет:
А как stm32f0 программировать? Что нужно поставить? Стандартного ядра для STMF103 хватит или еще какие то нюансы? Мне честно сказать iar не нравится.
Кейл тебе в помощь. И разживись j-Link или st-Link, что бы смотреть на stm не как на черный квадрат.

Думаю вы не так поняли. st-link у меня есть и 2 штуки. Я спрашивал как это делать в ардуино среде, а не вообще. Но все равно он почти черный квадрат))

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

jeka_tm пишет:
Но все равно он почти черный квадрат))
Это потому что ты st-link используешь не для отладки. Под отладчиком ты заходишь в stm, как к себе домой.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Andy пишет:

jeka_tm пишет:
Но все равно он почти черный квадрат))
Это потому что ты st-link используешь не для отладки. Под отладчиком ты заходишь в stm, как к себе домой.

Использую. Без него не смог бы дисплей запустить. Но использовать можно по разному. Я несколько переменных чтобы посмотреть

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

В ИАРе стремный отладчик. В Кейле в твоем распоряжении вся периферия, память, регистры. Пишешь такую прогу

int main(){}

и запускаешь отладчик. Включаешь/выключаешь всё что тебе хочется.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Внесу ясность: я не умею программировать STM, ну совсем: не понимаю в таймерах и т.д. Даташит читать не умею.

Iar использую потому что под нее была написана библиотека smletslib. Я ее пытался запустить под Keil, но выдало много ошибок, поэтому забил. Вообще мне эта библиотека понравилась потому она удобнее мне чем тот же Hal использовать (от его названий функций меня до сих пор коробит как вспомню), и знаком с автором, и могу задать вопросы.

Вообще мне Keil больше нравится, но скорее внешний вид, под удобству.

Но с учетом возможности программировать под Ардуино высока вероятность что в ней буду писать. Каждому свое, не нужно меня переубеждать, это выбор каждого, зачем усложнять себе жизнь. Я же не программист.

Если бы Dimax не помог я бы просто забил на частотомер раз сам не могу сделать. Все просто)

ssss
Offline
Зарегистрирован: 01.07.2016

jeka_tm пишет:

Спаял генератор на транзисторе и 4МГц кварце для проверки, он завелся на 3 гармонике

Да не нужен никакой генератор на транзисторе... Достаточно запустить любой свободный таймер в режиме PWM на самом МК... 

И осваивайте железо на СТМ32... без него всё будет грустно...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Я собрал его чтобы менять кварцы из наличия и проверить работу на разных частотах.

Возникла проблема. Используя следующий код:

#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, не помогло. Есть мысли куда копать?

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

А нет это я невнимательный, питание генератора не подключил. Работает)))

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

jeka_tm,  Делай в ардуинеIDE :)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Поменял кварц на 24МГц, узнал предел частотомера:

Отличный запас с учетом необходимой 4МГц.

Всем спасибо, особенно Dimax, буду доводить до ума. 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

dimax пишет:

jeka_tm,  Делай в ардуинеIDE :)

Попробую обязательно, уже пробовал скомпилировать.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Цитата:
Делай в ардуинеIDE :)
Каждый сам пц своему счастью. Arduo+asino=Arduino

nik182
Offline
Зарегистрирован: 04.05.2015

Andy пишет:

В ИАРе стремный отладчик. В Кейле в твоем распоряжении вся периферия, память, регистры. Пишешь такую прогу

int main(){}

и запускаешь отладчик. Включаешь/выключаешь всё что тебе хочется.

В ИАР лучший отладчик. В любой момент без тормозов среды (!) имеешь доступ к любому регистру и можешь в любой момент изменить любой бит и это сразу будет изменено в процессоре. Очень удобно в том же таймере двинуть бит и посмотреть что измениться на выходе, не переписывая программу. В Кейле всё медленнее и печальнее, но тоже отлаживается нормально.