M4 от M3 отличается незначительно, добавился FPU, DSP инструкции новичкам все равно не нужны, потому всю сложность привносит периферия и тут новые G0 уже могут быть сложнее F401, хоть они и M0+. Тот же F303 сложнее F401. OTG там USB или нет особо без разницы, все равно абсолютное большинство будет искать готовые либы, то же касается SDIO.
STM32 новичку в ARM что к чему
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3793802#p3793802"]F4 — это Cortex-M4. Я с ними вообще не работал полноценно ни разу, поэтому ничего сказать не могу. Но явно для новичка они - перебор! Начинать надо с простейших — STM32F0xx.[/uquote]
M4 от M3 отличается незначительно, добавился FPU, DSP инструкции новичкам все равно не нужны, потому всю сложность привносит периферия и тут новые G0 уже могут быть сложнее F401, хоть они и M0+. Тот же F303 сложнее F401. OTG там USB или нет особо без разницы, все равно абсолютное большинство будет искать готовые либы, то же касается SDIO.
M4 от M3 отличается незначительно, добавился FPU, DSP инструкции новичкам все равно не нужны, потому всю сложность привносит периферия и тут новые G0 уже могут быть сложнее F401, хоть они и M0+. Тот же F303 сложнее F401. OTG там USB или нет особо без разницы, все равно абсолютное большинство будет искать готовые либы, то же касается SDIO.
- Реклама
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
[uquote="Oxford",url="/forum/viewtopic.php?p=3793713#p3793713"]Ты же написал типо в F103 нету, твои слова. В 64 ногих тоже есть DAC. Проблема у тебя в голове просто, а не в F103[/uquote]
Ты не стесняйся, на скриншоте отметь где там ЦАП.
Либо формулируй свои высказывания более однозначно, особенно когда говоришь о не-типичных случаях. Потому что под f103 практически всегда понимают именно f103c8t6, зачастую даже не сам контроллер, а отладочную плату вроде bluepill, на которой он установлен.
Ты не стесняйся, на скриншоте отметь где там ЦАП.
Либо формулируй свои высказывания более однозначно, особенно когда говоришь о не-типичных случаях. Потому что под f103 практически всегда понимают именно f103c8t6, зачастую даже не сам контроллер, а отладочную плату вроде bluepill, на которой он установлен.
А переподключение по методу vusb не работает? Прижать обе ноги к земле и подождать 20 мс если мне не изменяет память.Eddy_Em писал(а):И какой-то идиот его намертво там поставил! Т.е. для переподключения надо физически USB дергать... Офигеть, как удобно во время отладки!
А, меня уже опередилиWiseLord писал(а):В итоге решил проблему небольшим изменением в коде.
- Сообщения: 791
- Зарегистрирован: Вт июн 17, 2014 00:34:26
Народ подскажите чё за фигня - STM32F103C8T6 - TIM2 не хочет считать от внешнего входа - подаю с TIM1 PWM4 (PA11) 100 kHz на внешний вход TIM2 - PA0, ни в какую:
Даже не входит в прерывание, другие прерывания работают. Пробовал на 2-х чипах - одинаковый эффект - не считает от внешнего входа. Пробовал подавать внутренний клок - считает, в прерывание попадает, светодиод мигает, от внешнего входа - ни в какую
Добавлено after 3 hours 42 minutes 23 seconds:
Ставлю TIM2->SMCR = 0 - работает, ставлю TIM2->SMCR = TIM_SMCR_ECE - глухо. Проверяю анализатором - с TIM1 идёт клок 100 кГц, а TIM2 не работает.
Добавлено after 49 minutes 2 seconds:
Короче разобрался - в проге был включён ремап счётного входа TIM2 с PA1 на PA15, слона то я и не заметил
Ну всего то делов - раз 20 пролистал Reference manual, аппноты, почитал в инете чего народ пишет по таймерам.
Всем спасибо, все свободны.
Спойлер
Код: Выделить всё
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // TIM2 clock enabled
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN | // Enabled Alternate Function I/O clock
RCC_APB2ENR_IOPAEN; // Enabled Clock GPIO A
GPIOA->CRL = GPIO_CRL_CNF0_0; // PA0 - TIM2_ETR External Clock - Floating input
TIM2->CR1 = 0; // TIM2 disabled
TIM2->CR2 = 0;
TIM2->CNT = 0; // TIM2 counter
TIM2->PSC = 0; // TIM2 prescaler clock;
TIM2->ARR = 0xFFFF; // TIM2 auto-reload register
TIM2->SMCR = TIM_SMCR_SMS_0|TIM_SMCR_SMS_1|TIM_SMCR_SMS_2 | - SMS = 0b111 - External Clock Mode
TIM_SMCR_TS_2 | TIM_SMCR_TS_1 |
TIM_SMCR_ECE; // External clock enable
TIM2->DIER = TIM_DIER_UIE; // Update interrupt enable // разрешить прерывания
NVIC_EnableIRQ (TIM2_IRQn); // Enable TIM2 Interrupt
NVIC_SetPriority (TIM2_IRQn, 9); // set Priority for Cortex-M0 System Interrupts
TIM2->CR1 |= TIM_CR1_CEN; // Counter enabled
__enable_irq(); // Enable Interrupt
LED_Y_Off;Спойлер
Код: Выделить всё
void TIM2_IRQHandler (void)
{
LED_Y_On;
if(TIM2->SR & TIM_SR_UIF) // Check Update interrupt flag
{
TIM2->SR = ~TIM_SR_UIF; // Clear Update interrupt flag
}
}Ставлю TIM2->SMCR = 0 - работает, ставлю TIM2->SMCR = TIM_SMCR_ECE - глухо. Проверяю анализатором - с TIM1 идёт клок 100 кГц, а TIM2 не работает.
Добавлено after 49 minutes 2 seconds:
Короче разобрался - в проге был включён ремап счётного входа TIM2 с PA1 на PA15, слона то я и не заметил
Всем спасибо, все свободны.
Хорошему коту и в декабре - март 
Вопросик по STM32F103C8T6 - я вывожу в коде:
переменную в порт - в самом младшем разряде РА0 частота 1,8 МГц - это при 72 МГц тактовой. Так мало? Или это нормально?
Код: Выделить всё
u16 u;
while(1)
{
GPIOA->ODR = u++;
}Хорошему коту и в декабре - март 
- Реклама
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
20 тактов на цикл. Многовато. Включить оптимизацию и смотреть листинг.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3797023#p3797023"]20 тактов на цикл. Многовато.[/uquote]
Спасибо. Еще вопрос - какую max частоту можно получить с ШИМа на STM32F103C8T6 при 72 Мгц тактовой? У меня получилось 36 МГц.
Или как-то можно вывести 72 МГц?
Спасибо. Еще вопрос - какую max частоту можно получить с ШИМа на STM32F103C8T6 при 72 Мгц тактовой? У меня получилось 36 МГц.
Код: Выделить всё
TIM1->PSC = 0;
TIM1->ARR = 1;Хорошему коту и в декабре - март 
ARR определяет частоту. Поэтому никак.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
[uquote="Frogfot",url="/forum/viewtopic.php?p=3797063#p3797063"]Или как-то можно вывести 72 МГц?[/uquote]
Нельзя. Сами подумайте: на один бит надо дернуть SCK сначала к 1, потом к 0. А за один такт вы успеете сделать либо то, либо другое.
Нельзя. Сами подумайте: на один бит надо дернуть SCK сначала к 1, потом к 0. А за один такт вы успеете сделать либо то, либо другое.
2 Oxford, COKPOWEHEU: спасибо, значит, я думал правильно.
Добавлено after 16 minutes 28 seconds:
Народ, ещё вопрос - как для STM32 для Keil разместить подпрограмму из FLASH в RAM?
Добавлено after 5 hours 49 minutes 52 seconds:
[uquote="VladislavS",url="/forum/viewtopic.php?p=3797023#p3797023"]20 тактов на цикл. Многовато.[/uquote]
Попробовал через пинать порт через DMA - завёл в памяти массив 256 байт, заполнил его значениями от 0 до 0xFF и вывожу в порт - в самом младшем разряде порта частота примерно 3.4 МГц - т.е. при 2-х пинках на период DMA гонит данные примерно 6.8 МГц - т.е. около 10-11 тактов на на 1 пинок. В самом старшем (8-м) - 26.8 кГц. Осцила нет, меряю анализатором Selao.
Добавлено after 16 minutes 28 seconds:
Народ, ещё вопрос - как для STM32 для Keil разместить подпрограмму из FLASH в RAM?
Добавлено after 5 hours 49 minutes 52 seconds:
[uquote="VladislavS",url="/forum/viewtopic.php?p=3797023#p3797023"]20 тактов на цикл. Многовато.[/uquote]
Попробовал через пинать порт через DMA - завёл в памяти массив 256 байт, заполнил его значениями от 0 до 0xFF и вывожу в порт - в самом младшем разряде порта частота примерно 3.4 МГц - т.е. при 2-х пинках на период DMA гонит данные примерно 6.8 МГц - т.е. около 10-11 тактов на на 1 пинок. В самом старшем (8-м) - 26.8 кГц. Осцила нет, меряю анализатором Selao.
Хорошему коту и в декабре - март 
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Ваш пример. 8 тактов на цикл - 4.5 МГц.
Если пожертвовать скважностью, 10 тактов на цикл - 7.2 МГц
Если подравнять скважность, то 12 тактов на цикл - 6 МГц.
Добавлено after 18 minutes 52 seconds:
На короткой последовательности можно ещё чуть выжать. Но это неспортивно.
Код: Выделить всё
for(uint32_t i;;)
{
GPIOA->ODR=i++;
}
Код: Выделить всё
LDR.N R1,??main_0 ;; 0x4001080c
??main_1:
STR R0,[R1, #+0]
ADDS R0,R0,#+1
B.N ??main_1
Спойлер
Код: Выделить всё
for(GPIO::PA_1 pin;;)
{
pin=1;
pin=0;
}Код: Выделить всё
MOV R0,#+131072
LDR.N R1,??main_0 ;; 0x40010810
MOV R2,#+131074
??main_1:
STR R2,[R1, #+0]
STR R0,[R1, #+0]
B.N ??main_1
Спойлер
Код: Выделить всё
for(GPIO::PA_0 pin;;)
{
pin=1;
__NOP(); __NOP();
pin=0;
}
Спойлер
На короткой последовательности можно ещё чуть выжать. Но это неспортивно.
Спойлер
Код: Выделить всё
void Dryg()
{
GPIO::PA_0::set();
__NOP();
GPIO::PA_0::clear();
__NOP();
}
int main()
{
for(;;)
{
Repeat<Dryg,50>();
}
}
Код: Выделить всё
main:
MOV R0,#+65536
LDR.N R1,??DataTable1 ;; 0x40010810
MOVS R2,#+1
??main_0:
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
STR R2,[R1, #+0]
Nop
STR R0,[R1, #+0]
Nop
B.N ??main_0
[uquote="VladislavS",url="/forum/viewtopic.php?p=3798142#p3798142"]Ваш пример. 8 тактов на цикл - 4.5 МГц.[/uquote]
Благодарствую, вот оказывается, как много всего я ещё не знал
В перспективе присматриваюсь к формированию VGA с МК - типа чтобы грузонуть МК по самые помидоры. Ну, может не на этом - STM32F103C8T6, а на 103-м, только с 64 кБ ОЗУ, или же на более шустром - "Black Pils" - STM32F401/411, или другом М4/М7.
Благодарствую, вот оказывается, как много всего я ещё не знал
В перспективе присматриваюсь к формированию VGA с МК - типа чтобы грузонуть МК по самые помидоры. Ну, может не на этом - STM32F103C8T6, а на 103-м, только с 64 кБ ОЗУ, или же на более шустром - "Black Pils" - STM32F401/411, или другом М4/М7.
Хорошему коту и в декабре - март 
- Сообщения: 42
- Зарегистрирован: Сб янв 05, 2013 21:03:05
[uquote="Frogfot",url="/forum/viewtopic.php?p=3797063#p3797063"]Или как-то можно вывести 72 МГц?[/uquote]
На вывод PA8
Или можно вывести частоту кварца HSE, после PLL, ну и саму системную частоту SYSCLK.
На вывод PA8
Код: Выделить всё
void MCO_out (void){
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // enable clock for port A
GPIOA->CRH &= ~GPIO_CRH_CNF8_0; // setting out alternative push-pull for PA8
GPIOA->CRH |= GPIO_CRH_CNF8_1;
GPIOA->CRH |= (GPIO_CRH_MODE8_0 | GPIO_CRH_MODE8_1); // gpio speed 50 MHz
RCC->CFGR |= RCC_CFGR_MCO_SYSCLK ;// HSE; PLL; SYSCLK; // select source clokc SYSCLK
}Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???
Подскажите новичку, почему не опускается ножка от прерывания по сравнению.
Инициализация stm32f0 tim3:
Обработчик прерывания:
Инициализация stm32f0 tim3:
Код: Выделить всё
Brightness = 100;
NVIC_EnableIRQ(TIM3_IRQn);
TIM3->PSC = 153;
TIM3->ARR = 255;
TIM3->DIER |= TIM_DIER_UIE //*!<Update interrupt enable */
| TIM_DIER_CC1IE; //*!<Capture/Compare 1 interrupt enable */
TIM3->CCR1 = Brightness; //*!< TIM capture/compare register 1, */
TIM3->CR1 |= TIM_CR1_CEN; Код: Выделить всё
void TIM3_IRQHandler (void)
{
if(TIM3->SR & TIM_SR_UIF == TIM_SR_UIF){
TIM3->SR = 0;
GPIOA->BSRR |= BS(10); // поднимим ножку
}
if(TIM3->SR & TIM_SR_CC1IF == TIM_SR_CC1IF){
TIM3->SR =0;
GPIOA->BSRR |= BR(10); //опустим ножку
}
}У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Чтение BSRR влияет на настройку таймера или на поднятие флага TIM_SR_CC1IF?
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
И еще, сбрасывайте тот флаг, который обрабатываете, а не все. это по поводу строчки: TIM3->SR =0; лучше TIM3->SR &= ~TIM_SR_UIF;
А вообще, можно этот вывод сделать аппаратно и не нужно будет никаких прерываний.
А вообще, можно этот вывод сделать аппаратно и не нужно будет никаких прерываний.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Там всего ~1220 прерываний в секунду и CCR1 установлен на середину счета таймера, друг другу они мешать не должны.И еще, сбрасывайте тот флаг, который обрабатываете..
TIM3->SR =0; сбросит все флаги(и TIM_SR_UIF), причем каждый сброс прописан в обработчике для своего флага.
Естественно, но я настраивал таймер для работы через прерывания.А вообще, можно этот вывод сделать аппаратно и не нужно будет никаких прерываний
TIM_SR_UIF по переполнению поднимается
TIM_SR_CC1IF по сравнению не поднимается
Вопрос у гуру: почему?
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
[uquote="passer_by",url="/forum/viewtopic.php?p=3800102#p3800102"]Или можно вывести частоту кварца HSE, после PLL, ну и саму системную частоту SYSCLK.[/uquote]
кварц 4-16mhz, Pll/2 выводиться, SYSCLK должен быть меньше или равно 50 mhz
кварц 4-16mhz, Pll/2 выводиться, SYSCLK должен быть меньше или равно 50 mhz
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
[uquote="RoboC",url="/forum/viewtopic.php?p=3800264#p3800264"]Чтение BSRR влияет на настройку таймера или на поднятие флага TIM_SR_CC1IF?[/uquote]
На таймер оно не влияет.
Но Вас не смущает то, что:
1) код "поднятия" и "опускания" ножки у Вас в обработчике абсолютно одинаковый, т.е., уже только одно это означает ошибку;
2) читать BSRR вообще нельзя, а Вы это в обоих случаях делаете?
На таймер оно не влияет.
Но Вас не смущает то, что:
1) код "поднятия" и "опускания" ножки у Вас в обработчике абсолютно одинаковый, т.е., уже только одно это означает ошибку;
2) читать BSRR вообще нельзя, а Вы это в обоих случаях делаете?


