loutin 发表于 2022-2-27 09:57

N32替换STM32记录

一、工程配置



1.安装硬件库

硬件库为厂家提供的资料,如下图所示,双击安装,使得keil能够找到该芯片。


https://file.**/web2/M00/0D/90/pYYBAGEDHB6ATX9UAABigpQhzls250.png


2.更改J-Flash配置

由于Keil官方没有对该芯片的支持,所以J-Link下载时也无法找到该芯片,所以需要手动添加芯片。更改步骤官方提供有说明文档。


https://file.**/web2/M00/0D/8A/poYBAGEDHCKAYj3NAACr7x68rPM186.png


主要步骤是:


[*]修改JLinkDevices 配置文档
[*]添加Nationstech 的下载算法文件
[*]添加Nationstech 的JFlash 工程文件
[*]添加解锁Nationstech 芯片读保护L1 等级的应用程序
进行如上步骤后,启动J-Flash就能够扫描并连接到芯片,但是有可能keil链接的J-Flash和安装的J-Flash不是一个路径,所以将配置好的J-Flash文件替换keil下Keil5\ARM\Segger目录文件,就能够正常下载调试。
3.更改芯片



https://file.**/web2/M00/0D/90/pYYBAGEDHCaAKu_NAAIDY0HM0mc431.png


4.添加驱动文件

将N32的底层驱动库拷贝到工程目录下,并将include路径添加进去。


https://file.**/web2/M00/0D/90/pYYBAGEDHCuAIU9NAAC-youdbPs604.png




https://file.**/web2/M00/0D/90/pYYBAGEDHC-AAOHVAAFsCqIKKxM176.png


5.更改全局变量



https://file.**/web2/M00/0D/8A/poYBAGEDHDOAYffgAAIrFjYdS6w908.png


6.将启动文件和驱动文件替换为N32库文件



https://file.**/web2/M00/0D/8A/poYBAGEDHDiAOBA4AACfFrf6msM981.png


7.将所有的stm32l1xx替换为n32g45x

二、底层驱动函数接口对照表

更改代码,将STM32的驱动函数替换为N32的驱动函数,这部分比较繁琐,需要慢慢替换,下面是我整理的替换对照表。

STM32名称N32名称

USART_TypeDef


RCC_AHBPeriphClockCmdRCC_EnableAHBPeriphClk

RCC_APB1PeriphClockCmdRCC_EnableAPB1PeriphClk

RCC_APB2PeriphClockCmdRCC_EnableAPB2PeriphClk

RCC_APB1Periph_UART5RCC_APB1_PERIPH_UART5

RCC_AHBPeriph_GPIOBRCC_AHB_PERIPH_GPIOB





GPIO_InitTypeDefGPIO_InitType

GPIO_PinPin

GPIO_Mode_AFGPIO_Mode_AF_PP

GPIO_Mode_OUTGPIO_Mode_Out_PP

GPIO_Speed_40MHzGPIO_Speed_50MHz

GPIO_InitGPIO_InitPeripheral

GPIO_PinSource0GPIO_PIN_SOURCE0

GPIO_PinAFConfig无需配置该位

GPIO_AF_SPI1






USART_InitTypeDefUSART_InitType

USART_TypeDefUSART_Module

USART_BaudRateBaudRate

USART_WordLengthWordLength

USART_ParityParity

USART_StopBitsStopBits

USART_HardwareFlowControlHardwareFlowControl

USART_ModeMode

USART_WordLength_8bUSART_WL_8B

USART_Parity_NoUSART_PE_NO

USART_StopBits_1USART_STPB_1

USART_HardwareFlowControl_NoneUSART_HFCTRL_NONE

USART_Mode_RxUSART_MODE_RX

USART_Mode_TxUSART_MODE_TX

USART_IT_RXNEUSART_INT_RXDNE

USART_IT_IDLEUSART_INT_IDLEF

USART_FLAG_TCUSART_FLAG_TXC

USART_FLAG_RXNEUSART_FLAG_RXDNE





USART_ITConfigUSART_ConfigInt

USART_CmdUSART_Enable

USART_GetITStatusUSART_GetIntStatus





SPI_InitTypeDefSPI_InitType

SPI_DirectionDataDirection

SPI_ModeSpiMode

SPI_DataSizeDataLen

SPI_CPOLCLKPOL

SPI_CPHACLKPHA

SPI_NSSNSS

SPI_BaudRatePrescalerBaudRatePres

SPI_FirstBitFirstBit

SPI_CRCPolynomialCRCPoly

SPI_Direction_2Lines_FullDuplexSPI_DIR_DOUBLELINE_FULLDUPLEX

SPI_Mode_MasterSPI_MODE_MASTER

SPI_DataSize_8bSPI_DATA_SIZE_8BITS

SPI_CPOL_LowSPI_CLKPOL_LOW

SPI_CPHA_1EdgeSPI_CLKPHA_FIRST_EDGE

SPI_NSS_SoftSPI_NSS_SOFT

SPI_BaudRatePrescaler_2SPI_BR_PRESCALER_2

SPI_FirstBit_MSBSPI_FB_MSB

SPI_I2S_FLAG_RXNESPI_I2S_RNE_FLAG

SPI_I2S_FLAG_TXESPI_I2S_TE_FLAG

SPI_I2S_GetFlagStatusSPI_I2S_GetStatus

SPI_SendDataSPI_I2S_TransmitData

SPI_ReceiveDataSPI_I2S_ReceiveData

SPI_CmdSPI_Enable





FLASH_FLAG_PGAERRFLASH_FLAG_PGERR

FLASH_FLAG_SIZERR


FLASH_FLAG_OPTVERRFLASH_FLAG_OPTERR

FLASH_FLAG_OPTVERRUSR


FLASH_COMPLETEFLASH_COMPL

FLASH_ErasePageFLASH_EraseOnePage

FLASH_FastProgramWordFLASH_ProgramWord

FLASH_StatusFLASH_STS

DATA_EEPROM_ProgramWordFLASH_ProgramWord

DATA_EEPROM_UnlockFLASH_Unlock





IWDG_WriteAccessCmdIWDG_WriteConfig

IWDG_SetPrescalerIWDG_SetPrescalerDiv

IWDG_SetReloadIWDG_CntReload

IWDG_WriteAccess_EnableIWDG_WRITE_ENABLE

IWDG_Prescaler_64IWDG_PRESCALER_DIV64

IWDG_ReloadCounterIWDG_ReloadKey





TIM_TimeBaseInitTypeDefTIM_TimeBaseInitType

TIM_CounterModeCntMode

TIM_ClockDivisionClkDiv

TIM_PeriodPeriod

TIM_PrescalerPrescaler

TIM_CKD_DIV1TIM_CLK_DIV1

TIM_CounterMode_UpTIM_CNT_MODE_UP





TIM_TimeBaseInitTIM_InitTimeBase

TIM_GetITStatusTIM_GetIntStatus

TIM_PSCReloadMode_ImmediateTIM_PSC_RELOAD_MODE_IMMEDIATE

TIM6->CR1TIM6->CTRL1

TIM6->SRTIM6->STS

TIM6->EGRTIM6->EVTGEN

TIM6->ARRTIM6->AR

三、踩坑记录

经过上面的替换,应该可以编译过去了,但是这指示开始,后面悲剧的踩坑大战才刚刚开始。
1.仿真卡死

程序仿真卡死,单步调试发现卡死在OSInit()函数里面,这个函数是OS的初始化函数,所以应该是OS配置的问题,排查下来发现是启动文件里面的OS启动项没有更改,更改如下:


https://file.**/web2/M00/0D/90/pYYBAGEDHDyAHXv8AAF8PpmbzXQ489.png


2.DMA配置出错

程序能够进入到任务中后,调试发现无法进入到串口接收中断,但是示波器中有数据,而且中断都没有进入,应该是卡死在优先级高的中断中,排查发现,是DMA发送中断的配置有问题,导致一直卡死在DMA中断中。下面是DMA部分的配置。


https://file.**/web2/M00/25/C2/pYYBAGG4FoiAFJ7yAAC_sIRLtns536.jpg




https://file.**/web2/M00/0D/8A/poYBAGEDHESALvTdAACINzU_zw0678.png


3.Flash配置

由于国民芯片和STM32芯片的FLASH划分有区别,所以FLASH的替换是比较费事的部分,先对比一下两个片子的区别:
STM32L151的flash部分:


https://file.**/web2/M00/0D/90/pYYBAGEDHEmAZjgrAAF1HTMOm0Y938.png


N32G455芯片的flash部分:


https://file.**/web2/M00/0D/90/pYYBAGEDHE2AJ1_2AAFEUAeoV_M746.png


可以看出STM32单独有EEPROM的划分,而N32是没有的,只有flash部分。所以要注意两点:


[*]Flash空间的问题,STM32可用空间要比N32的空间大;
[*]底层接口函数,STM32有操作EEPROM的函数,而N32没有,只能使用flash操作函数。
    下面是flash部分的操作:


https://file.**/web2/M00/0D/8A/poYBAGEDHFGAYnG6AACYgqt5fTk170.png


4.bootloader移植

由于本项目采用bootloader引导主程序的方式,因此要注意烧写空间的配置,配置点在下面位置:


https://file.**/web2/M00/0D/8A/poYBAGEDHFaAGmcaAAGReCI5EjA854.png


当单独调试其中的程序时,烧写程序需要将整个flash擦除,要不运行不正常。
5.OS初始化卡死

又遇到程序卡死问题,这次是主程序,而且主程序起始地址为0x8000000时单独运行良好,但是改成0x8007000用bootloader跳转过去就卡死,也是卡死在OS的初始化中。因为单独运行良好,所以排查起来困难些。最终定位是堆栈和堆的空间设置太大了,设置小了后就可以运行。更改该空间的位置如下:


https://file.**/web2/M00/0D/90/pYYBAGEDHFqAU_m2AAEWl1nhzQI174.png


而且问题还不是堆栈的空间不够用,是空间设置太大了。有点无语。
6.程序跳转后运行不正常

这是最后的问题,程序能够从bootloader跳转,但是运行不正常,咨询了厂家技术人员,技术人员反馈可以采用分散加载的方式进行排查,也就是让芯片直接在主程序烧录的位置启动,分散加载的教程网上比较多,主要需要设置烧录域和启动域地址,还有VTOR寄存器,
配置如下所示:


https://file.**/web2/M00/0D/8A/poYBAGEDHF6AHl6YAAGWxx4e3iY978.png


需要编写*.ini文件更改VTOR,ini文件编写如下:


https://file.**/web2/M00/0D/90/pYYBAGEDHGOARVYpAADLq96wpWY349.png


在keil中加载,使得软件启动后先配置单片机:


https://file.**/web2/M00/0D/90/pYYBAGEDHGeAdFMyAAInlfOvW4k513.png


配置好后可以实现分散加载,能够是程序在烧录位置启动,发现程序分散加载可以运行正常,但是bootloader跳转不正常,因此需要排查跳转部分的问题。最终定位STM32在主程序启动时不会重启向量表,而N32会重启向量表,在主程序启动位置更改如下:


https://file.**/web2/M00/25/C2/pYYBAGG4FqGAR9xFAADBlUA72fM686.jpg


跳转部分代码如下:


https://file.**/web2/M00/0D/8A/poYBAGEDHHCAe9J2AACTSY1A6pM402.png

littlelida 发表于 2022-3-1 14:27

图片刷半天也没打开~

wjxx0 发表于 2022-7-20 15:22

这图片咋刷不出来嘞

小胡爱小谢 发表于 2022-7-22 10:15

同问图片问题,求楼主在更新下

LucasYe 发表于 2022-8-5 11:11

图片不行哎,我还以为我自己网络问题

chenqianqian 发表于 2022-8-5 18:46

谢谢分享经验,学习了。

weifeng90 发表于 2022-8-6 17:47

能完全兼容吗?

duo点 发表于 2022-8-8 15:45

能代替stm32的国产芯片真的是越来越多了,国产芯片真的要雄起了

cedtek 发表于 2022-8-8 16:34

图片加载不出来呀

yangxiaor520 发表于 2022-8-11 07:54

兼容性咋样?

plsbackup 发表于 2022-12-2 22:37

这个代码不是完全兼容的吗?            

mikewalpole 发表于 2022-12-3 13:24

如果直接使用stm32cubemx 能不能直接下载程序到n32?

uytyu 发表于 2022-12-3 15:38

只是需要修改时钟配置的部分?            

chenjun89 发表于 2022-12-3 18:47

软件改动大吗?

51xlf 发表于 2022-12-4 22:31

N32的性能要比stm32强一些的。

wxheky 发表于 2022-12-5 16:47

plsbackup 发表于 2022-12-2 22:37
这个代码不是完全兼容的吗?
部分不一样,需要修改
页: [1]
查看完整版本: N32替换STM32记录