Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Ср мар 11, 2020 17:36:20

Сделал так:
Код:
void Jump2Boot(){
    void (*SysMemBootJump)(void);
    volatile uint32_t addr = 0x1FFFC800;
    for(int i = 0; i < 7200000; ++i) nop();
    USB->BCDR &= ~USB_BCDR_DPPU; // deactivate pullup
    for(int i = 0; i < 7200000; ++i) nop();
    //sysreset();
    // reset systick
    SysTick->CTRL = 0;
    // disable all interrupts
    __disable_irq();
    NVIC->ICER[0] = 0xffffffff;
    NVIC->ICPR[0] = 0xffffffff;
    __DSB();__ISB();
    // Enable the SYSCFG peripheral.
    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
    // remap memory to 0 (only for STM32F0)
    SYSCFG->CFGR1 = 0x01;
    __DSB();__ISB();
    SysMemBootJump = (void (*)(void)) (*((uint32_t *)(addr + 4)));
    // set main stack pointer
    __set_MSP(*((uint32_t *)addr));
    SysMemBootJump();
}

(уж ждать-то больше некуда). Бесполезно:
Код:
[2008912.252304] usb 1-7: USB disconnect, device number 17
[2008912.252551] pl2303 ttyUSB0: error sending break = -19
[2008912.252767] pl2303 ttyUSB0: pl2303 converter now disconnected from ttyUSB0
[2008912.252789] pl2303 1-7:1.0: device disconnected
[2008913.702173] usb 1-7: new full-speed USB device number 18 using xhci_hcd
[2008913.816199] usb 1-7: device descriptor read/64, error -71
[2008914.033219] usb 1-7: device descriptor read/64, error -71
[2008914.249225] usb 1-7: new full-speed USB device number 19 using xhci_hcd
[2008914.363118] usb 1-7: device descriptor read/64, error -71
[2008914.585212] usb 1-7: device descriptor read/64, error -71
[2008914.687252] usb usb1-port7: attempt power cycle
[2008915.315111] usb 1-7: new full-speed USB device number 20 using xhci_hcd
[2008915.315270] usb 1-7: Device not responding to setup address.
[2008915.519278] usb 1-7: Device not responding to setup address.

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

ногу Boot0 установить в единицу нельзя: это не Boot1, на ней нет GPIO! Схемотехнически я положился на то, что в интернетах у народа "все работает", думал программно переходить в DFU, чтобы новый вариант прошивки записать, пока буду все это дело писать и отлаживать. Для stlink'а тоже выводы оставил, но что-то он глючит у меня: то ли провода плохие, то ли еще что (да и если вдруг повезет, и прошивка прошьется и проверится, то reset'а все равно не происходит и приходится вручную проводочком об землю).

Похоже, надо колхозить проводок между свободной ногой и boot0 + кондер на 0.1мкФ туда.
Последний раз редактировалось Eddy_Em Ср мар 11, 2020 17:43:45, всего редактировалось 1 раз.

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

Ср мар 11, 2020 17:40:39

Глобальные прерывания не надо запрещать, они у Cortex-M0 разрешены по ресету. Я бы вот такой код перед переходом добавил.
Код:
  RCC->AHBRSTR = RCC_AHBRSTR_TSCRST   | RCC_AHBRSTR_GPIOFRST | RCC_AHBRSTR_GPIOERST | RCC_AHBRSTR_GPIODRST |
                 RCC_AHBRSTR_GPIOCRST | RCC_AHBRSTR_GPIOBRST | RCC_AHBRSTR_GPIOARST;
  RCC->APB1RSTR = RCC_APB1RSTR_CECRST    | RCC_APB1RSTR_DACRST    | RCC_APB1RSTR_PWRRST    | RCC_APB1RSTR_CRSRST  |
                  RCC_APB1RSTR_CANRST    | RCC_APB1RSTR_USBRST    | RCC_APB1RSTR_I2C2RST   | RCC_APB1RSTR_I2C1RST |
                  RCC_APB1RSTR_USART4RST | RCC_APB1RSTR_USART3RST | RCC_APB1RSTR_USART2RST | RCC_APB1RSTR_SPI2RST |
                  RCC_APB1RSTR_WWDGRST   | RCC_APB1RSTR_TIM14RST  | RCC_APB1RSTR_TIM7RST   | RCC_APB1RSTR_TIM6RST |
                  RCC_APB1RSTR_TIM3RST   | RCC_APB1RSTR_TIM2RST;
  RCC->APB2RSTR = RCC_APB2RSTR_DBGMCURST | RCC_APB2RSTR_TIM17RST | RCC_APB2RSTR_TIM16RST | RCC_APB2RSTR_TIM15RST |
                  RCC_APB2RSTR_USART1RST | RCC_APB2RSTR_SPI1RST  | RCC_APB2RSTR_TIM1RST  | RCC_APB2RSTR_ADCRST   | RCC_APB2RSTR_SYSCFGRST;
  RCC->AHBRSTR = 0;
  RCC->APB1RSTR = 0;
  RCC->APB2RSTR = 0;

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

Ср мар 11, 2020 17:51:58

VladislavS, спасибо! Заработало!
Вот не пойму: на кой черт все в интернетах пишут __disable_irq()?
Вставил ваш код после отключения прерываний - не заработало. Убрал отключение прерываний - все в порядке!
Руками дергать пуллап не нужно.
В общем, вот такой код полностью работает как надо:
Код:
void Jump2Boot(){
    void (*SysMemBootJump)(void);
    volatile uint32_t addr = 0x1FFFC800;
    // reset systick
    SysTick->CTRL = 0;
    // reset clocks
    RCC->APB1RSTR = RCC_APB1RSTR_CECRST    | RCC_APB1RSTR_DACRST    | RCC_APB1RSTR_PWRRST    | RCC_APB1RSTR_CRSRST  |
                    RCC_APB1RSTR_CANRST    | RCC_APB1RSTR_USBRST    | RCC_APB1RSTR_I2C2RST   | RCC_APB1RSTR_I2C1RST |
                    RCC_APB1RSTR_USART4RST | RCC_APB1RSTR_USART3RST | RCC_APB1RSTR_USART2RST | RCC_APB1RSTR_SPI2RST |
                    RCC_APB1RSTR_WWDGRST   | RCC_APB1RSTR_TIM14RST  | RCC_APB1RSTR_TIM7RST   | RCC_APB1RSTR_TIM6RST |
                    RCC_APB1RSTR_TIM3RST   | RCC_APB1RSTR_TIM2RST;
    RCC->APB2RSTR = RCC_APB2RSTR_DBGMCURST | RCC_APB2RSTR_TIM17RST | RCC_APB2RSTR_TIM16RST | RCC_APB2RSTR_TIM15RST |
                    RCC_APB2RSTR_USART1RST | RCC_APB2RSTR_SPI1RST  | RCC_APB2RSTR_TIM1RST  | RCC_APB2RSTR_ADCRST   | RCC_APB2RSTR_SYSCFGRST;
    RCC->AHBRSTR = 0;
    RCC->APB1RSTR = 0;
    RCC->APB2RSTR = 0;
    // Enable the SYSCFG peripheral.
    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
    // remap memory to 0 (only for STM32F0)
    SYSCFG->CFGR1 = 0x01; __DSB(); __ISB();
    SysMemBootJump = (void (*)(void)) (*((uint32_t *)(addr + 4)));
    // set main stack pointer
    __set_MSP(*((uint32_t *)addr));
    // jump to bootloader
    SysMemBootJump();
}

Теперь остается лишь написать `make dfuboot`, а после заливки нажать кнопочку reset. И никаких внешних приблуд не нужно...

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

Ср мар 11, 2020 18:19:01

RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; Не обязательно. Ремап без него работает.

Добавлено after 6 minutes 50 seconds:
Вот не пойму: на кой черт все в интернетах пишут __disable_irq()?
Процессоры разные бывают. Где-то надо, где-то нет.

Руками дергать пуллап не нужно.
Да, его RCC_APB1RSTR_USBRST сбрасывает.

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

Чт апр 09, 2020 09:35:50

Добрый день вопрос FSMC, а именно по линиям Ax и NEy.
Как я понял, от x и y зависит адрес к которому будем обращаться.

В одном appnote нашел такую фразу.

Example: with NE2 and A4, the LCD base address will be 0x6400 0000 and 0x6400 0020;
with NE4 and A0, the LCD base address will be 0x6C00 0000 and 0x6C00 0002.


Подскажите как производить расчет адреса?

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

Чт апр 09, 2020 09:55:21

Подскажите как производить расчет адреса?

4 банка по 64МБ, базовый адрес - 0x6000'0000. Для NE2 и A4 добавляем 64МБ и устанавливаем 4-й бит, но это для 8-ми битного доступа, для 16-ти битного еще сдвигаем его на 1 влево.

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

Чт апр 09, 2020 10:14:55

Что касается банков и вывода NEx понял.
Первый банк в свою очередь делится на 4 подбанка, это как-то влияет на адрес?
У меня NE1 A18, правильно ли понял для 16 битного доступа 0x6000'0000 и 0x60080000?

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

Чт апр 09, 2020 10:24:45

Первый банк в свою очередь делится на 4 подбанка, это как-то влияет на адрес?

Я не совсем правильно выразился, говоря про 4 банка я имел в виду именно подбанки в первом банке для NOR/SRAM.

У меня NE1 A18, правильно ли понял для 16 битного доступа 0x6000'0000 и 0x60080000?

Да, адреса правильные.

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

Чт апр 09, 2020 11:33:02

Еще вопрос, для общение с дисплеем по fsmc делал так.
Код:
#define LCD_DATA 0x60020000
#define LCD_REG 0x60000000

void Lcd_Write_Index(uint16_t index)
{
   *(uint16_t *) (LCD_REG) = index;
}
////////////////////////
void Lcd_Write_Data(uint16_t data)
{
   *(uint16_t *) (LCD_DATA)= data;
}
///////////////////


А в китайском примере делают так
Код:
typedef struct
{
   vu16 LCD_REG;
   vu16 LCD_RAM;
} LCD_TypeDef;
         
#define LCD_BASE        ((u32)(0x60000000 | 0x00080000))
#define LCD             ((LCD_TypeDef *) LCD_BASE)

void LCD_WR_REG(u16 data)
{
   LCD->LCD_REG=data;
}

void LCD_WR_DATA(u16 data)
{
   LCD->LCD_RAM=data;
}

Как это работает?

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

Чт апр 09, 2020 11:58:01

LCD - указатель на экземпляр структуры, лежащий по адресу 0x60080000, соответственно, LCD->LCD_REG - первые 16 байт по этому адресу, LCD->LCD_RAM - следующие 16 байт. Т.е. по сути, двухбайтовые данные, лежащие по адресам 0x60080000 и 0x60080002 соответственно.

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

Чт апр 09, 2020 12:04:51

Т.е. по сути, двухбайтовые данные, лежащие по адресам 0x60080000 и 0x60080002 соответственно.

И работать оно будет только для A0.

Добавлено after 4 minutes 7 seconds:
Код:
*(uint16_t *) (LCD_REG) = index;

А тут нужен (volatile uint16_t*), хотя с некоторыми компиляторами может работать и так.

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

Чт апр 09, 2020 12:05:54

Да, там выходит, что DC вывод дисплея (ну или что там для выбора Data/Command) используется, получается фиксированным битом.

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

Чт апр 09, 2020 13:39:05

И работать оно будет только для A0.


Точно!!!

Это работать не должно в моем случае!!!!

Добавлено after 1 hour 27 minutes 43 seconds:
Переписал код, дисплей заработал. Но возник вопрос, запись в регистр.
Код:
void LCD_WR_REG(u16 data)
{
   *(uint16_t *) (LCD_REG) = data;
}



Часть инициализации
Код:
LCD_WR_REG(0xff00);
   LCD_WR_DATA(0x80);
   LCD_WR_REG(0xff01);
   LCD_WR_DATA(0x09);
   LCD_WR_REG(0xff02);
   LCD_WR_DATA(0x01);

   LCD_WR_REG(0xff80);
   LCD_WR_DATA(0x80);
   LCD_WR_REG(0xff81);
   LCD_WR_DATA(0x09);


Видно что в регистр должны писаться 32-битные данные, почему это работает?
Последний раз редактировалось baghear Чт апр 09, 2020 13:46:02, всего редактировалось 1 раз.

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

Чт апр 09, 2020 13:43:30

Откуда это видно?

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

Чт апр 09, 2020 13:46:52

Если писались 16-битные инициализация не прошла бы.

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

Чт апр 09, 2020 15:04:47

если Вы имнеете ввиду, что по 16-битной шине передаются:
LCD_WR_REG(0xff81); 0xff81
LCD_WR_DATA(0x09); 0x0009
то - да, 16+16 = 32
но по сути-то в регистр с адресом ff81 передается 09
что не вяжется с фразой:
"...Видно что в регистр должны писаться 32-битные данные..."

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

Чт апр 09, 2020 15:32:47

Все понял, спасибо!!!

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

Чт апр 09, 2020 16:49:51

Активно пользуюсь PIC'ами, хочу разобраться с STM32 естественно с минимальными затратами.
Читал разного. Но хочется услышать совета людей, которые прошли через это.
Самый простой программатор (может что-то типа пиковского клона существует) или варианты...
Не нашел STM32 в протеусе.
Мне действительно важны Ваши рекомендации. Заранее спасибо.

не получится.

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

Вс апр 12, 2020 12:14:55

Кто разобрался нормально с CAN-шиной?
Меня смущает поле CAN2SB[5:0] регистра CAN-›FMR: зачем оно вообще нужно, если у STM32F0x2 нет CAN2?
Нужно ли вообще что-нибудь в это поле писать при инициализации фильтров, если мне их N штук надо?
Завел два фильтра вот так:
Код:
    CAN->FMR = CAN_FMR_FINIT;
    CAN->FA1R = CAN_FA1R_FACT0 | CAN_FA1R_FACT1;
    CAN->sFilterRegister[0].FR1 = (1<<21)|(1<<5); // all odd IDs
    CAN->FFA1R = 2; // filter 1 for FIFO1, filter 0 - for FIFO0
    CAN->sFilterRegister[1].FR1 = (1<<21); // all even IDs
    CAN->FMR &=~ CAN_FMR_FINIT;

принимает и четные, и нечетные идентификаторы...

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

Вс апр 12, 2020 16:38:25

С CAN не работал но может быть из за этого :

CAN2SB[5:0] (биты 13:8): CAN2 Start Bank. Эти биты устанавливаются и очищаются программой. Они определяют начальный банк для интерфейса CAN2 (Slave) в диапазоне от 0 до 27.

Примечание: когда CAN2SB[5:0] = 28d, могут быть использованы все фильтры для CAN1. Когда CAN2SB[5:0] = 0, то для CAN1 не назначено ни одного фильтра.

http://microsin.net/programming/arm/stm ... bxcan.html

Добавлено after 3 minutes 23 seconds:
Хотя в референсе CAN_FMR вообще пустой. Х.З.

Добавлено after 1 minute 50 seconds:
CAN filter master register (CAN_FMR)
Address offset: 0x200
Reset value: 0x2A1C 0E01
All bits of this register are set and cleared by software.
Ответить