博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zigbee学习笔记2----cc2530 IO实验
阅读量:4049 次
发布时间:2019-05-25

本文共 3278 字,大约阅读时间需要 10 分钟。

        之前说不想写单片机实验的这一部分的,可是想想不写不行,要不以后说不清楚,因为学习中会遇到一些修改协议栈的IO的东西,比如LED灯啊,串口的IO设置啊等等,如果不做这部分的实验,可能后面看不明白,其实也是很简单的单片机实验而已,我这个只学过几天科班的单片机的能够搞明白,相信你们不用看都明白。

       我手头上拿得是佳杰的实验开发板,之前是因为公司的板子太久没有回来,我又不想等,所以就去淘宝买了这套板子,我叫他帮我加了一块,所以我有三块板子,全带lcd,还比较便宜,连带邮费360左右,芯片是cc2530F256的,就是说flash是256K的,这个在单片机领域来说算是很大的flash了,RAM没得选的,就8K。

      板子拿到的第一天觉得特别兴奋,因为之前只玩过嵌入式linux开发,后来在公司玩了一下cc1110和cc1101的东西,本来是想做一个无线协议栈的(肯定没有zigbee这种技术那么强大,能用,可是还有很多东西要考虑,后来就搁置了),现在玩zigbee,还挺新鲜的,我本来不是做学单片机出身的,所以对这些裸机编程没大家那么熟悉,而且新接触cc2530,说得肯定错漏百出,欢迎拍砖。高手们,就没必要看了,刚入门的,也许有点帮助。

      对于zigbee的介绍什么的我就不废话了,我们直接在板子上实现我们的一个led流水灯程序。

      用IAR建立一个工程,然后进行配置

      首先选择我们的cpu,我们是cc2530

然后配置一些堆栈

设置一下config

好了,工程设置好了之后,我们新建一个.c文件,然后把他add进来

代码很少,想想我以前在linux下写一个led驱动的时候要做的事情那比这个多得去了

 

#include 
#define LED1_NUM 0x00#define LED2_NUM 0x01#define LED3_NUM 0x02#define LED_ON_MODE 0x00#define LED_OFF_MODE 0x01#define LED1 P1_0#define LED2 P1_1#define LED3 P1_4static void setLedMode(unsigned char lednum,unsigned char mode){ switch(lednum) { case LED1_NUM: LED1 = !!mode; break; case LED2_NUM: LED2 = !!mode; break; case LED3_NUM: LED3 = !!mode; break; default: break; }}static void initLED(void){ P1SEL &= ~0x13; P1DIR |=0x13; LED1 = !!LED_OFF_MODE; LED2 = !!LED_OFF_MODE; LED3 = !!LED_OFF_MODE;}static void Delay(unsigned char n){ unsigned char i; unsigned int j; for(i = 0; i < n; i++) for(j = 1; j; j++) ; } int main(){ unsigned char status = 1; initLED(); while(1){ setLedMode(LED1_NUM,status) ; Delay(5); setLedMode(LED2_NUM,status) ; Delay(5); setLedMode(LED3_NUM,status) ; Delay(5); status = !status; }}

我们来看看佳杰的LED是怎么接的:

其实这个x接的是p1_0.其他两盏灯分别接在了P1_1和p1_4上,好了,下面对刚学单片机的解析一下这个程序

首先是初始化LED的函数

static void initLED(void){ P1SEL &= ~0x13; P1DIR |=0x13; LED1 = !!LED_OFF_MODE; LED2 = !!LED_OFF_MODE; LED3 = !!LED_OFF_MODE;}

首先我们要用这个三个io口作为我们的led灯控制接口,那么我们必须得去初始化这个几个口,要不使用起来就会有问题,那初始化该做什么事情呢?首先我们要把这三个口设置为普通的io口,因为我们的LED就好是一个普通的设备,然后我们要设置这三个io的输入输出方向,因为我们的led是一个输出设备,那么我们要把这三个口设置i为输出。

好,怎么设置为普通的IO口呢?首先我们来看一下P1SEL这个寄存器,涉及到寄存器的东西,不懂的话,就去找datasheet,打开datasheet然后ctrl+f,然后输入P1SEL然后回车查找,我们可以找到这么一段:

The registers for the I/O ports are described in this section. The registers are:

· P0: Port 0
· P1: Port 1
· P2: Port 2
· PERCFG: Peripheral-control register
· APCFG: Analog peripheral I/O configuration
· P0SEL: Port 0 function-select register
· P1SEL: Port 1 function-select register
 那么就是说这个寄存器是作为p1这组io的功能选择寄存器,然后我们在继续往下找,找找这寄存器的table

这里面说明了这寄存器每一个bit代表什么意思,是否可读可写,默认的值是什么,每一位设置为0或者1代表什么意思。我们可以看到设置为0的时候就代表这个io口是作为普通io使用的。那么我们要把p1.0,p1.1,p1.4设置为0,那么我们设置者三个bit为0,可不能影响其他bit,那么在c语言学习的时候只能用什么呢?对就是&,你把你要设置那一个bir设置为0,其他bit设置为1,然后跟原来的&就可以了,P1SEL &= ~0x13;就是做这么一件事情。

好了,配置好io为普通io之后,我们就要设置一下这个io的方向了,同样是有一个寄存器设置的:P1DIR。

好,我们继续datasheet,同样你可以找到这么一句

P1DIR: Port 1 direction register

证明我没有骗你,然后我们找找他的table

和上面那个table是一样的,我们看到,当设置对应的bit为0的时候这个io口是作为输入io口,设置为1的时候是作为输出io,那么我们肯定要把1.0,1.1,1.4这三个口设置为输出,P1DIR |=0x13;就是做这么一件事情。

好了,初始化完毕,程序也基本不用再解析了,还有要知道的是我这里的LED是低电平亮的,看原理图的接线就知道。

rebuilt all 这个工程,然后下载到板子上,拿掉仿真器,就可以看到这三盏灯依次亮起来,然后依次灭掉,如此循环。

还有个设置需要新手注意的,那就是,如果你想用在线仿真的话,那么要设置工程成这样子

如果你是像我这样子下载下去的话,那么请选择下面的other这一项,还有因为佳杰的仿真器使用到了p1.4这个口,所以必须拿掉了仿真器你才可以看到led3的亮和灭,否则你看不到这个灯有任何变化的。

转载地址:http://pvnci.baihongyu.com/

你可能感兴趣的文章
No plugin found for prefix 'install' in the current project解决方案
查看>>
ZUUL2 使用场景
查看>>
Spring AOP + Redis + 注解实现redis 分布式锁
查看>>
elastic-job 和springboot 集成干货
查看>>
php开发微服务注册到eureka中(使用sidecar)
查看>>
mybatis mybatis plus mybatis jpa hibernate spring data jpa比较
查看>>
也许是世界上最简单最灵活的JAVA CRUD开发方法
查看>>
支付宝生活号服务号 用户信息获取 oauth2 登录对接 springboot java
查看>>
提交jar包到maven中央仓库2019最新版本
查看>>
eclipse servers view tomcat内存配置
查看>>
HandlerExceptionResolver 踩坑记录
查看>>
CodeForces #196(Div. 2) 337D Book of Evil (树形dp)
查看>>
uva 12260 - Free Goodies (dp,贪心 | 好题)
查看>>
uva-1427 Parade (单调队列优化dp)
查看>>
poj 1155 TELE (树形背包dp)
查看>>
【设计模式】学习笔记13:组合模式(Composite)
查看>>
hdu 1011 Starship Troopers (树形背包dp)
查看>>
hdu 1561 The more, The Better (树形背包dp)
查看>>
【设计模式】学习笔记14:状态模式(State)
查看>>
poj 1947 Rebuilding Roads (树形背包dp)
查看>>