其实使用GoKit,着重要熟悉的地方应该是协议,而且GoKit2已经提供了一个完整的工程,如果想开发扩展功能的话可以直接在工程上修改。不过为了深入了解各个部分的开发,所以我打算重新实现模块的功能。用C的话可以直接拷贝原工程的文件就行了,但是我想用C++来实现,再加上操作系统就全了。 这个工程和原工程不一样的地方: 1.增加MDK自带的RTx操作系统,后面可使用线程、多任务等功能; 2.使用MDK自带的STM32函数库,这样每次建立工程就不用再去拷贝文件这样的操作了; 3.使用C++编程,程序结构更加良好,方便维护,顺便学习一下。 当然你可能觉得这样没意义,我也是这样想的,只是尝试一下用其他的方法实现相同的功能而已。而且也许到后面会碰到问题进行不下去,就当经验的积累罢了。
工程建立的方法和普通STM32的一样,这里再简单总结一下: 新建工程,选择使用的STM32的型号
增加需要用到的功能组件,包括操作系统、启动文件、驱动库等。这里是最基本的选择,用到其他的库时再添加,可减少编译的时间。
按照自己的习惯更改名称和工程文件结构
根据板子更改系统配置,比如外部晶振是8M,就改成一样的。Use MicroLib可使编译的文件更小,加快烧写速度,占用更少的Flash
创建Hex文件,习惯性选上
选择调试器
使用的是SWD方式,所以选择这个,注意速度,不要太大了,否则不能烧写
这里也改一下
Flash容量找到合适的
参数配置完毕,添加一个主程序文件
用C++的话就是cpp文件
编写最基本的头文件和入口函数
再来配置一下时钟参数,这样就不用再写代码了
操作系统相关的设置,STM32F103是72M的,需要改一下
编译一下没有错误,已经可以烧写了。不过一个空工程烧写进去也没什么用,还是增加点东西吧。
跳过LED的操作,直接来点复杂的东西,驱动OLED,方便以后调试用。 既然打算用C++来写,那么就先定义一个OLED的类,以及里面的函数。 类里的函数都是从原工程拷贝过来的,基本不用做改动可以直接使用,只是变变方式而已。而且我将类的定义及函数都放在了一个hpp文件里,而不需要一个cpp一个hpp,否则以后东西多了看着很乱。当然这可能不是一个好习惯,不过我喜欢,引用时只要include这个hpp文件就行了,不需要在工程中再去包含cpp文件。 可能你会觉得C++的类使用时麻烦,先定义变量,再去New它,还要想着释放,果然很累。为了解决这些问题,这个类我使用单例的方式,不管在什么地方,只要引用了头文件,就可以当成一个全局变量来用,而且会自动释放。 单例类包括了一个静态的成员变量Instance,用于存放实例化的类。当第一次调用时,程序中会判断是否已经New过,如果没有则New,并保存到Instance中,否则直接返回已创建的实例。当然这些函数也可以写成static方式,这样和C的就没什么区别了,而且不便于以后的继承、覆盖等操作。
主程序中调用的方法。增加了操作系统的初始化代码,并且包含一个主线程,后面的程序都不要放在main函数里,而是在主线程中去执行了。
为了测试,工程获取各种时钟频率并显示在OLED中。烧写后,显示出来了
|