ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
1065286 Топик полностью
evgeniy1294 (28.12.2020 14:30, просмотров: 683) ответил General на Предлагаю спецам коллективно обозреть спектр китайских аналогов STM32 на предмет перспективности конкретных линеек (небольшое потребление, заменяемость)
Я колупаю GigaDevice, правда GD32VF103 (RISC-V), если рассматривать только периферию - можно считать клоном STM32F103. Их стандартная Firmware_Library (V1.0.2) мне не нравится, далее примеры: 

1) Нет адекватной реализации важных интрисиксов

2) Кривая реализация тех, что есть, например:


// file riscv_encoding.h (часть библиотеки от разработчиков ядра

#define CSR_MSTATUS 0x300


// Макрос для записи в регистры ядра

#define write_csr(reg, val) ({ \
  if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \
    asm volatile ("csrw " #reg ", %0" :: "i"(val)); \  // <- Тут вообще должен быть csrwi
  else \
    asm volatile ("csrw " #reg ", %0" :: "r"(val)); })


void foo()

{

   write_csr(CSR_MSTATUS, 0x2);  // <- Ошибка, так писать нельзя

   write_csr(mcause, 0x2);                 // <- А вот так можно

}



Сишный макрос, заставляющий вместо адресов регистров, определения которых есть(!), использовать мнемоники ассемблера. Автору кода можно поаплодировать.


Ещё ошибки:

// file n200_timer.h
#define TIMER_REG(offset)         _REG32(TIMER_CTRL_ADDR + offset)



Разумеется, определения _REG32 нигде нет. Зато в основном заголовке есть вот это:

// file gd32fv103.h
#define REG32(addr)                  (*(volatile uint32_t *)(uint32_t)(addr))// Близко, но нет)


Ещё немного говна:

// file gd32fv103.h
typedef enum {FALSE = 0, TRUE = !FALSE} bool;




И ещё:

// file gd32fv103.h

 /* define value of high speed crystal oscillator (HXTAL) in Hz */
 #if !defined  HXTAL_VALUE  
   #ifdef GD32VF103R_START
   #define HXTAL_VALUE    ((uint32_t)25000000) /*!< value of the external oscillator in Hz */
   #define HXTAL_VALUE_8M  HXTAL_VALUE
#elif defined(GD32VF103V_EVAL) || defined(GD32VF103C_START) || defined(GD32VF103T_START)
   #define HXTAL_VALUE    ((uint32_t)8000000) /*!< value of the external oscillator in Hz */
   #define HXTAL_VALUE_25M  HXTAL_VALUE
   #else
   #error "Please select the target board type used in your application (in gd32vf103.h file)"
   #endif
 #endif /* high speed crystal oscillator value */

Для тех, кто не понял: в заголовке с описанием регистров проца требуют определения частоты кварца. Авторы видимо предполагали, что её будут использовать в файле system_gd32vf103.c, но я не использую эту концепцию - у меня стартапы на с++, а для настройки PLL применяются шаблоны.


У ST все по уму (пусть и не очень большому):

// file system_stm32f4xx.h

extern uint32_t SystemCoreClock;          /*!< System Clock Frequency (Core Clock) */


Все вынесено в отдельный файл и объявлено как extern. Не хочешь - не пользуйся, мешать не будет.


Вообщем - говно. Причем аналогичные проблемы у них и в библиотеках для чипов на cortex-m.


3) Библиотека не дает полного описания ядра. Приходится дописывать в свою либину.


4) Нет открытых репозиториев - я не могу предложить им исправления или написать issue. Пока ограничился внедрением в свою библиотеку кода для работы с CSR.