前言
经过一周的努力,终于把程序下载到相应的芯片里了,完成了while点灯,时间定时器点灯,串口发送。主要是完成了STM32F103,GD32F103,STM32F407,STM32H750的程序编写和下载。只是现在仅仅是编写和下载程序,并且程序能跑,至于调试阶段还没有加进去。程序仅仅是点灯,复杂运算的话,debug还得加进去,要不不知道编写的逻辑是不是正确。现在先将程序跑起来,剩下的应该很好办。
芯片心得:只要完成以上三个功能,差不多这款芯片就算搞定了:
(1)while点灯:主循环可以跑,硬件配置可以跑,基本配置可以用;
(2)定时器点灯:定时器中断可以跑,中断配置可以跑,中断配置可以用;
(3)串口发送:外设可以跑,外设配置可以跑,其他外设可以用。
其实这三个完成之后,其他的功能就可以按照这个直接往上面复制粘贴了。
第一章:程序原则
程序一步一步的来,没有跳过任意一步,没办法,最终的目的出了问题没有办法解决,所以只能一步一步的来,步子大了会扯着淡,然后还得回来一步一步的搞。
编写程序原则:一步一步的来,一个输入一个输出的来。无论搭建Matlab和Psim仿真,硬件电路,还是程序,都得一点一点的来。
编写程序步骤:一个功能一个功能的实现。无论是仿真还是硬件电路,都需要一个输入一个输出的来,这块正确了,再来下一个。先把东西分为很多块块,然后一块一块的。如果全部堆在一起,弄好之后一下子调试,肯定会出现错误,但是并不知道错误出现在哪里,还得回头来一块一块的找。
教训:以前搭建硬件电路,有电源,驱动电路,功率电路,DSP,信号驱动电路,负载电路等等,全部弄好了,一调试,结果没出来,然后还得一个一个的来。保证每一个都正确了,才能往下面走,这样心理也有底,并且汇报的时候还好说。
回过来说Eclipse代替Keil的思路:
第一阶段:
(1)Eclipse产生STM32F103程序,下载到STM32F103芯片中,保证产生程序正确。作用:初步了解程序结构。
(2)STM32F103程序下载到GD32F103中,保证程序正确。作用:保证GD32F103能正常工作,并且能运行Eclipse产生的STM程序。注:程序兼容。
(3)改写STM32F103程序,改为GD32F103的程序,下载到GD中,保证改写程序正确。作用:初步改写原有的Eclipse程序,使之在GD32F103上能跑。
这样就从原有的Eclipse的Stm程序改写为gd程序了,完成了第一阶段。
第二阶段:
(1)Eclipse产生STM32F407程序,下载到STM32F407芯片中,保证产生程序正确。作用:初步了解程序结构。这种结构是基于HAL库的。
(2)将原有KEIL的带HAL库的407程序改写为Eclipse的HAL库407程序,下载。作用:完成原有HAL库407到Eclipse的HAL库407程序改写。
(3)将Eclipse产生的F103程序改写为F407程序,下载到407芯片中。作用:完成不带HAL库的程序向带HAL库的程序改写。
第三阶段:
(1)将Eclipse的F103程序改写为Eclipse的H750程序;
(2)将Eclipse的F407程序改写为Eclipse的H750程序;
总结个图如下:
能生成的程序有2个,STM103和STM407(HAL);
需要得到的程序:
(1)STM103~~~>GD103;
(2)STM103~~~>STM407;
(3)STM407(HAL)~~~>STM750(HAL);
(4)STM103~~~>STM407(HAL);STM103~~~>STM750(HAL);
HAL库到HAL库,非HAL库到HAL库,非HAL库到非HAL库。
(1)针对不同公司芯片;(2)针对同公司不同芯片;(3)针对同公司不同库芯片。
总结
基于103的程序可以改写为任意公司的芯片;
基于407的程序可以改为ST的任意芯片。
下面说下整体的思路,具体的怎么替换,下篇文章介绍下具体的细节。先整体上把控下,给整体一个感觉,先接收,不产生害怕的感觉。
第二章:STM32改写GD32
1. STM103替换为GD103
上篇文章介绍了Eclipse产生的程序与原有程序的区别,下面直接切入正题,怎么修改程序。
图中黄色的为需要修改的文件。
先说基础文件:main函数,103库函数,stm32xx文件。这几个不用多说,直接替换成需要芯片的文件。
怎么替换,一个一个的删除,一个一个的复制粘贴进去就行。至于里面的报错的,修改成对应的文件就行,比如需要stm32f10x的h文件,已经删掉了,那就换成gd32f10x的h文件就行,一步一步来,一个一个的改。
再说下men启动文件。
里面重要的参数就2个,一个RAM,另一个是FLASH,这两个根据芯片的datasheet直接就能获取,比较简单。一个2000开头,一个800开头,其他的不用管。
最后说下vector文件。也就是中断相量文件。
void __attribute__ ((weak, alias ("Default_Handler")))
WWDG_IRQHandler(void);
void __attribute__ ((weak, alias ("Default_Handler")))
PVD_IRQHandler(void);
void __attribute__ ((weak, alias ("Default_Handler")))
TAMPER_IRQHandler(void);
void __attribute__ ((weak, alias ("Default_Handler")))
RTC_IRQHandler(void);
void __attribute__ ((weak, alias ("Default_Handler")))
FLASH_IRQHandler(void);
extern unsigned int _estack;
typedef void
(* const pHandler)(void);
__attribute__ ((section(".isr_vector"),used))
pHandler __isr_vectors[] =
{
(pHandler) &_estack, // The initial stack pointer
Reset_Handler, // The reset handler
NMI_Handler, // The NMI handler
HardFault_Handler, // The hard fault handler
MemManage_Handler, // The MPU fault handler
BusFault_Handler, // The bus fault handler
UsageFault_Handler, // The usage fault handler
0, // Reserved
0, // Reserved
0, // Reserved
0, // Reserved
SVC_Handler, // SVCall handler
DebugMon_Handler, // Debug monitor handler
0, // Reserved
PendSV_Handler, // The PendSV handler
SysTick_Handler, // The SysTick handler
WWDG_IRQHandler, // Window WatchDog
PVD_IRQHandler, // PVD through EXTI Line detection
TAMPER_IRQHandler, // Tamper through the EXTI line
RTC_IRQHandler, // RTC Wakeup through the EXTI line
FLASH_IRQHandler, // FLASH
其实也是替换。前面是弱定义,后面是中断入口。这个是原来的文件。
将原有的启动文件,也就是startup.s文件打开。
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window WatchDog
DCD PVD_IRQHandler
DCD TAMP_STAMP_IRQHandler
DCD RTC_WKUP_IRQHandler
DCD FLASH_IRQHandler ; FLASH
DCD RCC_IRQHandler ; RCC
里面的中断入口一个一个的复制过来,格式一样就行了。该有的就有,该是0的就是0,这个千万别移植错了。
这样三个部分就一直成功了,编译下载就行了。下一篇文章我就专门用一个文件给大家一步一步的演示怎么修改,会出现什么错误,怎么解决。
现在心理先有个谱,怎么改,改哪里。
2. STM32F407替换为STM32H750
先看Eclipse产生的407程序结构,上篇文章已经详细介绍过103的了。
代码结构和产生的103的差不多,只不过这个是基于HAL库的。再来看下需要修改的文件:
其中黄色的为需要修改的文件。
也分为两部分。
第一部分:直接替换文件,main函数,407相关文件,HAL库文件。
第二部分:修改文件,vector,和men的ld文件。
怎么修改什么的,和上节一样,给小伙伴看看修改完之后是什么样子。
上图的文件系统就是Eclipse里面的对应的文件,将407产生的直接替换成750的就好。改好之后就可以编译下载了。修改的地方也还是那两个,一个是中断向量表,从原有的工程的s文件一个一个弄过来就行,另一个就是mem.ld文件,直接修改下ram和flash的大小就好,起始地址不用修改,都是2000和800。
第三章:总结和展望
整体来说,修改过程最后是比较简单,就是说的那几个地方,但是在自己修改过程中会遇到很多问题,不知道怎么处理,也不知道问题出在哪里。慢慢的会一点点的看,就知道哪里出问题,一点点的试着解决。还是那句话:一点一点的来,心平气和的,别害怕!
下一篇文章就针对两个工程一点一点的说,怎么生成,怎么改,会遇到什么错误,怎么解决,一步一步的带着小伙伴进入修改的不能说境界吧,能自己一点点的修改就行。需要的小伙伴可以看前篇文章中的链接,公众号能关注就关注一波,需要源代码的可以在公众号里面留言,到时候会送上全部源代码。大家一起学习。