极客秀
搜索

FireBLE裸奔之一操作GPIO口

还记得写过的第一个C程序叫Hello Word!!,写过的第一个C++程序叫Hello C++!!写过的第一个JAVA程序叫Hello
JAVA!!写个的第一个单片机程序叫点亮一个LED灯。。。。。。!
这么多第一个,为何是那么的简单,但又是那么的经典,并且必不可少呢?一个Hello Word!!就沿用了几十年,这难道是巧合吗?
NO!这不是巧合!这是必然,每一件事的起点,都意味着有一个东西在欢迎我们!也因为它的“欢迎”,让我们了解一个新的世界,也让我们开始踏入这个新的世界!
所以,单片机的第一个程序是点灯,这就成为了必然!在我的理解中,点灯包含了这么几重意义:

1)了解一个最最基本的电路原理,能够驱动LED,将其点亮;

2)当接触到一款新的MCU时,通过点灯,将熟悉它的寄存器的操作或者库函数API的调用,将能任意的操控它的GPIO端口;

3)开始熟悉这款MCU的编程模型;

4)开始熟悉这款MCU的程序的烧录 ;
仅仅一个点灯!就蕴藏了很多很多的东西!所以作为我对FireBLE的第一次裸奔,点灯是件必须的事。OK!废话就不多说了!码代码要紧。
1、首先第一件事肯定是查找MCU资料喽,FireBLE使用的是昆天科的MCC
QN9021,然而查资料得知昆天科的蓝牙业务已经被恩智浦收购了,所以,要找QN9021的资料,就先上恩智浦官网了。
进入恩智浦官网http://www.nxp.com/,(在这里就不跟进去找了,总之学习这些东西,就必须学会在官方网站中查找资料),只在恩智浦官网找到了关于QN9021的一些说明和Datasheet,并没有找到像“参考手册”这样的文档,那么先放下。
因为没有它,就是我们不能参考QN9021的寄存器配置和相关配置,但是,有些公司就是这样的,想参考手册这样的东西是不开放出来的,但是呢,也没啥,在一定程度上开放了API也是很容易开发的。
2、搭建好开发环境。其实对于MCU而已就是,需要一个作为开发的IDE软件和一个烧录软件喽!其实在Firefly的官方网站已经很详细的介绍了开发环境的搭建,所以在此也没什么可说的了。
3、肯定是先找个例程参考一下喽,否则还是很难玩的。那么在哪里获取例程呢?(其实我也是从Firefly的入门指南得知的),可以从QBlue工具获取。将其打开!如下图所示:

可以看到,QBlue工具基本上就分为了四个板块!不用废话!咱要找的肯定是Driver Example,如图:

因为现在需要操作GPIO,所以弄个GPIO的例程就好!选中Copy to相应路径即可!
4、分析例程,例程找到了!那么就要对他分析一番了!打开例程:

从例程中,基本上可以得知,只需要分析清楚如上代码,基本上就能得到我们想要的了。所以第一件事就是分析了!所需要得到的几个信息是:
(1)如何初始化GPIO口。在以上程序中有函数gpio_init(cb_gpio);被调用,从函数名基本上确认是初始化函数了,

此函数内容分为三个部分,显示初始化环境,或者回调函数的地址,然后打开AHB总线的GPIO时钟,最后配置外部中断。呵呵!内容挺多啊!但是呢,好像不太适合咱用啊!因为咱这是要点灯,开中断算啥回事呢?
不管回调函数如何处理,就凭这一点,这个初始化函数就很明显不适合现在的情况了,但是有一点是必须的,那就是开AHB的GPIO时钟了,因为它是配置的第一步。又从main程序的59行到64行就可以看出,将I/O端口配置成上下拉和输入输出的方法了。
(2)如何操作I/O口电平或者如何获取I/O口电平信号,其实不用说,在main函数的第66行就可以看出当I/O被配置为输出模式时,该如何操作I/O口的电平。再看gpio.h文件:

看到如上函数,基本上就知道了所有的GPIO的操作方式了。嘿嘿!这就意味着已经准备好了!
5、建立一个属于自己的工程,我有个癖好,就是,当作为通用工程或者比较简单的工程,我做开发前基本上会自己重建一个工程供自己开发(只适用于工程,大工程改动太大,浪费时间)。
原因是, 通过自己的习惯建立的工程,可以很好的了解工程的架构,这样才能快速的开发。
所以我就果断的建立了一个工程!但是,当一切如往常般的建立好了之后!问题就来了!如下图:

编译出错!呵呵!啥情况呢?当时我的mian.c文件的内容完全和例程中的gpio_example.c
文件的内容相同,不管从哪方面来推理!都不可能出错才对,但是,错误偏偏就出现了!
在分析翻译了一下错误提示,基本上就可以确定是,不支持某种格式的编写。呵呵!到底是啥呢?跟进去看看!就看到了如下:

呵!C语言中居然用了这样的定义,你以为这是C++或者JAVA吗?相信很多学个C语言的童鞋都知道这是不对的,不被允许的,但是这可是人家昆天科或者恩智浦提供的底层API啊,并且在例程中还编译通过了,Why???幸好曾经也是花时间去好好的了解过C语言的历史了,否则也还真犯难了。
其实呢,我们现在最常使用的是ANSI标准C语言,其实也还是有其他标准的,比如C89、C99、GNU
C等等。如果你阅读过Linux内核源码,那么你肯定会知道GNU C标准和ANSI C的差异,还有就是其实现在使用的C语言是经过层层过滤精简而来的!
那么在这之前的历史长河中,C语言还有很多语法是不被现在所使用的,但是现在的C标准却能大部分兼容前面的C语言(因为各种软件的维护),所以,这就是这里报错的原因了,这里报错只是因为Keil默认使用的是ANSI
C标准的编译器,所以要想解决这个错误,其实很简单,切换一个编译器就好,查阅一下质量,就可以得知keil也支持C99标准的编译器,所以修改如下图即可:

对的!在此处指定使用C99标准即可,再编译就能通过了。(注:其实这种错误可以将其在函数中重新定义即可,那为何我不这么干呢?这是有原因的,因为在开发中,除非非常必要,否则绝不能修稿库,否则你会死的很惨,尸骨无存)。
6、确定需要操作的GPIO端口。这不用说,肯定是看原理图了:

有图有真相,不用说啥!所需要操作的I/O口分别是:P06、P07、P27。当这三个I/O口输出低电平时,LED发光,所以,应该配置为正常情况下I/O口为高电平,即为上拉输出模式。
7、编写我的代码!OK!属于自己的工程也建立了,那就该干实事了,敲代码点灯啊啊啊啊啊!

嘿嘿!几行代码搞定!一贯的先开时钟,在配置函数然后配置为引脚上拉,再然后配置为输出模式。完事大吉。
初始化完毕了,那就该点灯了,想想都兴奋,如图:

你看的没错!在必要时刻,我就喜欢用宏来干这事,并且标出了红绿蓝三个 LED !嘿嘿!太兴奋了!再看看调用:

就是闪烁一下喽!编译,没有警告!生成HEX文件。
8、烧录程序!

你懂的!就是用ISP烧录!那为毛不用SWD烧录呢?不多说了,Firefly官网说的灰常清楚,我只是不想折腾。

看到上图!不用废话!烧录就这样了!
但是当我打开 Open file ,进入界面时,默认的时选择 bin 文件,而 keil 默认生成的是 HEX 文件,而且当尝试选择
HEX 文件是,软件是不给烧录的,即软件不支持 HEX 文件的烧录。那么咋玩呢?
据我所知,两个方法:
1)使用HEX2BIN.exe工具,手动或者命令将HEX文件转换为bin文件,但是这个每次烧录都玩会烦死的。

2)在keil上加命令,将生成bin文件。
呵呵呵呵呵!不用说!果断的用了方法 ( 2 ),于是乎如下图:

就是这样!蓝色线画的部分是文件名,其他的就没啥好说的了!然后,在编译,再烧录!
当我烧录完成高高兴兴的复位后!呵!一点反应都没有!唯一有反应的就是,蓝色灯一直亮,其他的,没其他了!到底是啥情况呢?
为毛会这样呢?很是折腾了一番!才想到!在main中的初始化函数SystemInit();还没分析过啊,问题会不会出现在它那里呢?于是乎跟进函数:



仔细的跟读void SystemInit(void)函数,还真没看出什么来!但是,但是它调用了一个函数,于是乎,跟进:

呵呵!猫腻终于出来了!看看其他的引脚,好像都是配置成了普通GPIO,而咱要操作的P06和P07引脚呢?这这这不就是SWD端口吗?而且还配置成了SWD端口,所以咱在下面玩它,它肯定不听话啦!嘿嘿!所以呢,要把它改成配置成普通IO口!但是在这里改吗?
还记得上面说的么?不要轻易的修改库文件!所以,咱只能在后面配置回来,于是乎就有了如下操作:



嘿嘿!看见没!把它搞回正常!OK!在编译,在烧录!没问题了!灯这就闪起来了!
哈哈!完工!收工!
总结:此事虽易,但是通过此事也基本能了解到了整个库的框架的一角,还好开发环境的配置和烧录等等。为后面的开发做铺垫。

1.转载请保留原文链接谢谢!
2.本站所有资源文章出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。
3.本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户擦亮眼睛自行鉴别,做一个有主见和判断力的用户。
4.本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
5.联系方式(#替换成@):pm#vimge.com

  相关内容