Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Изучаем ARMы

Сообщений 31 страница 60 из 185

31

Нашел интересное сообщение на одном из форумов. http://forum.easyelectronics.ru/viewtop … d4#p411382
Т. е. теоретически в STM32F103C8T6 128 КБ Falsh памяти, а не 64 КБ как заявлено. o.O  :D

0

32

Проверил сколько реально в STM32F103C8T6 Flash памяти и в нем действительно 128 КБ. o.O
Для этого несколько раз создавал bin файл, заполненный случайными числами, заливал его в МК, потом считывал и сравнивал. Всегда совпадало. :)
Теперь о том как прочитать или залить в МК больше 64 КБ, если программатор определяется что в нем только 64 КБ памяти.

http://s6.uploads.ru/N48Fi.png

Все просто. На следующей странице, где показаны права доступа к памяти есть выпадающий список.

http://s7.uploads.ru/t/R9Fe5.png

Открываем его и видим.

http://s6.uploads.ru/pX0dq.png

Выбираем 128 и теперь доступна вся память.

Остается вопрос, почему разработчики так поступили? Возможно STM32F103C8T6 это STM32F103CBT6, но с отбракованой партии, в которой в проверяемых экземплярах нашли дефекты памяти в адресном пространстве от 64 до 128 КБ. При этом бракуют всю партию, но это не значит что дефекты во всех МК и если проверка памяти прошла удачно, то можно использовать ее всю.

+1

33

Пётр написал(а):

Из бейсиков для ARM есть mikroBasic, но он "жадный"... Лекарства для него не нашел.

Могу успокоить, микробэйсик - это вовсе не бейсик, а жалкое его подобие, в конечном итоге он по архитектуре похоже на тот же Си, только с операторами от бэйсика и корявой структурой. В общем жалеть не о чем, кроме как о Баскоме...

-1

34

Mrshilov написал(а):

С версией 3 точно работал.

Проверил с версией 3.0.0. Не работает. Пишет Demo Limit...

0

35

Пётр написал(а):

Остается вопрос, почему разработчики так поступили?

Может потому что в stm32 нет EEPROM, а в место него используется FLASH память? Типа для прошивки 64 кб и для программных нужд еще 64?

Отредактировано Tsoyvi (2016-04-04 10:33:53)

0

36

В даташите ничего не написано что память с адресами от 64 до 128 используется в качестве EEPROM.
В STM32 есть EEPROM (например в STM32Lxxxx), но не во всех моделях.

0

37

Вроде как их можно шить прямо по встроенному USB. Вот первое, что попалось Ссылка.

0

38

Пётр написал(а):

Была у меня мысль что эта плата - хороший вариант для автономной (без компа) цветомузыки.

Немного поэкспериментировал в этом направлении. Сейчас сделан сбор семплов по таймеру 40 тысяч раз в секунду. Чтобы не нагружать процессор обработкой такого количества прерываний, настроен DMA на заполнение буфера (массив содержащий 4 тысячи двухбайтных ячеек). В итоге получаем вместо 40 прерываний в секунду, всего 10 прерываний в секунду. Остается скопировать данные и выполнить БПФ.

0

39

Пётр написал(а):

Немного поэкспериментировал в этом направлении.

Хорошая новость!

0

40

Немного поработав с STM32 скажу так - МК хорошие, не стоит от них отказываться. :) Одни из самых дешевых и простых МК STM32F030F4P6 (сейчас стоят 40 центов за штуку) во много раз превосходят по возможностям тиньки, меги и т. д. :tomato:
Да приходится программировать на Си, но не все так сложно как кажется. Нет необходимости непосредственно взаимодействовать с регистрами. Компания ST предоставляет библиотеки SPL и HAL, которые позволять конфигурировать модули МК почти не заглядывая в даташит, т. е. как в баскоме. :) Это значительно облегчает разработку и позволяет разрабатывать программы без глубокого изучения устройства МК. :)

0

41

я пробовал учить Си раз 30, еще со школьных времён...
Асм для x86 - сносно, Паскали/Бейскики - вполне приятно, асм для PIC - термимо, асм для AVR tiny/mega - приятно (после PIC :), FoxPrо (когда еще был DBaseIV) - очень приятно для БД...

но СИ - это слезы... я недавно несколько дней над чуим кодом для Ардуинки сидел. Чуть не поседел. Плакал, много чаю выпил, спал мало... понял, почему сейчас для мигания св.диодом надо минимум 8 кБ флеша, килобайт стека и >16 МГц скорости - всё сжирают библиотеки... это кашмар... до сих пон не могу вкурить логику создателей этих Си-подобных систем

осталось понять, что есть "SPL и HAL". Это как Маркс и Энгельс? :)

0

42

Александр Д. написал(а):

я недавно несколько дней над чужим кодом для Ардуинки сидел

Видел тот код. Там не Си, а C++ (чтобы не путать, расширение у Си файлов *.c, а у C++ файлов - *.cpp).
Сам по себе код не очень сложный и содержит статический класс.

Язык Си проще. В нем нет многих конструкций имеющихся в C++.
Вообще есть идея переписать библиотеку SPL под mikroBasic и тогда на нем можно будет что-то писать под STM (то что сейчас, никуда не годится), но одному это за год не сделать...

Александр Д. написал(а):

всё сжирают библиотеки

Библиотеки бывают разные. Например в FastAVR они тоже есть, но прошивка получается довольно компактная.

Александр Д. написал(а):

осталось понять, что есть "SPL и HAL".

Это библиотеки функций для STM32. Например совсем недавно выложил пример ШИМ с использованием библиотеки SPL.
Допустим вот конфигурирование порта

Код:
    GPIO_InitTypeDef s;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); // Включаем тактирование порта PB.

    s.GPIO_Pin   = GPIO_Pin_1;       // Настройка вывода PB1.
    s.GPIO_Mode  = GPIO_Mode_AF;     // Вывод настроен на одну из альтернативных функций.
    s.GPIO_OType = GPIO_OType_PP;    // Двухтактный выход (т. е. не открытый сток).
    s.GPIO_PuPd  = GPIO_PuPd_NOPULL; // Подтягивающие резисторы отключены.
    s.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &s);            // Инициализация порта.

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_0); // PB1 это выход таймера TIM 14.

Если не использовать библиотеки, а работать непосредственно с регистрами то код будет примерно таким (тут правда вывод настраивается для USART, но это не важно).

Код:
    RCC->AHB1ENR=0x0000000f;  //vkl port A-D
    GPIOA->MODER=0xA80000A0;  //pin2,3=AF (usart2)
    GPIOD->MODER=0x55000000;  //4 led
    GPIOA->AFR[1]=0x00000700;  //pin2,3=usart2
    GPIOA->OSPEEDR=0x00000050;  //25MHz

Какой код более понятный? Можно ли понять второй код не заглядывая в даташит?

0

43

Имеется ввиду:

- CubeF0;
- CubeF4;
- CubeMX.

зы: ну да, а далее си...

0

44

Пётр написал(а):

Баскома для ARM нет. Марк уже 8 лет пишет что BASCOM-ARM в разработке, но неизвестно так ли это и если так, то на каком этапе разработка.
Из бейсиков для ARM есть mikroBasic, но он "жадный"... Лекарства для него не нашел.
Вот и приходится писать на Си.

Здравствуйте!

Настройки камня отдельно, а прога в микровасике просто "Приуэйт Мир"

program LedBlinking
main:
  'GPIO_Digital_Output(@GPIOA_BASE, _GPIO_PINMASK_ALL) ' Set PORTA as digital output
  GPIO_Digital_Output(@GPIOA_BASE, _GPIO_PINMASK_LOW)  ' Set PORTA.0-7 as digital output
  'GPIO_Digital_Output(@GPIOB_BASE, _GPIO_PINMASK_ALL) ' Set PORTB as digital output
  'GPIO_Digital_Output(@GPIOC_BASE, _GPIO_PINMASK_ALL) ' Set PORTC as digital output
  'GPIO_Digital_Output(@GPIOD_BASE, _GPIO_PINMASK_ALL) ' Set PORTD as digital output
  'GPIO_Digital_Output(@GPIOE_BASE, _GPIO_PINMASK_ALL) ' Set PORTE as digital output

  GPIOA_ODR = 0
  'GPIOB_ODR = 0
  'GPIOC_ODR = 0
  'GPIOD_ODR = 0
  'GPIOE_ODR = 0

  while TRUE
    GPIOA_ODR = not GPIOA_ODR ' Toggle PORTA
    'GPIOB_ODR = not GPIOB_ODR ' Toggle PORTB
    'GPIOC_ODR = not GPIOC_ODR ' Toggle PORTC
    'GPIOD_ODR = not GPIOD_ODR ' Toggle PORTD
    'GPIOE_ODR = not GPIOE_ODR ' Toggle PORTE
    Delay_ms(100)
  wend
end.

0

45

еще года 4 назад приятель Марка мне писал, что плавно перетекают в другой компилятор, БАСком будет "не в теме", так как его постоянно ломают и пользуются бесплатно.
Делают очередной аля-ПикСтик (интерпретатор в самом камне). Мол, МК ныне жирные, будет продавать уже МК с прошитыми загрузчиком + интерпретатор. Как МегаБейсик - там такая же идеология...
так что Баском ARM ясно пролетает
Да и Марк перестал отвечать почти 2 года назад... Страны СНГ не смотрятся покупателями: народ бедный (с точки зрения Европы), постоянно что-то просящий и при этом ворующий...

0

46

Пётр написал(а):

Вообще есть идея переписать библиотеку SPL под mikroBasic

Проверил эту теорию на практике и оказалось что она имеет право на существование. Код на Си.

Код:
int main(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
   
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); // Включаем тактирование порта PB.

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;      // Настройка вывода PB.1.
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;  // Вывод работает как выход.
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // Двухтактный выход (т. е. не открытый сток).
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // Подтягивающие резисторы отключены.
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, GPIO_InitStruct);  // Инициализация порта.
	
    while(1)
    {
        GPIO_SetBits(GPIOB, GPIO_Pin_1); // Лог. 1 на выходе PB.1.
        SysTim_DelayMS(500); // Ждем 500 миллисекунд.
        GPIO_ResetBits(GPIOB, GPIO_Pin_1); // Лог. 0 на выходе PB.1.
        SysTim_DelayMS(500); // Ждем 500 миллисекунд.
    }
	
}

Аналогичный код на mikroBasic.

Код:
dim GPIO_InitStruct as GPIO_InitTypeDef

main:
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE) ' Включаем тактирование порта PB.

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1      ' Настройка вывода PB.1.
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT  ' Вывод работает как выход.
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP ' Двухтактный выход (т. е. не открытый сток).
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ' Подтягивающие резисторы отключены.
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz

    GPIO_Init(GPIOB, GPIO_InitStruct)  ' Инициализация порта.

    while TRUE
      GPIO_SetBits(GPIOB, GPIO_Pin_1)
      Delay_ms(500)
      GPIO_ResetBits(GPIOB, GPIO_Pin_1)
      Delay_ms(500)
    wend

end.

Отличий мало, но для этого пришлось перевести на mikroBasic часть библиотеки SPL.

Весь код
Код:
program GPIO_SPL_Lite

structure GPIO_TypeDef
  dim MODER as longword         ' GPIO port mode register,                                  Address offset: 0x00 */
  dim OTYPER as word       ' GPIO port output type register,                           Address offset: 0x04 */
  dim RESERVED0 as word         ' Reserved,                                                                 0x06 */
  dim OSPEEDR as longword       ' GPIO port output speed register,                          Address offset: 0x08 */
  dim PUPDR as longword        ' GPIO port pull-up/pull-down register,                     Address offset: 0x0C */
  dim IDR as word          ' GPIO port input data register,                            Address offset: 0x10 */
  dim RESERVED1 as word         ' Reserved,                                                                 0x12 */
  dim ODR as word         ' GPIO port output data register,                           Address offset: 0x14 */
  dim RESERVED2 as word         ' Reserved,                                                                 0x16 */
  dim BSRR as longword         ' GPIO port bit set/reset registerBSRR,                     Address offset: 0x18 */
  dim LCKR as longword         ' GPIO port configuration lock register,                    Address offset: 0x1C */
  dim AFR as longword[2]       ' GPIO alternate function low register,                Address offset: 0x20-0x24 */
  dim BRR as word          ' GPIO bit reset register,                                  Address offset: 0x28 */
  dim RESERVED3 as word
end structure

const GPIO_Mode_IN   = 0x00  '/*!< GPIO Input Mode              */
const GPIO_Mode_OUT  = 0x01  '/*!< GPIO Output Mode             */
const GPIO_Mode_AF   = 0x02  '/*!< GPIO Alternate function Mode */
const GPIO_Mode_AN   = 0x03  ' /*!< GPIO Analog In/Out Mode      */

const  GPIO_OType_PP = 0x00
const  GPIO_OType_OD = 0x01

const  GPIO_Speed_Level_1  = 0x00 '/*!< I/O output speed: Low 2 MHz */
const  GPIO_Speed_Level_2  = 0x01 '/*!< I/O output speed: Medium 10 MHz */
const  GPIO_Speed_Level_3  = 0x03  '/*!< I/O output speed: High 50 MHz */

const  GPIO_PuPd_NOPULL = 0x00
const  GPIO_PuPd_UP     = 0x01
const  GPIO_PuPd_DOWN   = 0x02

'/******************  Bit definition for RCC_AHBENR register  ******************/
const  RCC_AHBENR_DMAEN   =                 (0x00000001)       ' /*!< DMA clock enable */
const  RCC_AHBENR_SRAMEN  =                 (0x00000004)       ' /*!< SRAM interface clock enable */
const  RCC_AHBENR_FLITFEN =                 (0x00000010)       ' /*!< FLITF clock enable */
const  RCC_AHBENR_CRCEN   =                 (0x00000040)       ' /*!< CRC clock enable */
const  RCC_AHBENR_GPIOAEN =                 (0x00020000)       ' /*!< GPIOA clock enable */
const  RCC_AHBENR_GPIOBEN =                 (0x00040000)       ' /*!< GPIOB clock enable */
const  RCC_AHBENR_GPIOCEN =                 (0x00080000)       ' /*!< GPIOC clock enable */
const  RCC_AHBENR_GPIODEN =                 (0x00100000)       ' /*!< GPIOD clock enable */
const  RCC_AHBENR_GPIOEEN =                 (0x00200000)       ' /*!< GPIOE clock enable */
const  RCC_AHBENR_GPIOFEN =                 (0x00400000)       ' /*!< GPIOF clock enable */
const  RCC_AHBENR_TSCEN   =                 (0x01000000)       ' /*!< TS controller clock enable */

const  RCC_AHBENR_DMA1EN  =                 RCC_AHBENR_DMAEN        '*!< DMA1 clock enable */
const  RCC_AHBENR_TSEN    =                 RCC_AHBENR_TSCEN

const RCC_AHBPeriph_GPIOA =              RCC_AHBENR_GPIOAEN
const RCC_AHBPeriph_GPIOB =              RCC_AHBENR_GPIOBEN
const RCC_AHBPeriph_GPIOC =              RCC_AHBENR_GPIOCEN
const RCC_AHBPeriph_GPIOD =              RCC_AHBENR_GPIODEN
const RCC_AHBPeriph_GPIOE =              RCC_AHBENR_GPIOEEN '/*!< Only applicable for STM32F072 devices */
const RCC_AHBPeriph_GPIOF =              RCC_AHBENR_GPIOFEN
const RCC_AHBPeriph_TS    =              RCC_AHBENR_TSEN
const RCC_AHBPeriph_CRC   =              RCC_AHBENR_CRCEN
const RCC_AHBPeriph_FLITF =              RCC_AHBENR_FLITFEN
const RCC_AHBPeriph_SRAM  =              RCC_AHBENR_SRAMEN
const RCC_AHBPeriph_DMA1  =              RCC_AHBENR_DMA1EN

const DISABLE = 0
const ENABLE = 1

const RESET = 0
const SET_Bit = 1

const GPIO_OSPEEDER_OSPEEDR0 = 3
const GPIO_OTYPER_OT_0 = 1
const GPIO_MODER_MODER0 = 3
const GPIO_PUPDR_PUPDR0 = 3

const GPIO_Pin_0  =               0x0001 ' /*!< Pin 0 selected    */
const GPIO_Pin_1  =               0x0002 ' /*!< Pin 1 selected    */
const GPIO_Pin_2  =               0x0004 ' /*!< Pin 2 selected    */
const GPIO_Pin_3  =               0x0008 ' /*!< Pin 3 selected    */
const GPIO_Pin_4  =               0x0010 ' /*!< Pin 4 selected    */
const GPIO_Pin_5  =               0x0020 ' /*!< Pin 5 selected    */
const GPIO_Pin_6  =               0x0040 ' /*!< Pin 6 selected    */
const GPIO_Pin_7  =               0x0080 ' /*!< Pin 7 selected    */
const GPIO_Pin_8  =               0x0100 ' /*!< Pin 8 selected    */
const GPIO_Pin_9  =               0x0200 ' /*!< Pin 9 selected    */
const GPIO_Pin_10 =               0x0400 ' /*!< Pin 10 selected   */
const GPIO_Pin_11 =               0x0800 ' /*!< Pin 11 selected   */
const GPIO_Pin_12 =               0x1000 ' /*!< Pin 12 selected   */
const GPIO_Pin_13 =               0x2000 ' /*!< Pin 13 selected   */
const GPIO_Pin_14 =               0x4000 ' /*!< Pin 14 selected   */
const GPIO_Pin_15 =               0x8000 ' /*!< Pin 15 selected   */
const GPIO_Pin_All=               0xFFFF ' /*!< All pins selected */

const GPIO_Speed_2MHz  = GPIO_Speed_Level_1  ' /*!< I/O output speed: Low 2 MHz  */
const GPIO_Speed_10MHz = GPIO_Speed_Level_2  ' /*!< I/O output speed: Medium 10 MHz */
const GPIO_Speed_50MHz = GPIO_Speed_Level_3  ' /*!< I/O output speed: High 50 MHz */


structure GPIO_InitTypeDef
  dim GPIO_Pin  as longword              '/*!< Specifies the GPIO pins to be configured.
                             '          This parameter can be any value of @ref GPIO_pins_define */

  dim GPIO_Mode as longword   '  /*!< Specifies the operating mode for the selected pins.
                                     '  This parameter can be a value of @ref GPIOMode_TypeDef   */

  dim GPIO_Speed  as longword  ' /*!< Specifies the speed for the selected pins.
                                     '  This parameter can be a value of @ref GPIOSpeed_TypeDef  */

  dim GPIO_OType as longword ' /*!< Specifies the operating output type for the selected pins.
                                     '  This parameter can be a value of @ref GPIOOType_TypeDef  */

  dim GPIO_PuPd as longword
end structure

structure RCC_TypeDef
  dim CR as longword         '/*!< RCC clock control register,                                  Address offset: 0x00 */
  dim CFGR as longword       '/*!< RCC clock configuration register,                            Address offset: 0x04 */
  dim CIR as longword        '/*!< RCC clock interrupt register,                                Address offset: 0x08 */
  dim APB2RSTR as longword   '/*!< RCC APB2 peripheral reset register,                          Address offset: 0x0C */
  dim APB1RSTR as longword   '/*!< RCC APB1 peripheral reset register,                          Address offset: 0x10 */
  dim AHBENR as longword     '/*!< RCC AHB peripheral clock register,                           Address offset: 0x14 */
  dim APB2ENR as longword    '/*!< RCC APB2 peripheral clock enable register,                   Address offset: 0x18 */
  dim APB1ENR as longword    '/*!< RCC APB1 peripheral clock enable register,                   Address offset: 0x1C */
  dim BDCR as longword       '/*!< RCC Backup domain control register,                          Address offset: 0x20 */
  dim CSR as longword        '/*!< RCC clock control & status register,                         Address offset: 0x24 */
  dim AHBRSTR as longword    '/*!< RCC AHB peripheral reset register,                           Address offset: 0x28 */
  dim CFGR2 as longword      '/*!< RCC clock configuration register 2,                          Address offset: 0x2C */
  dim CFGR3 as longword      '/*!< RCC clock configuration register 3,                          Address offset: 0x30 */
  dim CR2 as longword        '/*!< RCC clock control register 2,                                Address offset: 0x34 */
end structure

dim GPIOA as GPIO_TypeDef absolute 0x48000000 volatile sfr far
dim GPIOB as GPIO_TypeDef absolute 0x48000400 volatile sfr far
dim RCC as RCC_TypeDef absolute 0x40021000 volatile sfr far

sub procedure RCC_AHBPeriphClockCmd(dim RCC_AHBPeriph as longword, dim NewState as byte)
    if NewState <> DISABLE Then
      RCC.AHBENR = RCC.AHBENR or RCC_AHBPeriph
    else
      RCC.AHBENR = RCC.AHBENR and (not RCC_AHBPeriph)
    end if
end sub

sub procedure GPIO_Init(dim byref GPIOx as GPIO_TypeDef, dim byref GPIO_InitStruct as GPIO_InitTypeDef)
   dim pinpos, pos , currentpin as longword
   
   for pinpos = 0 to 10
      pos = 0x01 << pinpos
      currentpin = GPIO_InitStruct.GPIO_Pin and pos
      if currentpin = pos then
         
         if (GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT) OR (GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF) Then
           '/* Speed mode configuration */
          GPIOx.OSPEEDR = GPIOx.OSPEEDR and ( not (GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2)))
          GPIOx.OSPEEDR = GPIOx.OSPEEDR or (GPIO_InitStruct.GPIO_Speed << (pinpos * 2))
          
           ' /* Output mode configuration */
           GPIOx.OTYPER = GPIOx.OTYPER and ( not (GPIO_OTYPER_OT_0 << pinpos))
           GPIOx.OTYPER = GPIOx.OTYPER or (GPIO_InitStruct.GPIO_OType << pinpos)
         end if
        
        GPIOx.MODER = GPIOx.MODER and ( not (GPIO_MODER_MODER0 << (pinpos * 2)))

        GPIOx.MODER = GPIOx.MODER or (GPIO_InitStruct.GPIO_Mode << (pinpos * 2))

        '/* Pull-up Pull down resistor configuration */
        GPIOx.PUPDR = GPIOx.PUPDR and ( not (GPIO_PUPDR_PUPDR0 << (pinpos * 2)))
        GPIOx.PUPDR = GPIOx.PUPDR or (GPIO_InitStruct.GPIO_PuPd << (pinpos * 2))
         
      end if
   next pinpos
   
end sub

sub procedure GPIO_SetBits(dim byref GPIOx as GPIO_TypeDef, dim GPIO_Pin as word)
   GPIOx.BSRR = GPIO_Pin
end sub

sub procedure GPIO_ResetBits(dim byref GPIOx as GPIO_TypeDef, dim GPIO_Pin as word)
   GPIOx.BRR = GPIO_Pin
end sub

dim GPIO_InitStruct as GPIO_InitTypeDef

main:
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE) ' Включаем тактирование порта PB.

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1      ' Настройка вывода PB.1.
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT  ' Вывод работает как выход.
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP ' Двухтактный выход (т. е. не открытый сток).
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ' Подтягивающие резисторы отключены.
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz

    GPIO_Init(GPIOB, GPIO_InitStruct)  ' Инициализация порта.

    while TRUE
      GPIO_SetBits(GPIOB, GPIO_Pin_1)
      Delay_ms(500)
      GPIO_ResetBits(GPIOB, GPIO_Pin_1)
      Delay_ms(500)
    wend

end.

Код рабочий - светодиод мигает (размер прошивки 1168 байт). Файлы. http://pure-basic.narod.ru/forum_files/ … L_Lite.zip

+1

47

светодиод мигает = размер прошивки 1168 байт
афигеть...

0

48

Александр Д. написал(а):

Делают очередной аля-ПикСтик (интерпретатор в самом камне). Мол, МК ныне жирные, будет продавать уже МК с прошитыми загрузчиком + интерпретатор. Как МегаБейсик - там такая же идеология...
так что Баском ARM ясно пролетает

Вообще уже не первый год на этой штуке все АРМы работают (уже и не только), называется технология mbed, у меня есть такая игрушка, да очень удобная, но одна из главных проблем, которая возникает - это:

1. защита контента, её там просто нет, можно легко прошивку скопировать и залить в другой камень;
2. одна железка - один продукт, т.е. если нам нужно сделать таких устройств много нужно покупать целиком железку с предпрошитом загрузчиком;
3. на и в АВР явно будет проблема с ресурсами, там их и так не много (понятно, что у АРМов особо проблем с этим нет).

Александр Д. написал(а):

Да и Марк перестал отвечать почти 2 года назад... Страны СНГ не смотрятся покупателями: народ бедный (с точки зрения Европы), постоянно что-то просящий и при этом ворующий...

Это так - да, но Марк, когда задумывал (видимо) свой проект, не думал ничего о безопасности и в те времена, уровень был в районе DOSа.) Изначально не заложил современные системы защиты. Впрочем во всем мире это главная проблема и так, очень много денег вкладывается в защиту и её постоянно ломают, достаточно посмотреть на виндоусы, игрушки и даже игровые консоли...
В общем очень жаль будет, когда Баском умрёт. :(

0

49

Александр Д. написал(а):

афигеть...

Это не говорит об неэффективности компиляторов. МК 32 битные и всё (регистры, озу, flash и т. д.) находится в одном адресном пространстве размером 4 ГБ, т. е. адресация 4-ёх байтная.
Вектора прерываний тоже 4-ёх байтные. В STM32F030F4P6 их 49. 49*4=196. Почти 200 байт используется только на таблицу прерываний.
Инициализация STM32 сложнее чем у AVR что требует больше кода. Все это сказывается на размере прошивки.

0

50

Пётр, я понимаю логикой, но эмоции (в сравнении с 8-битками) - так и приёт )))

0

51

Так и памяти под прошивку тоже больше. Например в STM32F030F4P6 16 КБ (доступно 32 КБ). В STM32F103CBT6 128 КБ. Есть МК еще большим объемом, до нескольких мегабайт.

0

52

В STM32 часто встречается недокументированная память и периферия. :)
Выше уже писал что в STM32F103C8T6 128 КБ flash а не 64 как написано в документации. Выяснилось следующее. Выпускаются кристаллы с размером Flash 32 КБ, 128 КБ, 512 КБ, 1 МБ и т. д. Т. е. если заявлено что в МК 16 КБ, на самом деле в нем 32 КБ, а если заявлено что 256 КБ, то в МК 512 КБ flash.
Вообще кристаллов намного меньше чем моделей МК и например в STM32F101CBT6 есть недокументированный модуль USB (чем пользуются китайцы ставя МК с отладчик ST-LINK), т. к. на самом деле кристалл от STM32F103CBT6.
В STM32F030F4P6 не 16 КБ, а 32 КБ flash и имеются недокументированный таймер Tim2 (32-ух битный реверсивный счетчик :) с 16-ти битным предделителем и с четырьмя 32-ух битными каналами захвата/сравнения/ШИМ) и предположительно (не проверял) модуль I2S (не путать с I2C). Т. е. в МК кристалл от STM32F031F6P6.

0

53

Удивил, не знал.
Это маркетинг такой у ST? Типа клепаем всё одинаковое, а на выходе только маркировку ставим разную или там может реально при тестах на заводе выясняется, что часть памяти или ещё что, не отвечают требованиям (т.к. сказать брак производства и направление в нужную ветку/марку МК)?

0

54

Может отбраковка, а может они не тестируют часть памяти/периферии. Ведь на тестирование нужно время и чем меньше модулей/памяти тестируется тем быстрее оно проходит, а поскольку они выпускают МК в огромных количествах, то время тестирования имеет существенное значение. Получается что чем меньше тестирование занимает времени, тем больше МК могут выпустить и тем дешевле они стоят.

0

55

Решил сравнить AVR и STM32. :)  :tomato:
Для сравнения взял одни из самых простых моделей. AVR это ATtiny2313, а STM32 - STM32F030F4P6.
Среди AVR есть МК еще по проще, но выбрал именно ATtiny2313 по количеству выводов, которое такое же как в STM32F030F4P6.
Итак сравнение.

Параметр

ATtiny2313

ATxbanned6A4

STM32F030F4P6

STM32F103C8T6

Цена на Али партии из 10 штук

4.84$

26.63$

4.18$

11.8$

Разрядность, бит

8

8

32

32

Ядро

AVR Tiny

AVR XMEGA

ARM Cortex-M0

ARM Cortex-M3

Объем Flash/Ram/EEPROM, байт

2048 / 128 / 128

16384 / 2048 / 1024

16384 (32768) / 4096 / 0

65536 (131072) / 20480 / 0

Количество выводов/тип корпуса

20 / PDIP/SOIC/MLF

48 / TQFP48

20 / TSSOP20

48 / LQFP48

Количество линий ввода/вывода

18

34

15

37

Отладка

debugWIRE

PDI

SWD

SWD

Стоимость отладчика

121$

49$

2$

2$

Напряжение питания

5.0В

3.3В

3.3В

3.3В

Максимальная частота / разгон

20МГц / неизвестно

32МГц / неизвестно

48МГц / 96МГц

72МГц / 136 МГц

Bootloader прошитый при производстве

Нет

неизвестно

Есть (USART)

Есть (USART)

Число таймеров

3

5

5 + 1

4

Число каналов захвата/сравнения/ШИМ

4

6

11 + 4

16

Системный таймер

Нет

Нет

Есть

Есть

Часы реального времени (RTC)

Нет

Есть

Есть

Есть

Сторожевой таймер

IWDG

IWDG

IWDG и WWDG

IWDG и WWDG

Число каналов АЦП / разрядность

АЦП отсутствует

10 + 2 каналов / 12 бит

10 каналов / 12 бит

2 * 10 каналов / 12 бит

Число выборок в секунду АЦП

АЦП отсутствует

2000000 (2 миллиона)

1000000 (миллион)

1000000 (миллион)

Встроенный датчик температуры

Нет

Есть

Есть

Есть

Число модулей USART/I2C/SPI

1(UART)/1(USI)/1

5/2/2

1/1/1

3/2/2

Другие модули

AES / DES / DAC

CAN, USB

DMA

Нет

Есть

Есть

Есть

Встроенный компаратор

Есть

Есть

Нет

Нет

Динамическое изменение частоты

Нет

Есть

Есть

Есть

Модуль CRC

Нет

Нет

Есть

Есть

Постраничная защита Flash

Нет

Неизвестно

Есть

Есть

Поддержка приоритетов прерываний

Нет

Есть

Есть

Есть

Поддержка МК в баскоме

Есть

Есть

Нет

Нет

+3

56

а к чему это сравнение? МК разработаны в разных веках, даже тысячелетиях.... :)

для меня главное: среда разработки, наличие средств отладки (хотя бы программатор), описания (побольше, хотелось бы еще и на русском), наличие примеров использования, желательно 5-вольтовые входы/выходы.

А когда: среда другая (язык Си не вкурю до сих пор), наработки на англицском и куцо, описания по 3-5 документам разбросаны, да и выходы - 3вольта, то кайфа нет вообще...

Да и цена самого МК при цене разработки от $50 не важна, это важно когда партия хотя бы в 1000 изделий.

Отредактировано Александр Д. (2016-09-04 23:51:51)

0

57

100 раз говорил, сравнивать надо с ближайшем родственником - это XMega - это по аппаратной части и правильно всё сказал Александр Д. Развития направления AVR у Атмела давно не имеет той мощности как раньше, они сами давно пытаются продвигать свои ARM-ы, но судя по отзывам в инете - они никого не интересуют (как раз из-за STM). Кстати говоря, XMega возможно ещё даст прикурить по аппаратному насыщению и простоте использования. ;)
Ещё, коль начала сравнивать, где главное в таблице? Где значения потребления в разных режимах работы (хотя бы: рабочий режим и полный сон)?

0

58

Хмега хорошо, но дороги. Да и задач У МЕНЯ под них нет
Потребление важно там, где оно важно: питание устройства от аккумулятора, солнечных батарей, необслуживаемая техника....
а так проще не ставить лишний св.диод или изменить режимы работы другой периферии, даже те же pull-up резисторы поставить с большим сопротивлением...
Ну, и понизить тактовую МК до нужной.

0

59

Я всё писал автору сравнительной таблице.

ATtiny2313 - самый убогий и дешевый МК в линейке Атмела, держится только на 2К ОЗУ. Хоть бы ATtiny84 брали, там АЦП есть.) ИМХО

0

60

Александр Д. написал(а):

для меня главное: среда разработки

Для STM32 сред разработки (в т. ч. бесплатных) довольно много. Правда большинство из них для С/C++. Есть MikroBasic. Компилятор нормальный, но его библиотека функций оставляет желать лучшего. В большинстве случаев придется непосредственно работать с регистрами...

Александр Д. написал(а):

наличие средств отладки (хотя бы программатор)

Для STM32 с этим тоже проблем нет. Программатор/отладчик стоит 130 с копейками и позволяет не только прошивать, но и отлаживать программу в МК.
Если нужна только прошивка, то программатор не требуется. Достаточно COM порта, т. к. с завода в МК зашит USART загрузчик.

Александр Д. написал(а):

наличие примеров использования

Примеров хватает. Как в сети, так и в папке с библиотеками, где есть по несколько примеров использования каждого модуля периферии.

Александр Д. написал(а):

описания по 3-5 документам разбросаны

Лучше один документ содержащий 10 тысяч страниц?

Александр Д. написал(а):

желательно 5-вольтовые входы/выходы

Некоторые из входов толерантны к 5 вольт. В даташите написано какие.

Александр Д. написал(а):

Да и цена самого МК при цене разработки от $50 не важна, это важно когда партия хотя бы в 1000 изделий.

Я присмотрелся к STM32 не только из-за цены. Было несколько задач, которые на меге сделать было сложно, из-за малого функционала периферии. Фирма Atmel похоже тоже это осознала и выпустила XMega, в которой периферия заметно функциональнее.
Задачи в общем-то были не сложные. Необходимо было оцифровывать сигнал с частотой 100 КГц. И если на меге это еще можно было попытаться сделать уменьшив разрядность АЦП, но это создавало другую проблему - 100 тысяч прерываний в секунду для меги слишком много! Нужен модуль DMA, которого в ней нет...
Другая задача состояла в том чтобы не пропустить короткий импульс на INT во время выполнения другого прерывания, т. е. нужна поддержка прерывания внутри прерывания. Другими словами, нужна поддержка приоритетов прерываний.

100 раз говорил, сравнивать надо с ближайшем родственником - это XMega

Тогда уж сравнивать с AVR32...

Кстати говоря, XMega возможно ещё даст прикурить по аппаратному насыщению и простоте использования.

Для этого она должна продаваться на каждом углу (как сейчас меги) и для нее должен быть недорогой программатор/отладчик.

Ещё, коль начала сравнивать, где главное в таблице? Где значения потребления в разных режимах работы (хотя бы: рабочий режим и полный сон)?

Проверить сколько ест ATtiny2313 не могу из-за его отсутствия. :dontknow:

Потребление STM32 Разгон микроконтроллера
Оно сильно зависит от количества активной периферии.
В даташите есть таблицы.

Потребление в рабочем режиме при разной тактовой частоте.

http://se.uploads.ru/p00F6.png

Потребление в спящем режиме

http://sh.uploads.ru/K9l1T.png

ATtiny2313 - самый убогий и дешевый МК в линейке Атмела

Есть еще ATtiny13. :D
Я сравнивал самые примитивные МК.
STM32F030F4P6 это самый простой и дешевый среди STM32 так что все честно. :)

Хоть бы ATtiny84 брали, там АЦП есть.) ИМХО

Тогда можно было бы взять для сравнения с ним скажем STM32F070, у которого USB есть. :D

0