IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 移植完整版RT-Thread到GD32F4XX(详细) -> 正文阅读

[嵌入式]移植完整版RT-Thread到GD32F4XX(详细)

主要参考文档:rt-thread-master\rt-thread-master\bsp\gd32\docs\GD32系列BSP制作教程.md

GD32F4xx_Firmware_Library_User_Guide_V1.0.pdf

GD32F4xx_yonghushouce_Rev2.6.pdf

GD32F427xx_Datasheet_Rev1.0.pdf

GD32407R_START_Demo_Suites

过程中的关键点:

  1. RT-Thread完整版和nano的区别
  2. 移植的具体哪个型号,要据此修改配置文件
  3. 注意标准库和rt-thread间的匹配,可能版本不一样,前者在兆易创新官网找,后者在rt-thread开源仓库找
  4. 标准库和rt-thread间的过度库移植自gdf103,所以版本一样也可能库不兼容,在下面的坑描述会提到
  5. 主要修改的文件:SConscript、SConstruct、Kconfig,这些分布在各个子文件夹中

注意事项:

  1. 如果把rt-thread-master中的例程移植到别的地方,注意修改bsp/gd32/gd32407v-start/Kconfig中的路径相关内容,比如default “…/…/…” source “…/libraries/Kconfig” source “board/Kconfig”,修改为自己的相对位置

  2. bsp/gd32/gd32407v-start/SConstruct中的路径相关内容要修改比如,RTT_ROOT = os.path.normpath(os.getcwd() + ‘/…/…/…’)

  3. bsp/gd32/gd32407v-start/board/linker_scripts/link.sct中的flash和ram地址要根据手册提供的具体大小进行修改,并且和keil的 Read/Only Memory Areas设置一致

  4. 移植完成后记得复制rtconfig.py文件过来,否则在控制台使用scons的时候会报错

  5. 注意单片机flash分几块,ram分几块区域:仿真调试一直卡在rt_hw_hard_fault_exception,在rt_system_heap_init的时候报错,

    修改board.h里面的GD32_SRAM_SIZE从256改为192 因为两个ram不连续,另外64kb从0x10000000开始

  6. 官方没有提供GD32f425或者427的库的话,可以选择f405或者407,基本可以替代

  7. 每次用rtt的工具设置后都要求添加某个路径,即便之前已经在keil中添加过了;路径要在使用env前在文件对应文件夹下的SConscript中进行添加,比如path = [cwd] path += [cwd + ‘/CubeMX_Config/Core/Inc’]

  8. Error: L6200E: Symbol __rt_init_cpu_usage_init multiply defined (by cpu_usage-v1.0.0_cpu_usage.o and cpu_usage.o). 去掉packages文件夹里面的cpu_usage-latest文件夹,或者其它类似的packages文件夹里有两个不同版本的第三方包问题

  9. 如果把rt_components_board_init和rt_components_init和屏蔽了,INIT_BOARD_EXPORT和其它类似函数是不起作用的

一、在rt-thread环境下移植外设到GD32

  1. 如果在RT-Thread env工具的menuconfig中找不到对应内容,要按照固定格式编辑board中的Kconfig文件

  2. 外设号在stm32的基础上统一减一,从0开始,比如stm32的串口1对应gd32的串口0,stm32的串口2对应gd32的串口1,以此类推;stm32的iic1对应gd32的iic0;stm32的spi1对应gd32的spi0;stm32的pwm1对应gd32的pwm0;stm32的timer1对应gd32的timer0;stm32的adc1对应gd32的adc0;stm32的dac1对应gd32的dac0;其它外设以此类推

  3. 下述一些问题的共同点是rt-thread的过渡函数和gd32的新标准库匹配不上

    ?

    一、移植看门狗/RTC到GD32

    1. drv_wdt.c 中 “RCU_IRC40K” is undefined,经查阅手册,没有40k内部时钟,改为RCU_IRC32K

    2. 添加WWDG_IRQn定义,HAL_NVIC_DisableIRQ改为NVIC_DisableIRQ,HAL_NVIC_ClearPendingIRQ改为NVIC_ClearPendingIRQ

      #define  WWDG_IRQn             0     // Window WatchDog Interrupt 
      
    3. 在watchdog_init中添加rt_device_init(wdg_dev);

    4. rcu_periph_clock_enable(RCU_BKPI);中的RCU_BKPI找不到定义,经查阅用户手册应为RCU_BKPSRAM

    5. board\board.c(31): error: #20: identifier “RTC_HandleTypeDef” is undefined 去掉其定义,用标准库替代

    6. 修改获取时间戳get_rtc_timestamp的内部实现为rtc_timestamp_subsecond_get();

    7. 添加设置时间戳函数rtc_timestamp_subsecond_set(rtc_counter); 重新实现set_rtc_timestamp

      void rtc_timestamp_subsecond_set(uint32_t time_stamp)
      {
          SSTS_SSC(time_stamp);
      }
      
      static rt_err_t set_rtc_timestamp(time_t time_stamp)
      {
          uint32_t rtc_counter;
      
          rtc_counter = (uint32_t)time_stamp;
      	rtc_timestamp_subsecond_set(rtc_counter);//add by yf
      
          return RT_EOK;
      }
      

    ?

    ?

    二、移植ADC/DAC到GD32

    1. adc配置时报错libraries\gd32_drivers\drv_adc.c(61): error: #20: identifier “GPIO_MODE_AIN” is undefined:error所在行的函数和参数都不对,改为 gpio_mode_set(PIN_GDPORT(pin), GPIO_MODE_ANALOG, GPIO_OSPEED_50MHZ, PIN_GDPIN(pin));//bug gpio_init - gpio_mode_set GPIO_MODE_AIN - GPIO_MODE_ANALOG
    2. adc_deinit(adc_periph);显示error: #140: too many arguments in function call 去掉adc_periph可解决
    3. adc_external_trigger_source_config(adc_periph, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);中的ADC0_1_2_EXTTRIG_REGULAR_NONE找不到定义,将其暂时改为ADC_EXTTRIG_REGULAR_T0_CH0,并将上面的规则组外部触发使能改为不使能
    4. adc_regular_channel_config(adc_periph, 0, channel, ADC_SAMPLETIME_239POINT5);中的ADC_SAMPLETIME_239POINT5未定义 将ADC_SAMPLETIME_239POINT5 改为 ADC_SAMPLETIME_480
    5. rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);找不到定义,改为rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV8);
    6. adc_mode_config(ADC_MODE_FREE);找不到定义,改为adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT);
    7. gd32未提供drv_dac文件,需手动实现(具体实现文件在工程中搜drv_dac.c),drv_dac比drv_pwm实现简单,实现过程的一些记录
      1. Kconfig及dac相关文件的DAC1\2改为0\1,并开启DAC0
      2. 添加drv_dac.c、drv_dac.h和dac_config.h文件
      3. 添加HAL_DAC_StateTypeDef、DAC_HandleTypeDef及其它dac相关的结构体和宏定义,暂时去掉DMA相关内容
      4. 添加gd32_dac_enabled和gd32_dac_disabled函数
      5. 添加gd32_set_dac_value和gd32_dac_init函数,注意dac的两个引脚对应通道是固定的
      6. 在Kconfig中添加DAC的设备名字和通道选择

    ?

    ?

    三、移植内部flash操作到GD32

    1. fal_flash_stm32l4_port.c文件需要适配gd32
    2. rt_sfud_flash_probe(SPI_FLASH_CHIP, SPI_FLASH_DEVICE_NAME)中的SPI_FLASH_CHIP找不到定义,将SPI_FLASH_CHIP改为自己外部flash芯片的名字或者规定名字
    3. drv_flash需手动实现(具体实现文件在工程中搜drv_flash.c和fmc_operation.c),用于对片内和片外flash的访问读写等操作,实现过程的一些记录
      1. 添加drv_flash源文件和头文件
      2. 在gd32驱动库脚本中添加drv_flash.c路径,修改SOC_SERIES_STM32L4为SOC_SERIES_GD32F4xx
      3. 在gd32标准库脚本中添加gd32f4xx_fmc.c路径
      4. 添加fmc_operation头文件和源文件及脚本路径
      5. stm32_onchip_flash中的FLASH_PAGE_SIZE改为SIZE_4KB,gd32只有少数芯片支持页擦除即4k擦除,如果是不支持页擦除的芯片不可以用SIZE_4KB,要根据块来定,不同位置的块大小不一样
      6. 添加flash起始和结束地址
      7. 重写fal_flash_read、fal_flash_write函数
      8. 添加fal_flash_erase函数
      9. 将fal_flash_stm32l4_port.c改为fal_flash_gd32f4_port.c,并在脚本中添加路径
      10. 添加get_page和fmc_page_erase函数
      11. 添加FMC_PECFG和FMC_PEKEY寄存器
      12. 添加UNLOCK_PAGE_KEY定义
      13. 在flash读写操作中添加操作状态返回

    ?

    四、移植外部flash操作及spi到GD32

    1. spi底层未初始化正确,会卡在rt_assert_handler,assertion failed at function:rt_hw_spi_device_attach, line number:419 ,即注册失败,可能原因是序号错误、引脚定义或复用错误
    2. 报错:“no source”: Error: #219: error while deleting file “.\build\keil\obj\gd32_drivers_drv_spi.d”: Permission denied;原因是每次通过env生成过程的时候会自动加入gd32_drivers_drv_spi.c文件,找了各个构建文件都没有这个文件,但是显示到了keil的project上,没法打开,也不存在这个文件; 解决方法:将gd32_drivers_drv_spi.c去掉或者禁止编译
    3. libraries\gd32_drivers\drv_spi_flash.c(89): error: At end of source: #65: expected a “;” 在INIT_COMPONENT_EXPORT(rt_hw_spi_flash_with_sfud_init)后面加一个;
    4. 缺少stm32_onchip_flash的定义,gd32_drivers没有drv_flash文件夹,暂时将stm32_onchip_flash也改为nor_flash0
    5. 没有板载flash或者flash损坏情况会卡在sfud_device_init(sfud_dev)这里,错误原因是SFUD_ERR_NOT_FOUND,为了后续测试可以先屏蔽此错误(屏蔽rt_sfud_flash_probe(“xxxxx”, xxxxx_SPI_DEVICE_NAME))

    ?

    ?

    五、移植定时器和时钟配置

    1. GD32标准库没有drv_pwm文件,暂不支持DMA和捕获,手动实现(具体实现文件在工程中搜drv_pwm.c),实现过程的一些记录
      1. 修改gd32_drivers的SConscript文件,添加手动实现的pwm源文件及drv_log头文件
      2. 修改Kconfig以适配不同库对同一外设的不同命名,比如BSP_USING_TIM改为BSP_USING_HWTIMER
      3. 修改标准库的脚本文件添加gd32f4xx_timer.c
      4. 按着标准库提供的文件添加TIM_HandleTypeDef定义,暂时去掉DMA相关的内容
      5. 添加pwm_config头文件,修改其中.tim_handle.Instance为gd32标准库格式并添加定时器0
      6. 修改HAL_TIM_ActiveChannel定义
      7. 使用移位实现__HAL_TIM_GET_CLOCKDIVISION等简单hal函数
      8. 使用gd32库函数重新实现_HAL_TIM_SET_PRESCALER、_HAL_TIM_SET_AUTORELOAD、__HAL_TIM_SET_COUNTER、__HAL_TIM_GET_COMPARE等复杂一些函数
      9. 根据GD32时钟树及hal库逻辑重写drv_pwm_get和drv_pwm_set函数(只适配了f4)
      10. 未找到HAL_TIM_GenerateEvent对应的替代函数,暂时使用timer_disable和timer_enable代替
      11. 替代TIM_OC_InitTypeDef和__HAL_TIM_URS_ENABLE,未找到TIM_MasterConfigTypeDef和TIM_ClockConfigTypeDef的替代
      12. HAL_TIM_Base_Init替换为timer_init,timer_init没有初始化失败返回,未找到HAL_TIM_PWM_Init替代,注意gd32库中基本没有pwm的定义,取而代之的是TIMER channel output的定义
      13. 替代pwm初始化关于时钟源相关的配置
      14. 将timer0添加到CK_APB2判断中(需要查看数据手册的时钟树)
      15. HAL_TIMEx_MasterConfigSynchronization未找到替代,应该是输入捕获相关的,暂不需要实现
      16. 参考hal_msp文件实现pwm输出引脚映射函数GD32_TIM_MspPostInit(TIM_HandleTypeDef* htim),没有cubemx了,这个函数每次更换引脚后要手动更新
      17. 修改pwm_get_channel函数中数据填充内容
      18. 按照hal库的stm32_hw_pwm_init逻辑重新实现gd32_hw_pwm_init
      19. pwm的时间不对,1khz出来4khz,修改分频clockdivision不起作用,将分频prescaler扩大4倍起作用
      20. gd32库未提供pwm单通道开关函数(用的另一种方式实现,但这种方式和rt-thread的调用顺序相违背),只有某定时器开关函数,暂不实现对pwm单通道的开关,默认设置pwm后自动输出

    ?

    六、其它

    1. 修改I2C0驱动不兼容的问题,I2C4_BUS_CONFIG修改为I2C0_BUS_CONFIG
    2. GPIO相关的一些重映射
#define GPIO_PIN_RESET       RESET
#define GPIO_PIN_SET         SET

#define HAL_GPIO_WritePin(GPIOx, GPIO_Pin, PinState)   gpio_bit_write(GPIOx, GPIO_Pin, PinState)
#define HAL_GPIO_ReadPin(GPIOx, GPIO_Pin)    gpio_input_bit_get(GPIOx, GPIO_Pin)

#define __HAL_RCC_GPIOA_CLK_ENABLE() rcu_periph_clock_enable(RCU_GPIOA)  
#define __HAL_RCC_GPIOB_CLK_ENABLE() rcu_periph_clock_enable(RCU_GPIOB)

#define HAL_GPIO_DeInit(GPIOx, GPIO_Pin)   __NOP  //gpio_deinit(GPIOx)  gd32没有初始化单个引脚,只有port

#define HAL_Delay(Delay)   rt_thread_mdelay(Delay) 
  1. 一些外设测试函数
//test	OTA	
			extern void rt_fota_init(void);
            rt_fota_init();
			
//test	adc		
			extern int16_t get_adc_temperature_value(void);
			uint16_t vol = get_adc_temperature_value();
            LOG_I("the controller temperature is :%dmV", vol);
			
//test	dac	
		rt_dac_device_t dac_dev = (rt_dac_device_t)rt_device_find(BSP_USING_RF_PA_VBIAS_DAC_DEVICE_NAME);
		if (dac_dev == RT_NULL)
		{
			LOG_E(find_device_Err, BSP_USING_RF_PA_VBIAS_DAC_DEVICE_NAME);
		}
		rt_dac_enable(dac_dev, BSP_USING_RF_PA_VBIAS_DAC_DEVICE_CHANNEL);
		for(uint16_t i=0; i<4095; i++)	
		{
			rt_thread_mdelay(10);
			rt_dac_write(dac_dev, BSP_USING_RF_PA_VBIAS_DAC_DEVICE_CHANNEL, i);
		}	
//test	pwm
		rt_pwm_set(pwm_device, TIMER_CH_0, LED_STATE_PERIOD, LED_STATE_PERIOD/2);//设置pwm设备的TIMER_CH_0通道	
			
//test	wkup
			rt_thread_mdelay(2000);
			LOG_I("enter standbymode");
			rt_thread_mdelay(2000);
			Sys_Enter_Standby();
			LOG_I("out standbymode");
			
//test	gpio
		rt_pin_write(LEDR_PIN, PIN_LOW);
		rt_thread_mdelay(1000);
		rt_pin_write(LEDR_PIN, PIN_HIGH);	
		extern rt_uint8_t key_up_read_pin();
		uint8_t IO = key_up_read_pin();
      LOG_I("the io state is :%d", IO);

?

?

二、在rt-thread环境下移植HAL库到GD32

  1. GD32也可以使用hal库,但是异常比较多,可以使用标准库,把之前的hal库的函数用类似的标准库函数替代

  2. CubeMX_Config文件夹的内容需要做适配,不用hal也要适配,否则找不到main.h文件(board\CubeMX_Config\Core\Inc\main.h)

  3. stm32l4xx_hal.h文件和gd32f30x.h不一样,gd32f30x.h和stm32l476xx.h一样是地址映射相关的内容

  4. libraries\GD32F30x_Firmware_Library\CMSIS\GD\GD32F30x\Include\gd32f30x.h(115): error: #101: “NonMaskableInt_IRQn” has already been declared in the current scope:出现上述错误是因为重定义了,需要把CubeMX_Config文件中的l4相关的内容去掉

  5. 报错 #error “Please select the target GD32F4xx device in gd32f4xx.h file”,是因为标准库没有定义GD32F42x,需要在keil的宏定义里面点击魔术棒->C/C++/Define,添加GD32F405,或者修改board文件夹下面的SConscript文件中的GD32F425为GD32F405(这是长久生效的方法),F405和407是最接近的

  6. 修改引用头文件stm32l4xx.h为gd32f4xx.h

  7. 直接复制移植HAL_StatusTypeDef定义

  8. libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Include\gd32f4xx.h(292): error: #40: expected an identifier

    typedef enum {FALSE = 0, TRUE = !FALSE} bool; 参考解决方法,省流:重复定义了

  9. GPIO_MODE_AF_PP显示未定义 原因:SOC_SERIES_GD32F4xx未定义导致"gd32f4xx_gpio.h"未被添加进来,解决方法:board\Kconfig文件config SOC_SERIES_GD32F425RG改为SOC_SERIES_GD32F4xx

  10. 重新实现SystemClock_Config

    void SystemClock_Config(void)
    {
        SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
    	  systick_clksource_set(SYSTICK_CLKSOURCE_HCLK);
        NVIC_SetPriority(SysTick_IRQn, 0xFF);
    }
    
  11. 重新实现进入低功耗函数Sys_Enter_Standby

    int Sys_Enter_Standby(void)
    {	
    	rcu_periph_clock_enable(RCU_PMU);
    	pmu_wakeup_pin_enable();
    	pmu_to_standbymode(WFI_CMD);   //notice:WFI need EXTI interrupt wakeup	
    	
    	return 0;
    }
    
  12. 注意stm32l476有5个wkup唤醒源引脚,gd32只有一个PA0引脚做待机唤醒用

  13. gd32没有实现类似HAL_PWREx_DisablePullUpPullDownConfig的函数,即gd32没有进入待机模式后锁定某个引脚状态的功能

  14. 移植获取uid的相关定义

    #define UID_BASE              (0x1FFF7A18UL)        /*!< Unique device ID register base address */
    #define READ_REG(REG)         ((REG))
    #define HAL_GetUIDw0          (READ_REG(*((uint32_t *)UID_BASE)))
    #define HAL_GetUIDw1          (READ_REG(*((uint32_t *)(UID_BASE + 4U))))
    #define HAL_GetUIDw2          (READ_REG(*((uint32_t *)(UID_BASE + 8U))))
    
  15. 将__HAL_PWR_GET_FLAG(PWR_FLAG_SB)替换为pmu_flag_get(PMU_CS_STBF)

  16. 将__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);替换为pmu_flag_reset(PMU_FLAG_RESET_STANDBY);

  17. 将HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN5);改为pmu_wakeup_pin_disable();

  18. HAL_RCC_DeInit改为rcu_deinit

三、在rt-thread环境下移植bootloader/OTA到GD32

  1. rt-thread的bootloader不开源,可参考及移植的开源项目https://toscode.gitee.com/Aladdin-Wang/RT-FOTA-STM32L431和https://gitee.com/spunky_973/rt-fota?_from=gitee_search

  2. 添加或者去掉bootloader时需要修改\board\linker_scripts\link.sct,或者点击keil->options->linker->scatter file->edit,修改LR_IROM1和ER_IROM1的起始地址,比如bootloader占256k,就改为0x08040000

  3. 程序中关于中断偏移的要修改,正常的话就nvic_vector_table_set(NVIC_VECTTAB_FLASH, 0);偏移256k的话就 nvic_vector_table_set(NVIC_VECTTAB_RAM, 0x40000);或者沿用自己的方式

  4. SCB->VTOR在单片机的数据手册找不到,可以取M4内核编程手册上查找

  5. RF-FOTA开源移植过程的一些记录

    1. 打开ymodem配置,为了方便开关ota功能,在kconfig中添加PKG_USING_YMODEM_OTA相关定义,用于开启rf_fota.h中关于ota的宏定义,并修改fm_area为下载分区,df_area为工程文件分区

      #ifdef PKG_USING_YMODEM_OTA
      
      #define RT_USING_SPI
      #define RT_USING_SFUD
      #define RT_SFUD_USING_SFDP
      #define RT_SFUD_USING_FLASH_INFO_TABLE
      #define RT_USING_WDT
      
      /* FOTA application partition name */
      #ifndef RT_FOTA_APP_PART_NAME
      #define RT_FOTA_APP_PART_NAME   "app"
      #endif
      
      /* FOTA download partition name */
      #ifndef DEFAULT_DOWNLOAD_PART_NAME
      #define DEFAULT_DOWNLOAD_PART_NAME    "download"
      #endif
      
      /* FOTA default partition name */
      #ifndef DEFAULT_FACTORY_PART_NAME
      #define DEFAULT_FACTORY_PART_NAME    "factory"
      #endif
      
      /* AES256 encryption algorithm option */
      #define RT_FOTA_ALGO_AES_IV  	"0123456789ABCDEF"
      #define RT_FOTA_ALGO_AES_KEY 	"0123456789ABCDEF0123456789ABCDEF"
      
      /* RT-FOTA module define */
      #define RT_FOTA_SW_VERSION      "1.0.0"
      
      #endif
      
      #define FAL_PART_TABLE                                                               \
      {                                                                                    \
          {FAL_PART_MAGIC_WORD,    "bl",          "onchip_flash",                0*128*1024,    128*1024, 0}, \
          {FAL_PART_MAGIC_WORD,    "app",         "onchip_flash",                2*128*1024,    256*1024, 0}, \
          {FAL_PART_MAGIC_WORD,    "download",    "onchip_flash",                4*128*1024,    256*1024, 0}, \
          {FAL_PART_MAGIC_WORD,    "factory",     "onchip_flash",                6*128*1024,    256*1024, 0}, \
      }
      
      

      ?

    2. 添加FastLZ库、QuickLZ库、 SignalLed库,这些库在fota上用

    3. 因为用的是片内flash升级,开源是片外的,为了省一些bin的大小,去掉片外相关的内容,比如sfud和nor_flash0

    4. 屏蔽掉fal库中fal_flash_sfud_port.c的内容

    5. 添加WWDG_IRQn定义,定义为0

    6. HAL_RCC_DeInit();改为rcu_deinit();

    7. 重新实现HAL_DeInit(); – 添加复位所有外设的实现,复位之后清除复位标志,未找到复位时钟,例

      	rcu_periph_reset_enable(RCU_GPIOARST);
      	rcu_periph_reset_disable(RCU_GPIOARST);
      	·····
      
    8. 原工程未定义按键恢复出厂及按键时间,可以加上

    9. 因为是从原gd32工程复制过来修改成bootloader的,注意修改中断偏移和link.sct、各个线程的顺序和一些重要参数(比如rt_system_scheduler_init、rt_hw_board_init)的一致性,尽量把之前没用的外设关掉,没用的文件输出,保证bootloader的精简

    10. 打开“Options for target…”->“target”勾选“Use MiclroLIB”,否则一仿真就在BEAB BKPT 0xAB

    11. 添加是否进入shell mode的提示,打开FAL_DEBUG

    12. GD32的FMC读取一次最多256字节,OTA搬移的时候一次需要4k,fmc_read_8bit_data的读取长度改为32位

    13. 将fmc_write_8bit_data中的擦除函数去掉,因为在fal_flash_erase中重定义fal_flash_erase了,否则会crc校验错误

    14. 通过Xshell进入控制台后,发送ymdown -p factory可以直接将rbl文件升级到工厂固件区

    15. FOTA未实现加密功能,https://gitee.com/spunky_973/rt-fota/issues/I41CTW这里面有实现

    16. 其它一些issues见https://toscode.gitee.com/Aladdin-Wang/RT-FOTA-STM32L431/issues/I1S58N和https://gitee.com/spunky_973/rt-fota/issues

    17. 移植的rbl文件如果打不开,可以添加.bin的后缀,使用STM32 ST-LINK Utility或者BCompare.exe打开

    18. 在这里插入图片描述

四、移植GD32遇到的和程序无关keil报错

  1. browse information of one or more file is not available:.\xx\xxxx.c,解决方法:注释再取消注释文件 ①全选文件中的代码,按下注释键,编译 ②再全选,按下取消注释,问题就解决了
  2. 插上jlink报错没识别到f427,会自动跳出一个页面选择,这时候选择f407rg可以互相兼容
  3. keil显示encountered an improper argument,后台中止重新启动
  4. 打开“Options for target…”->“target”勾选“Use MiclroLIB”,否则一仿真就在BEAB BKPT 0xAB

五、移植过程中添加的pwm驱动、dac驱动、flash驱动、OTA例程

本来想给上传到rt-thread的github库,但之前没上传过别人的库,也没有做其它型号芯片的兼容,所以发到博客上吧

博客链接待补充······

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-06-23 00:59:08  更:2022-06-23 00:59:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:51:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码