本帖最后由 suyong_yq 于 2015-1-6 00:37 编辑
原创飞思卡尔KL25 单片机 固件库软件——适用于FRDM-KL25 开发板
suyong_yq@126.com
2014-01
最近参加了Andy Chen 在 ElecFans 的社区中组织的学习 KL25 的活动。自己之前对 KL25 单片机有了解,做了一些功课,整理了之前的代码创建了这个固件库,分享给大家参考,一起学习,写的不好请别拍砖哈。现在这个固件库还在开发当中,目前支持:
SIM系统集成模块 GPIO通用输入输出模块 UART异步串行通信 模块 SPI同步串行通信模块 I2C电路 集成总线模块 ADC模拟数字转换模块 DAC数字模拟转换模块 TPM定时器模块 Systi ck滴答定时器模块( ARM 通用)
对FRDM-KL25 的板子进行了移植,可以直接在 FRDM-KL25 的板子上跑样例程序的。以后还会继续添加模块,学到了就加新的。固件库的名字还没想好,等完善了再正式命名,暂时就叫作“ LiteFwLib_KL25 ”吧,后面简称“ LiteFwLib ”(如果还能引用这个词的话)。
这里先写一个简单的说明,先让大家用起来看看。
关于目录在这个文档里就略过了,本来也没几个,大家自己戳戳看就知道了。
我使用了“二段编译”的结构设计的LiteFwLib ,也就是先得打开目录“ fsl_frdm_kl25librarybuild ”下的工程,编译生成 lib 库文件“ fsl_frdm_kl25.lib ”(这个文件位于目录“ fsl_frdm_kl25libraryoutput ”下,样例工程已经自动包含好啦),然后才能编译目录“ fsl_frdm_kl25example ”下的样例工程生成最终的可执行文件下载到单片机。
这样做的好处是:通用的驱动程序在一次编译后可以多次使用,节约了不少应用开发的时间。实际上,只有写驱动的时候才会编译固件库,写应用程序(比如 main 函数和中断服务程序)的时候只要关注程序的执行逻辑就可以了,也不会再去调驱动代码了。
在“fsl_frdm_kl25example ”目录下写了几个最简单的使用固件库代码的样例程序,有的程序需要用杜邦线连接一下的,还有程序的运行情况的截图和说明文档,都还没来得及写。不过代码是以最精简的方式写的,一看就懂,可以直接编译下载到 FRDM-KL25 板子里看现象的。
例子程序包括:
01_uart_hello - 通过 OpenSDA 的串口输出欢迎信息,然后回显在终端输入的任何字符。 02_gpio_led - 闪烁板子上的小灯,通过串口终端输入触发 03_systick_ticker - 用 Systick 做的定时器演示 04_spi_master_to_slave - SPI的主从机通信,得用杜邦线连一下。 04_spi_uart_to_master - SPI主机发出 UART 终端输入的数据,要是有两块板子就可以做两个板子 SPI 通信的实验了。 05_i2c_master - 读板子上的三轴加速度传感器芯片 MMA8451 的值,由 UART 串口终端触发。 06_adc_soft_trigger - 读 ADC 模块内部的温度传感器的值,由 UART 串口终端触发。 08_tpm_pwm_led - 通过 PWM 改变板子上小灯的亮度,由 UART 串口终端触发。
中间空下编号的例子程序,不是作者不舍得放出来,是因为比较懒得写,就还没整理出来。比如说编号排在第7 的,应该是 DAC 的程序,这个 DAC 驱动的功能非常简单,一看就会,但是单单用 FRDM 板子不好做实验。 Bingo ,我突然想到可以让 DAC 输出电压信号,然后让 ADC 采样回来显示到串口终端上,哇,我太厉害了(自恋 5 秒钟。。。),下一个版本要加上去。
好吧,LiteFwLib 代码包中的主要内容都介绍了,现在要提一下程序的执行结构。就以第一个 uart_hello 举例吧。
上电之后启动到main() 的过程暂时先不用管,咱们学习的时候主要关注 main() 函数里的东西,不过在进入 main() 函数之前已经把系统内核的时钟设定好了,为推荐使用的最高频率 48MHz 。
进入main() 函数之后,首先调用 init_board() 函数,这个东东是初始化板子的,里面有三个主要步骤:
1. 调用SIM 模块的驱动程序,把芯片上的各个模块在芯片内部连接起来,最主要的当然要数时钟啦,要把时钟信号从时钟发生器输送到各个功能模块中。
2. 访问PORT 模块,将要使用模块的引脚配置好复用功能。这个是跟电路板相关的,我已经为 FRDM-KL25 板子移植好了现成的函数,列在“ bsp_config.h ”文件中, BSP 函数打头的函数随便用啊,保证引脚不冲突的。如果自己要移植到其它的板子,也主要是在“ bsp_config.c ”文件中改,盯着这一个文件,引脚分配时也不同意看走眼出现冲突的情况。
3. 调用最常用模块的驱动,配置要系统级别的功能。比如说这里用到的UART 串口,可是要支持标准输入输出的 printf 和 scanf 的,老重要了,所以就先在这里完成功能配置。后面用到的 arm_systick 也属于类似的情况,可以作为通用的定时器的,还有就是 NVIC 模块,这厮是在 ARM Cortex-M 内核里管理中断的,也可以调用 CMSIS 标准接口在这里设定好。其它功能模块的初始化就跟应用联系比较密切了,所以就放在 main.c 文件里吧。
经过init_board() 再回到 main 函数后,大家想咋搞就咋搞,我就不多说了,代码一看就明白。输出欢迎信息,显示程序的编译时间,进入无穷无尽有无休止的循环当中万劫不复。。。(我表示已经快在 while 循环中转晕了)
今天的介绍就到这里啦,我困得块要睁不开眼睛了。要注意的是,开发包中example 目录下的样例工程默认使用 Jlink 进行下载和调试,而 FRDM-KL25 的板子上自带的是 OpenSDA 的调试器,是不是还得专门搞个 Jlink 呢?呵呵,不用的,这里先卖个关子,请听下回分解(现在实在是困得不行了)。但是用 OpenSDA 原生的固件也是可以下载调试程序的,只要在 Keil 工程的 Object->Options for target “ < 工程名,例如 uart_hell> ”对话框中,在“ Debug ”标签页下选择使用 OpenSDA 的调试组件即可。
最后附上我为frdm-kl25写的最新尝鲜版固件库开发包,有bug的话提出来我尽快fix掉,请别拍砖哈。
8
评分
查看全部评分
这个先支持一个,自己写的固件库,而且开源这精神必须支持!
提交评论
谢谢支持,陪我到深夜,我感动得快哭了(其实也是冻的)。。。
提交评论
想问:打开目录“fsl_frdm_kl25librarybuild”下的工程,在keil中怎么编译生成lib库文件“fsl_frdm_kl25.lib”
提交评论
编译出错了。 error: #28: expression must have a constant value
这怎么解决呢?
提交评论
按照编译工程的方式编译即可,只不过一般的工程生成的是可执行的二进制文件,而这个库工程生成的是库文件。
提交评论
说明你具体的应用场景吧,很多人用这个库都没出现过报错的情况。