STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Frogfot
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Re: STM32 новичку в ARM что к чему

Сообщение Frogfot »

[uquote="Frogfot",url="/forum/viewtopic.php?p=3797063#p3797063"]Или как-то можно вывести 72 МГц?
На вывод PA8[/uquote]
Бдагодарю, буду знать.

Добавлено after 5 minutes 9 seconds:
Ещё вопросик знатокам - делаю захват значений таймера TIM4 CH4 по внешнему входу PB9 - захваты есть, прерывания идут, но читаю из TIM4->CCR4 и TIM4->CCR3 одни нули. Код инициализации:
Спойлер

Код: Выделить всё

RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;  // Enabled Clock TIM4
   
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN | // Enabled Alternate Function I/O clock
                   RCC_APB2ENR_IOPAEN | // Enabled Clock GPIO A
                  RCC_APB2ENR_IOPBEN | // Enabled Clock GPIO B
                   RCC_APB2ENR_IOPCEN | // Enabled Clock GPIO C
                  RCC_APB2ENR_TIM1EN;  // Enabled Clock TIM1

GPIOB->CRH = GPIO_CRH_CNF9_0;  // PB9  - TIM4/CH4   - Floatinh Input

TIM4->CR1   = 0; // Counter stopped
TIM4->CR2   = 0;
TIM4->PSC   = 36-1; // Input Clock Prescaller - 36 MHz
TIM4->ARR   = 0xFFFF; // TIM4 auto-reload register
TIM4->CCMR1 = 0;
TIM4->CCMR2 = TIM_CCMR2_OC3M_1 | // CC3 channel is configured as input, IC3 is mapped on TI4
            TIM_CCMR2_CC4S_0;  // CC4 channel is configured as input, IC4 is mapped on TI4
TIM4->CCER  = TIM_CCER_CC3E | // Capture 3 enable
                        TIM_CCER_CC4E;  // Capture 4 enable
TIM4->DIER = TIM_DIER_CC3IE | // Capture 3 interrupt enable
                TIM_DIER_CC4IE;  // Capture 4 interrupt enable

NVIC_SetPriority(TIM4_IRQn, 9);
NVIC_EnableIRQ(TIM4_IRQn); // Enable TIM4 Interrupt
      
TIM4->CR1 |= TIM_CR1_CEN;  // Counter enabled


Добавлено after 2 hours 40 minutes 37 seconds:
Обработчик прерывания:
Спойлер

Код: Выделить всё


// ----------
void TIM4_IRQHandler (void) // Capture 3, 4 interrupt Flag
{
static u8 CntCCR3=0;
if(TIM4->SR & TIM_SR_CC3IF) // Check Capture 3 interrupt Flag
  {
    TIM4->SR = ~TIM_SR_CC3IF; // Clear Capture 3 interrupt Flag
     if (CntCCR3 <  16) BufCapture3[CntCCR3++] = TIM4->CCR3;
     else if (CntCCR3 >= 16)
    {
   TIM4->CR1 &= ~TIM_CR1_CEN; // Counter disabled
   MakeScreenTIM4();
    }
  }
}
Хорошему коту и в декабре - март :)
Frogfot
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Re: STM32 новичку в ARM что к чему

Сообщение Frogfot »

Сам нашёл косяк - напутал с определением битов - для 3-го канала поставил бит от компара вместо каптура:

Код: Выделить всё

TIM4->CCMR2 = TIM_CCMR2_OC3M_1 | // CC3 channel is configured as input, IC3 is mapped on TI4
            TIM_CCMR2_CC4S_0;  // CC4 channel is configured as input, IC4 is mapped on TI4
Хорошему коту и в декабре - март :)
Lum1noFor
Открыл глаза
Сообщения: 65
Зарегистрирован: Ср сен 24, 2014 12:30:09

Re: STM32 новичку в ARM что к чему

Сообщение Lum1noFor »

Друзья, у кого-нибудь есть макетка STM32F3 Discovery? Свою в 2018 последний раз использовал, а сейчас включаю - не работает ни одна моя программа. Как я выяснил, не заводится ни один осциллятор - ни внешний кварц на 8 МГц, ни внутренний HSI. При этом демо-программа мигалка от ST исправно работает от внешнего кварца. Варианта тут два - или я разучился и что-то забыл, или мой компилятор что-то мозги парит. Компилятор MikroC. Внизу прикрепляю скомпилированный своим компилятором hex - кто-нибудь может попробовать зашить в свою макетку (должен стоять внешний кварц X2)?

Код: Выделить всё

void main() {

RCC_AHBENRbits.IOPAEN = 1; // Enable all ports
RCC_AHBENRbits.IOPBEN = 1;
RCC_AHBENRbits.IOPCEN = 1;
RCC_AHBENRbits.IOPEEN = 1;
RCC_AHBENRbits.IOPEEN = 1;
RCC_AHBENRbits.IOPDEN = 1;

GPIOE_MODERbits.MODER8           = 0b01; // Output
GPIOE_OTYPERbits.OT8             = 0b00; // Push-Pull
GPIOE_OSPEEDRbits.OSPEEDR8       = 0b11; // High speed

GPIOE_MODERbits.MODER15           = 0b01; // Output
GPIOE_OTYPERbits.OT15             = 0b00; // Push-Pull
GPIOE_OSPEEDRbits.OSPEEDR15       = 0b11; // High speed

while (1) {

GPIOE_ODRbits.ODR8 = 1;
GPIOE_ODRbits.ODR15 = 1;

Delay_ms(1000);

GPIOE_ODRbits.ODR8 = 0;
GPIOE_ODRbits.ODR15 = 0;

Delay_ms(1000);

}

}
Вложения
Clock.jpg
(136.7 КБ) 272 скачивания
TEST.hex
(3.33 КБ) 275 скачиваний
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение WiseLord »

А где в самом коде вся эта настройка тактирования, множителей и т.п.?
Feruz
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс май 03, 2015 15:05:58

Re: STM32 новичку в ARM что к чему

Сообщение Feruz »

Здравствуйте! Разрешите ворваться в тему с вопросом по SPI STM32F103C8.
В одной из веток на форуме я задавал вопрос по SI4463, но проблема оказалась в SPI (https://www.radiokot.ru/forum/viewtopic ... 6#p3785086)
Проблема в том, что CS поднимается раньше чем закончилась транзакция по SPI.

Настройка:

Код: Выделить всё

   //SPI registers
   SPI1->CR1 |= SPI_CR1_BR;                  //clock/256
   SPI1->CR1 |= SPI_CR1_SSM;
   SPI1->CR1 |= SPI_CR1_SSI;   
   SPI1->CR1 |= SPI_CR1_MSTR;              //master mode
   SPI1->CR1 &= ~SPI_CR1_CPOL;               //SCK = 0 in IDLE
   SPI1->CR1 &= ~SPI_CR1_CPHA;               //first rising edge capture
   SPI1->CR1 |= SPI_CR1_SPE;                  //enable spi   


Транзакция:

Код: Выделить всё

//SPI transaction
uint8_t spi_trx(uint8_t to_send) //transmit and receive 1 byte (no CS management)
{
   while(!(SPI1->SR & SPI_SR_TXE)){} //while TXE bit = 0
   SPI1->DR = to_send;
   while(!(SPI1->SR & SPI_SR_RXNE)){}   //while RXNE = 0   
   
   while(!(SPI1->SR & SPI_SR_TXE)){} //RM 25.3.8
   while(SPI1->SR & SPI_SR_BSY){}    //RM 25.3.8
   
   return SPI1->DR;
}   


Использование:

Код: Выделить всё

m_cs_active
spi_trx(SI4463_CMD_REQUEST_DEVICE_STATE);   
spi_trx(SI4463_BYTE_DUMMY);
m_cs_inactive



Не смотря на ожидание флагов TXE и BSY согласно п. 25.3.8 референс мануала, чип селект упорно поднимается раньше на 1/4 тактового сигнала (см. прикрепление).
Вложения
Снимок.PNG
(18.18 КБ) 309 скачиваний
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

Feruz, а если делитель на SPI сделать меньше 64?
Хотя судя по скрину работать все равно должно, CS поднимается после фронта по которому идет захват...
Lum1noFor
Открыл глаза
Сообщения: 65
Зарегистрирован: Ср сен 24, 2014 12:30:09

Re: STM32 новичку в ARM что к чему

Сообщение Lum1noFor »

А где в самом коде вся эта настройка тактирования, множителей и т.п.?



Микроси автоматически вставляет в итоговый хекс те настройки, которые указываешь в свойствах проекта. Скриншот есть во вложении. Здесь не нужно отдельно настраивать тактирование.

Попробовал вручную указать настройки тактирования - все равно не работает. Внешний кварц не заводится. При этом, подчеркиваю, мигалка-прошивка от ST работает и кварц заводится! Из чего я делаю вывод, что что-то не так именно с программой.

Код: Выделить всё

void main() {

RCC_CRbits.HSION = 1;
RCC_CRbits.PLLON = 0;
RCC_CRbits.CSSON = 0;
RCC_CRbits.HSEBYP = 0;
RCC_CRbits.HSEON = 1;

RCC_CFGR  = 0x0;
RCC_CFGR2 = 0x00000000;

while (1) {

}

}
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Не смотря на ожидание флагов TXE и BSY согласно п. 25.3.8 референс мануала, чип селект упорно поднимается раньше на 1/4 тактового сигнала (см. прикрепление).
Поднимайте CS после RXNE.

Микроси автоматически вставляет в итоговый хекс те настройки, которые указываешь в свойствах проекта.
В топку такую среду разработки. Ну есть же вменяемые тулчейны, где абсолютно всё под контролем программиста.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

Поднимайте CS после RXNE.

Он проверяет даже больше необходимого, проблема в другом. Если менять делители для SPI и замерять время между фронтом защелкивающим данные на SCK и поднятием NSS, то оно не меняется, т.е. SPI считает этот фронт окончанием передачи. При относительно небольших делителях все нормально, но если делитель порядка 64 и больше, то уже могут быть проблемы, т.к. фиксированной задержки перед NSS начинает не хватать и он поднимается в середине последнего периода.
DimAlt
Вымогатель припоя
Сообщения: 576
Зарегистрирован: Пт май 19, 2006 05:39:11
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение DimAlt »

Feruz а так пробовали?

Код: Выделить всё

uint8_t spi_trx(uint8_t to_send)
{
//  while((SPI1->SR & SPI_SR_TXE)==0);//ждать освобождения буфера на передачу
    while(SPI1->SR & SPI_SR_BSY);//ждать окончания передачи   
   
    SPI1->DR = to_send;   //запустить передачу байта

    while((SPI1->SR & SPI_SR_RXNE)==0);//ждать "Receive buffer Not Empty" окончание приема
    return  SPI1->DR;//clear SPI_SR_RXNE flag

}
Feruz
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс май 03, 2015 15:05:58

Re: STM32 новичку в ARM что к чему

Сообщение Feruz »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3803769#p3803769"]Поднимайте CS после RXNE.

Он проверяет даже больше необходимого, проблема в другом. Если менять делители для SPI и замерять время между фронтом защелкивающим данные на SCK и поднятием NSS, то оно не меняется, т.е. SPI считает этот фронт окончанием передачи. При относительно небольших делителях все нормально, но если делитель порядка 64 и больше, то уже могут быть проблемы, т.к. фиксированной задержки перед NSS начинает не хватать и он поднимается в середине последнего периода.[/uquote]

Все верно, когда частота SPI достаточно высока, тогда все нормально и клоки успевают закончится до подъема чип селекта.

Добавлено after 1 minute 27 seconds:
Feruz а так пробовали?

Код: Выделить всё

uint8_t spi_trx(uint8_t to_send)
{
//  while((SPI1->SR & SPI_SR_TXE)==0);//ждать освобождения буфера на передачу
    while(SPI1->SR & SPI_SR_BSY);//ждать окончания передачи   
   
    SPI1->DR = to_send;   //запустить передачу байта

    while((SPI1->SR & SPI_SR_RXNE)==0);//ждать "Receive buffer Not Empty" окончание приема
    return  SPI1->DR;//clear SPI_SR_RXNE flag

}


Попробовал. Вообще не работает - ожидание BSY никогда не закончится, так как SPI транзакция ни разу не инициировалась. <- Бред написал. По идее должно работать, но лог анализатор показывает тишину на линиях.
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: STM32 новичку в ARM что к чему

Сообщение baghear »

Добрый день, подскажите можно ли использовать один вывод для внешнего прерывания и для счета таймера.
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Oxford »

Попробуй
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: STM32 новичку в ARM что к чему

Сообщение baghear »

Отвечаю, да можно!!!!
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Eddy_Em »

Пытаюсь программно запустить бутлоадер на STM32F072. Вот такой код

Код: Выделить всё

void Jump2Boot(){
    void (*SysMemBootJump)(void);
    volatile uint32_t addr = 0x1FFFC800;
    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
    SysTick-›CTRL = 0;
    SysTick-›LOAD = 0;
    SysTick-›VAL = 0;
    sysreset();
    __DSB();
    SYSCFG-›CFGR1 = 0x01;
    __DSB();__ISB();
    SysMemBootJump = (void (*)(void)) (*((uint32_t *)(addr + 4)));
    __set_MSP(*(uint32_t *)addr);
    SysMemBootJump();
}

не работает. Без `sysreset` - тоже не работает. В обоих случаях USB не отключается в системе (т.е. подтяжка остается поднятой).
Здесь пишут, что практически такой же код работает!
Что за чертовщина?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Без `sysreset` - тоже не работает.
C помощью SysReset ты попадаешь в аппаратный ресет и всё что написано дальше не имеет смысла. Если ты аппаратно поставишь Boot0 в "1", то попадёшь в загрузчик. Либо ты программно переходишь в загрузчик, то должен привести чип в начальное состояние, сделать ремап, установить стек и перейти по адресу.
В обоих случаях USB не отключается в системе (т.е. подтяжка остается поднятой).
А чего бы ей самой отключиться? Её руками надо отключить.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Eddy_Em »

VladislavS писал(а):C помощью SysReset ты попадаешь в аппаратный ресет

Не попадаю! Это - функция начальной инициализации таймеров и периферии. Просто пробовал ее вызывать, чтобы сбросить все прерывания и таймеры в умолчательное значение.
VladislavS писал(а):Если ты аппаратно поставишь Boot0 в "1", то попадёшь в загрузчик.

В смысле - можно просто подать на эту ножку 1 и перезагрузить МК? Но у меня там нет конденсатора, боюсь, не успеет. Но можно попробовать.
VladislavS писал(а):должен привести чип в начальное состояние, сделать ремап, установить стек и перейти по адресу

Вот и пытаюсь, но, судя по тому, что он либо просто перезагружается, либо где-то виснет, что-то идет не так.
VladislavS писал(а):Её руками надо отключить.

точно, сейчас попробую.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Вот и пытаюсь, но, судя по тому, что он либо просто перезагружается, либо где-то виснет, что-то идет не так.
Отладчик? Не, не слышали.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Eddy_Em »

VladislavS, хватит уже со всякой ересью приставать! Я не пользуюсь внутрисхемной отладкой и считаю ее бредом!
Итак, отключение подтяжки вручную (USB_BCDR_DPPU) ничего не меняет.
Если выкинуть отмену прерываний (__disable_irq()), то МК просто перезагружается. Если же не выкидывать — зависает.
Буду пробовать ногу в 1 выставить. Жаль, сразу кондер туда не подпаял.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Я не пользуюсь внутрисхемной отладкой и считаю ее бредом!

Ну давай, давай :)

Добавлено after 1 minute 32 seconds:
Итак, отключение подтяжки вручную (USB_BCDR_DPPU) ничего не меняет.
Подождал пока хост заметит отключение?
Ответить

Вернуться в «ARM»