Я колупаю 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.