cc2530外部脉冲在固stm32定时器脉冲计数间里面计数

搜索关键字:cc2530
73个结果)
今天焊接CC2530,其中有个模块下载程序(协议栈程序),无法创建也无法加入网络。 第一步先检查32MH 晶振是否启动,用basice 程序看uart,发现可以正常打印log。 第二步,在线调试,看看程序跑到那里了。 在看里面果然有while 循环 现在怀疑是32K晶振问题了,把 32K晶振宏定义修 ...
分类:&&&时间: 22:10:58&&&
收藏:0&&评论:0&&赞:0&&阅读:204
计划用CC2530做定位,网上找了一些求圆交点的程序, 修改成3个圆求交点的质心,感觉算法还行。 粗略写了一下程序,结果还行。 现在只能手动输入3个圆的信息。 后面需要再优化。 全部未优化的程序: ...
分类:&&&时间: 22:21:03&&&
收藏:0&&评论:0&&赞:0&&阅读:150
【CC2530入门教程-增强版】基础技能综合实训案例(基础版)的测控终端程序设计思路及项目源码分析。 ...
分类:&&&时间: 21:50:28&&&
收藏:0&&评论:0&&赞:0&&阅读:78
【CC2530入门教程-增强版】基础技能综合实训案例(基础版)的上位机数据采集程序设计思路及项目源码分析。 ...
分类:&&&时间: 21:39:34&&&
收藏:0&&评论:0&&赞:0&&阅读:143
【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-题目需求 广东职业技术学院 欧浩源 一、引用 不管是简单的单片机应用,还是复杂的嵌入式系统,在我看来它们的本质结构是差不多的,都离不开“内核+外设”的典型架构,它们之间的区别更多是在内核性能高低和外设丰富程度上。 在前面的《CC2530 ...
分类:&&&时间: 14:08:13&&&
收藏:0&&评论:0&&赞:0&&阅读:96
基于多线程方式的串行通信接口数据接收案例 广东职业技术技术学院 欧浩源 1、案例背景 在本博客的《【CC2530入门教程-06】CC2530的ADC工作原理与应用》中实现了电压数据采集的程序设计,传感器模块以每1秒发送一帧数据的形式通过串口向上位机发送电压数据。其数据帧由4个字节组成:一个帧头和一个 ...
分类:&&&时间: 17:53:14&&&
收藏:0&&评论:0&&赞:0&&阅读:145
?? 定时器学习 文件夹 说明...1 协议栈函数使用...2 设置初始化定时器...2 回调函数(中断服务函数)3 启动定时器...3 停止定时器...4 寄存器操作...4 查询方式...4 中断方式(使用定时器3)7 说明 依据数据手冊可知CC2530总共同拥有4个定时器,可是定时器2被系统占 ...
分类:&&&时间: 21:40:53&&&
收藏:0&&评论:0&&赞:0&&阅读:240
第6课 CC2530的ADC工作原理与应用 广东职业技术学院 欧浩源 一、A/D转换的基本工作原理 将时间上连续变化的模拟量转化为脉冲有无的数字量,这一过程就叫做数字化,实现数字化的关键设备是ADC。 ADC:数模转换器,将时间和幅值连续的模拟量转化为时间和幅值离散的数字量,A/D转换一般要经过采样 ...
分类:&&&时间: 16:42:17&&&
收藏:0&&评论:0&&赞:0&&阅读:252
第5课 CC2530的串行接口原理与应用 广东职业技术学院 欧浩源 一、并行通信与串行通信 微控制器与外设之间的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。 并行通信:指数据的各位同时发送或接收,每个数据位使用单独的一条导线。传输速度快、效率高,但需要的数据线较多,成本 ...
分类:&&&时间: 16:31:16&&&
收藏:0&&评论:0&&赞:0&&阅读:280
第3课 CC2530的中断系统及外部中断应用 广东职业技术学院 欧浩源 一、中断相关的基础概念 内核与外设之间的主要交互方式有两种:轮询和中断。 轮询的方式貌似公平,但实际工作效率很低,且不能及时响应紧急事件;中断系统使得内核具备了应对突发事件的能力。 在执行CPU当前程序时,由于系统中出现了某种急 ...
分类:&&&时间: 12:18:44&&&
收藏:0&&评论:0&&赞:1&&阅读:535
*已刊登至:《无线电》8月刊 物联网技术的实现中,无线技术是必不可少的部分。近年无线技术的发展,将ZigBee推入人们的视线中。那么ZigBee是如何的一种技术呢?带着疑问。我查询了它的来历: ZigBee,来源于蜜蜂的八字舞,因为蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同 ...
分类:&&&时间: 09:38:56&&&
收藏:0&&评论:0&&赞:0&&阅读:280
在德州仪器的站点:http://www.ti.com.cn/tool/cn/z-stack上下载安装zigbee2007协议栈版,我的是ZStack-CC.0-1.4.0。 以下演示一个简单的用zigbee通信的样例: 完毕这个样例须要两个zigbee的模块,一个用作协调器(Coor ...
分类:&&&时间: 11:18:23&&&
收藏:0&&评论:0&&赞:0&&阅读:198
最近在倒腾Zigbee,准备参加物联网全国大赛,学校有给我们发Zigbee开发板,但是对于喜欢折腾的我来说,用开发板还是不过瘾,起码也得知道怎么去画一块板子。于是乎,在百度一番后就有了下面这篇文章。 作为片上系统Soc,CC2530的集成度是非常高的,这也方便了我们开发者。搭建它的最小系统比较简单。 ...
分类:&&&时间: 14:08:07&&&
收藏:0&&评论:0&&赞:0&&阅读:86
转: ZigBee/Z-Stack CC2530实现低功耗运行的配置简介http://bbs.elecfans.com/jishu__1.html(出处: 中国电子技术论坛) 设备支持低功耗运行是ZigBee网络的一大特点,该特性借助CC2530芯片能够很好地体现出来。CC2530芯 ...
分类:&&&时间: 14:57:05&&&
收藏:0&&评论:0&&赞:0&&阅读:151
初窥ZIGBEE 要在zigbee的组网中加入烟雾传感器的模块,所以需要用到cc2530的ADC对传感器输出的模拟信号进行采样。下面是自己对实现用CC2530的ADC采集外部电压的程序过程。 以下是ADC的配置: 以下是UART0的配置: 以下是主函数: 串口显示结果: 一开始的时候,读取出来的AD ...
分类:&&&时间: 15:20:32&&&
收藏:0&&评论:0&&赞:0&&阅读:132
一、了解Zigbee基础知识 1)三种节点、三种角色——cc2530 协调者coordinator:(只有一个)从它开始启动,分派网络地址,允许设备加入或退出,传输数据报。 路由器rooter:大面积网络或树形网络,用于寻找最佳路径,其他同协调器(不能构建网络) 终端enddivice:加入或退出网 ...
分类:&&&时间: 01:07:23&&&
收藏:0&&评论:0&&赞:0&&阅读:68
分类:&&&时间: 19:26:30&&&
收藏:0&&评论:0&&赞:0&&阅读:286
1) 正确连接CC2530仿真器到PC机和ZXBee CC2530节点板,确定按照第一章1.2节设置节点板跳线为模式一,打开ZXBee CC2530节点板电源(上电)。 2) 打开实验工程:在文件夹“05-实验例程\第2 章\2.8-Watchdog”下双击打开工程watchdog.eww,选择Pr ...
分类:&&&时间: 10:03:47&&&
收藏:0&&评论:0&&赞:0&&阅读:64
关键词 ZigBee Sniffer 协议 分析仪 自制 CC2530 CC2531 在开发ZigBee / Bluetooth的过程,难免会要用到Sniffer工具,Packet Sniffer是SmartRF Studio的组件,也可以单独安装,下载地址是:http://www.ti.com/t ...
分类:&&&时间: 14:57:11&&&
收藏:0&&评论:0&&赞:0&&阅读:286
分类:&&&时间: 19:26:53&&&
收藏:0&&评论:0&&赞:0&&阅读:295
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!CC2530的时钟模块
时间 21:46:06
CSDN博客
原文
http://blog.csdn.net/fulinus/article/details/
CC2530的时钟模块
(cc2530_datasheet节选翻译如下)
******************************************************************
者:fulinux
* 转载声明: 点击链接
******************************************************************
振荡器和时钟
CC2530设备有一个内部系统时钟,或者主时钟。系统时钟源可以是从16MHz RC振荡器或一个32M晶体振荡器中的一个提供。系统时钟源是由CLKCONCMD SRF控制寄存器。
还有一个32KHz的时钟源,来源可以是从RC 振荡器或者32KHz的晶体振荡器中过来,同样是由CLKCONCMD寄存器控制。
CLKCONSTA寄存器是一个制度寄存器,用来获得当前系统时钟的状态。
时钟源可以在一个精度高的晶体振荡器和一个功耗低的RC振荡器中交替选择使用。注意一点:RF的收发操作是要以32MHz的晶体振荡器为时钟源才行。
图中给出了时钟系统中可用的时钟源的一个全貌图。
设备中存在的两个高频振荡器:
* 32MHz晶体振荡器
* 16MHz的RC振荡器
32MHz的晶体振荡器启动时间对于某些应用来说可能太长了;因此设备可以先运行在16MHz的RC振荡器中运行直到晶体振荡器稳定后在使用32MHz晶体振荡器。16MHz的RC振
荡器功耗低但是不是很准,所以不能为RF模块提供服务,只能用32MHz的晶体振荡器。
设备中存在的两个低频振荡器:
* 32 KHz晶体振荡器
* 32 KHz RC振荡器
32KHz的XOSC被设计的工作频率频率是32.768KHz并且可以为一些要求时钟准确子系统提供一个稳定的时钟信号。32KHz的RCOSC当校准后可以运行在32.753KHz频率下。校准
只能发生在当32MHz XOSC使能的情况下,可以通过使能SLEEPCMD.OSC32K_CALDIS位来关闭校准。32KHz RC振荡器相对于32KHz
XOSC晶体振荡器功耗低,应该用在可以降
低成本情况下。两个振荡器不能同时工作。
系统时钟是由32MHz XOSC或者16MHz RCOSC两个时钟源驱动的。CLKCONCMD.OSC位用来选择系统时钟源。注意:使用RF模块时,32MHz晶体振荡器必须被选上并且运行稳定。
注意:改变CLKCONCMD.OSC位并不能立即导致系统时钟源的改变。当CLKCONSTA.OSC = CLKCONCMD.OSC时时钟源的改变才会发挥作用。这是因为设备在实际改变时钟源之前
需要稳定的时钟。还有就是注意CLKCONCMD.CLKSPD位反应着系统时钟频率,因此是CLKACONCMD.OSC位的镜子。一旦32MHz的XOSC被选中和稳定,例如,当CLKCONSTA.OSC
位从1切换到0时。
注意:从16MHz到32MHz时钟源的改变符合CLKCONCMD.TICKSPD设置。CLKCONCMD.TICKSPD设置的缓慢一些的话,当CLKCONCMD.OSC改变的话会导致实际的时钟源起作用的
时间会很长。当CLKCONCMD.TICKSPD等于000时会获得最快的切换速度。
32KHz的振荡器
默认的或者复位后32KHz RCOSC使能并且被设置作为32KHz的时钟源。其功耗低,但是相对于32KHz晶体振荡器而言精度不高,32KHz时钟源用来驱动睡眠定时器,产生看门狗的滴答值
和作为timer 2计算睡眠定时器的一个闸门。32KHz时钟源被寄存器CLKCONCMD.OSC32K位用来作为选择振荡器。CLKCONCMD.OSC32K寄存器可以在任意时间写入,但是在16MHz RC
振荡器是活跃的系统时钟源之前是不会起作用的。当系统时钟从16MHz改变为32MHz的晶体振荡器(CLKCONCMD.OSC从1到0)一旦32KHz RC振荡器被选中了它的的校验就启动了并且被执行。在校准期间,32MHz晶体振荡器的一个分频量会被使用。32KHzRCOSC振荡器校准后的结果是它会工作在32.753kHz上。32kHz RC振荡器校准时间可能要2ms时间来完成。可以设置SLEEPCMD.OSC32K_CALDIS位设置为1的话,会关闭校准。在校准结束时,会在32KHz时钟源上产生一个额外的脉冲,会导致睡眠定时器增加1。
注意:当切换到32KHz晶体振荡器后和从32KHz晶体振荡器被设置的PM3模式唤醒时,振荡器稳定到准确频率的时间在500 ms以上。睡眠定时器、看门狗定时器和时钟损失探测器在32KHz
晶体振荡器稳定之前不能使用。
振荡器和时钟寄存器
下面是振荡器和时钟寄存器的描述,所有寄存器的位会在进入PM2和PM3时保持不变,除非有异常情况发生。
定时器滴答值产生器
CLKCONCMD.TICKSPD寄存器控制timer1、timer3和timer4的全局预分频。预分频的值设置范围在0.25MHz和32MHz之间。
需要注意的是如果CLKCONCMD.TICKSPD显示的频率高于系统时钟,则在CLKCONSTA.TICKSPD中的实际的预分频值表明是和系统时钟的值是一样的。
在PM2和PM3电源模式中,绝大多数的内部电路关闭了,然而,SRAM中任保留它的内容,内部寄存器的值也会保留。
保留数据的寄存器是CPU的寄存器、外部寄存器和RF寄存器,除非另一些位域值设置的比较特殊。切换到PM2和PM3模式的现象对于软件而已是透明的。
注意在PM3模式下睡眠定时器的值不会保存。
******************************************************************
者:fulinux
* 转载声明: 点击链接 ,如有不对之处,请指正
******************************************************************
/**********************************************************************************************************************************************************
* 文 件 名:main.c
×
* 功
能:实验一 系统时钟源的选择
*
*
CC2530有1个内部的系统时钟。时钟源可以是1个16MHz的RC振荡器,也可以是1个32MHz的晶体
*
振荡器。时钟控制是通过使用CLKCON特殊功能寄存器来执行的。系统时钟也提供给所有的8051
*
外设。
*
*
32MHz晶体振荡器的启动时间对于某些应用而言太长了,因此CC2530可以运行在16MHz RC振荡器
*
直到晶体振荡器稳定。16MHz RC振荡器的功耗要少于晶体振荡器,但是由于它没有晶体振荡器
*
精确,因此它不适用于射频收发器。
*
*
CLKCONCMD.OSC位被用来选择系统时钟源。注意:要使用射频收发器,32MHz晶体振荡器必须被选择
*
并且稳定。
*
*
注意:改变CLKCON.OSC位并不即刻生效。这是因为在实际改变时钟源之前,被选择的时钟源要
*
首先达到稳定。还要注意:CLKCONSTA.CLKSPD位将反映系统时钟频率,因此它是CLKCON.OSC位的
*
“镜子”。
*
*
当SLEEPSTA.XOSC_STB为1时,表示系统报告32MHz晶体振荡器稳定。然而,这可能并不是实际情况,
×
在选择32MHz时钟作为系统时钟源之前,应该等待一个额外的64us的安全时间,可以通过增加一
*
条空指令&NOP&来实现。如果不等待,可能会造成系统崩溃。
*
*
未被选择作为系统时钟源的振荡器,通过设置SLEEP.OSC_PD为1(默认状态)将被设置为掉电模式。
*
因此,当32MHz晶体振荡器被选择作为系统时钟源后,16MHz RC振荡器可能被关闭,反之亦然。
*
当SLEEPCMD.OSC_PD为0时,这2个振荡器都被上电并运行。
*
当32MHz晶体振荡器被选择作为系统时钟源并且16MHz RC振荡器也被上电时,根据供电电压和运
*
行温度,16MHZ RC振荡器将被不断校准以确保时钟稳定。当16MHz RC振荡器被选择作为系统时钟
*
源时,该校准不被执行。
*
*
本实验将向用户演示选择不同的振荡器作为系统时钟源。本文件中有led闪烁的子程序,用户
*
可以观察在不同系统时钟源下led的闪烁情况。
*
*
在hal.h文件中包含了和系统时钟相关的一些宏,用户使用这些宏可以简化对系统时钟的控制,
*
提高代码的可读性,本实验中就使用了其中的一些宏。
*
* 注
意:本实验可在以下目标板上进行:
*
本:V1.0
* 作
者:wuxianhai
* 日
期:
* 奥尔斯电子主页:www.ourselec.com
**********************************************************************************************************************************************************/
#include &hal.h&
#define ON
//LED状态
#define OFF
extern void ctrPCA9554LED(UINT8 led,UINT8 operation);
extern void PCA9554ledInit();
/**************************************************************************************************
* 函数名称:halWait
* 功能描述:延时
数:wait - 延时时间
* 返 回 值:无
**************************************************************************************************/
void halWait(BYTE wait){
UINT32 largeW
if(wait == 0)
largeWait = ((UINT16) (wait && 7));
largeWait += 114*
largeWait = (largeWait && CLKSPD);
while(largeWait--);
/**************************************************************************************************
* 函数名称:main
* 功能描述:反复选择不同的振荡器作为系统时钟源,并调用led控制程序,闪烁LED灯。
* 返 回 值:无
**************************************************************************************************/
void main(void)
{
PCA9554ledInit();
SET_MAIN_CLOCK_SOURCE(CRYSTAL);
// 设置系统时钟源为32MHz晶体振荡器(大约用时150us),关闭16MHz RC振荡器
for (i=0;i&10;i++)
ctrPCA9554LED(0,ON);
halWait(200);
ctrPCA9554LED(0,OFF);
halWait(200);
SET_MAIN_CLOCK_SOURCE(RC);
// 选择16MHz RC振荡器,关闭32MHz晶体振荡器
PCA9554ledInit();
halWait(200);
for (i=0;i&10;i++)
ctrPCA9554LED(1,ON);
halWait(200);
ctrPCA9554LED(1,OFF);
halWait(200);
/**********************************************************************************************************
* 文 件 名:iic.C
* 功
能:实验二 GPIO控制实验
*
该实验采用CC2530的I/O口(P1.0和P1.1)模拟IIC总线的SCL和SDA,然后通过IIC总线形式控制GPIO扩展芯片
*
PCA9554,最后通过扩展的IO来控制LED的亮灭。
*
* 硬件连接:将OURS的CC2530RF模块插入到普通电池板或智能电池板上。
*
*
P1.0 ------ SCL
*
P1.1 ------ SDA
*
本:V1.0
* 作
者:WUXIANHAI
* 日
期:
* 奥尔斯电子主页:www.ourselec.com
**************************************************************************************************************/
#include &ioCC2530.h&
#include &hal_mcu.h&
#define SCL
//IIC时钟线
#define SDA
//IIC数据线
//定义IO方向控制函数
#define IO_DIR_PORT_PIN(port, pin, dir)
if (dir == IO_OUT)
P##port##DIR |= (0x01&&(pin));
P##port##DIR &= ~(0x01&&(pin)); \
#define OSC_32KHZ
//使用外部32K晶体振荡器
//时钟设置函数
#define HAL_BOARD_INIT()
SLEEPCMD &= ~OSC_PD;
/* 开启 16MHz RC 和32MHz XOSC */
while (!(SLEEPSTA & XOSC_STB));
/* 等待 32MHz XOSC 稳定 */
asm(&NOP&);
for (i=0; i&504; i++) asm(&NOP&);
/* 延时63us*/
CLKCONCMD = (CLKCONCMD_32MHZ | OSC_32KHZ); /* 设置 32MHz XOSC 和 32K 时钟 */
while (CLKCONSTA != (CLKCONCMD_32MHZ | OSC_32KHZ)); /* 等待时钟生效*/
SLEEPCMD |= OSC_PD;
/* 关闭 16MHz RC */
#define IO_IN
//输入
#define IO_OUT
//应答标志位
uint8 PCA9554ledstate = 0;
//所有LED当前状态
/******************************************************************************
* 函数名称:QWait
* 功能描述:1us的延时
* 返 回 值:无
*****************************************************************************/
void QWait()
asm(&NOP&);asm(&NOP&);
asm(&NOP&);asm(&NOP&);
asm(&NOP&);asm(&NOP&);
asm(&NOP&);asm(&NOP&);
asm(&NOP&);asm(&NOP&);
asm(&NOP&);
}
/******************************************************************************
* 函数名称:Wait
* 功能描述:ms的延时
数:ms - 延时时间
* 返 回 值:无
*****************************************************************************/
void Wait(unsigned int ms)
{
unsigned char g,k;
for(g=0;g&=167;g++)
for(k=0;k&=48;k++);
/******************************************************************************
* 函数名称:Start_I2c
* 功能描述:启动I2C总线,即发送I2C起始条件.
* 返 回 值:无
*****************************************************************************/
void Start_I2c()
{
IO_DIR_PORT_PIN(1, 0, IO_OUT);
//设置P1.0为输出
IO_DIR_PORT_PIN(1, 1, IO_OUT);
//设置P1.1为输出
/*发送起始条件的数据信号*/
asm(&NOP&);
/*起始条件建立时间大于4.7us,延时*/
/*发送起始信号*/
/* 起始条件锁定时间大于4μs*/
/*钳住I2C总线,准备发送或接收数据 */
asm(&NOP&);
asm(&NOP&);
}
/******************************************************************************
* 函数名称:Stop_I2c
* 功能描述:结束I2C总线,即发送I2C结束条件.
* 返 回 值:无
*****************************************************************************/
void Stop_I2c()
{
IO_DIR_PORT_PIN(1, 0, IO_OUT);
//设置P1.0为输出
IO_DIR_PORT_PIN(1, 1, IO_OUT);
//设置P1.1为输出
/*发送结束条件的数据信号*/
asm(&NOP&);
/*发送结束条件的时钟信号*/
/*结束条件建立时间大于4μs*/
/*发送I2C总线结束信号*/
QWait();
}
/******************************************************************************
* 函数名称:SendByte
* 功能描述:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0 假)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
数:c - 需发送的数据
* 返 回 值:无
*****************************************************************************/
SendByte(uint8 c)
{
uint8 BitC
IO_DIR_PORT_PIN(1, 0, IO_OUT);
//设置P1.0为输出
IO_DIR_PORT_PIN(1, 1, IO_OUT);
//设置P1.1为输出
for(BitCnt=0;BitCnt&8;BitCnt++)
/*要传送的数据长度为8位*/
if((c&&BitCnt)&0x80)SDA=1;
/*判断发送位*/
asm(&NOP&);
/*置时钟线为高,通知被控器开始接收数据位*/
/*保证时钟高电平周期大于4μs*/
/*8位发送完后释放数据线,准备接收应答位*/
asm(&NOP&);
IO_DIR_PORT_PIN(1, 1, IO_IN);
if(SDA==1)ack=0;
else ack=1;
/*判断是否接收到应答信号*/
IO_DIR_PORT_PIN(1, 1, IO_OUT);
}
/******************************************************************************
* 函数名称:RcvByte
* 功能描述:用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
* 返 回 值:retc - 从器件传来的数据
*****************************************************************************/
RcvByte()
{
uint8 BitC
IO_DIR_PORT_PIN(1, 0, IO_OUT);
//设置P1.0为输出
IO_DIR_PORT_PIN(1, 1, IO_OUT);
//设置P1.1为输出
/*置数据线为输入方式*/
IO_DIR_PORT_PIN(1, 1, IO_IN);
for(BitCnt=0;BitCnt&8;BitCnt++)
asm(&NOP&);
/*置时钟线为低,准备接收数据位*/
/*时钟低电平周期大于4.7μs*/
/*置时钟线为高使数据线上数据有效*/
retc=retc&&1;
if(SDA==1)retc=retc+1;
/*读数据位,接收的数据位放入retc中 */
IO_DIR_PORT_PIN(1, 1, IO_OUT);
return(retc);
}
/******************************************************************************
* 函数名称:Ack_I2c
* 功能描述:主控器进行应答信号,(可以是应答或非应答信号)
* 返 回 值:无
*****************************************************************************/
void Ack_I2c(uint8 a)
{
IO_DIR_PORT_PIN(1, 0, IO_OUT);
//设置P1.0为输出
IO_DIR_PORT_PIN(1, 1, IO_OUT);
//设置P1.1为输出
if(a==0)SDA=0;
/*在此发出应答或非应答信号 */
else SDA=1;
//QWait();
//QWait();
/*时钟低电平周期大于4μs*/
/*清时钟线,钳住I2C总线以便继续接收*/
//QWait();
/******************************************************************************
* 函数名称:ISendByte
* 功能描述:从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
如果返回1表示操作成功,否则操作有误。
数:sla - 从器件地址
c - 需发送的数据
* 返 回 值:0 -- 失败
*****************************************************************************/
uint8 ISendByte(uint8 sla,uint8 c)
{
Start_I2c();
/*启动总线*/
SendByte(sla);
/*发送器件地址*/
if(ack==0)return(0);
SendByte(c);
/*发送数据*/
if(ack==0)return(0);
Stop_I2c();
/*结束总线*/
return(1);
}
/******************************************************************************
* 函数名称:ISendStr
* 功能描述:从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
如果返回1表示操作成功,否则操作有误。
数:sla - 从器件地址
suba - 从器件子地址
no - 数据字节数目
* 返 回 值:0 -- 失败
意:使用前必须已结束总线。
*****************************************************************************/
uint8 ISendStr(uint8 sla,uint8 suba,uint8 *s,uint8 no)
{
Start_I2c();
/*启动总线*/
SendByte(sla);
/*发送器件地址*/
if(ack==0)return(0);
SendByte(suba);
/*发送器件子地址*/
if(ack==0)return(0);
for(i=0;i&i++)
SendByte(*s);
/*发送数据*/
if(ack==0)return(0);
Stop_I2c();
/*结束总线*/
return(1);
}
/******************************************************************************
* 函数名称:IRcvByte
* 功能描述:从启动总线到发送地址,读数据,结束总线的全过程,从器件地
址sla,返回值在c. 如果返回1表示操作成功,否则操作有误。
数:sla - 从器件地址
*c - 需发送的数据
* 返 回 值:0 -- 失败
意:使用前必须已结束总线。
*****************************************************************************/
uint8 IRcvByte(uint8 sla,uint8 *c)
{
Start_I2c();
/*启动总线*/
SendByte(sla+1);
/*发送器件地址*/
//SendByte(sla);
if(ack==0)return(0);
*c=RcvByte();
/*读取数据*/
Ack_I2c(1);
/*发送非就答位*/
Stop_I2c();
/*结束总线*/
return(1);
}
/******************************************************************************
* 函数名称:IRcvStr
* 功能描述:从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
如果返回1表示操作成功,否则操作有误。
数:sla - 从器件地址
suba - 从器件子地址
no - 数据字节数目
* 返 回 值:0 -- 失败
意:使用前必须已结束总线。
*****************************************************************************/
uint8 IRcvStr(uint8 sla,uint8 suba,uint8 *s,uint8 no)
{
Start_I2c();
/*启动总线*/
SendByte(sla);
/*发送器件地址*/
if(ack==0)return(0);
SendByte(suba);
/*发送器件子地址*/
// if(ack==0)return(0);
// SendByte(sla+1);
if(ack==0)return(0);
while(no & 0)
*s++ = RcvByte();
if(no & 1)
Ack_I2c(0);
/*发送就答位*/
else Ack_I2c(1);
/*发送非应位*/
Stop_I2c();
/*结束总线*/
return(1);
}
/******************************************************************************
* 函数名称:ctrPCA9554LED
* 功能描述:通过IIC总线控制PCA9554的输出,进而控制相应的LED。
数:LED - 所控制的LED
operation - 开或关操作
* 返 回 值:无
意:PCA9554的地址为:0x40
*****************************************************************************/
void ctrPCA9554LED(uint8 led,uint8 operation)
{
uint8 output = 0x00;
uint8 *data = 0;
if(ISendStr(0x40,0x03,&output,1))
//配置PCA9554寄存器
switch(led)
//LED0控制
if (operation)
output = PCA9554ledstate & 0
output = PCA9554ledstate | 0x01;
//LED1控制
if (operation)
output = PCA9554ledstate & 0
output = PCA9554ledstate | 0x02;
//LED2控制
if (operation)
output = PCA9554ledstate & 0xf7;
output = PCA9554ledstate | 0x08;
//LED3控制
if (operation)
output = PCA9554ledstate & 0
output = PCA9554ledstate | 0x04;
//LED4控制
if (operation)
output = PCA9554ledstate & 0
output = PCA9554ledstate | 0x20;
//LED5控制
if (operation)
output = PCA9554ledstate & 0
output = PCA9554ledstate | 0x10;
if(ISendStr(0x40,0x01,&output,1)) //写PCA9554输出寄存器
if(IRcvByte(0x40,data))
//读PCA9554输出寄存器
PCA9554ledstate = *
/******************************************************************************
* 函数名称:PCA9554ledInit
* 功能描述:初始化6个LED,即关闭所有的LED
* 返 回 值:无
*****************************************************************************/
void PCA9554ledInit()
{
uint8 output = 0x00;
uint8 *data = 0;
if(ISendStr(0x40,0x03,&output,1))
//配置PCA9554寄存器
output = 0
if(ISendStr(0x40,0x01,&output,1)) //写输出寄存器
if(IRcvByte(0x40,data))
//读输出寄存器
PCA9554ledstate = *
cc2530-按键控制时钟启动与停止
分类: zigbee 2007 |举报|字号 订阅
/*功能:
1. 每隔0.065536秒(00000)切换LED显示
2. S1控制计时器开始和暂停
*/
#include &ioCC2530.h&
#define LED1 P1_0
//定义LED1为P1.0
#define S1
//定义S1为P0.1
//函数实现
void INIT_LED(void)
{
P1SEL &= ~0x01;
//设P1.0为普通I/O功能
P1DIR |= 0x01;
//设P1.0为输出方向
//将LED1点亮
}
void INIT_IO(void)
{
P0SEL &= ~0x02;
//设P0.1(S1)为普通I/O功能
P0DIR &= ~0x02;
//设P0.1(S1)为输入
P0INP &= ~0x02;
//设P0.1(S1)为上拉/下拉
P0IFG &= ~0x02;
//设P0.1(S1)状态标志寄存器清零
P0IEN |= 0x02;
//设P0.1(S1)中断使能
P2INP |= 0x60;
//P0、P1的下拉
//总中断EA为中断使能
IEN1 |= 0x20;
//开P0中断
IEN2 |= 0x10;
//开P1中断
PICTL |= 0x07;
//P0、P1下降沿触发
}
void INIT_Timer1()
{
T1CTL = 0x0C;
//128分频、停止运行
T1STAT = 0x21;
//通道0 本句可以取消吧
IRCON &= ~0x02;
}
//P0.1(S1)中断处理函数
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
if((P0IFG&0x02) == 0x02)
//P0.1(S1)状态标志寄存器触发
(P0IFG的值为0XFF,不解)
for(int i =0 ;i&8000 ;i++);
P0IFG &= ~0x02;
//P0.1(S1)状态标志寄存器清零
if(T1CTL == 0x09)
T1CTL = 0x0C;
//128分频 暂停运行
T1CTL = 0x09;
//32分频 自由运行
void main( void )
{
INIT_IO();
INIT_LED();
INIT_Timer1();
LED1 = 1 ;
if(IRCON &= 0x02)
//约0.065536秒切换LED灯闪烁
LED1 = !LED1;
IRCON &= ~0x02 ;
注:在调试的时候,按键S1按下后,产生中断进入中断函数,P0IFG的值为0xff,这里个地方不理解,应当是0xo2啊?请高手帮忙指点一下。
求一个cc2530 超声波模块测距的程序
qq级 被浏览66次
dongfangnh
采纳率:51% 10级
检举
#ifndef ULTRASOUND_H
#define ULTRASOUND_H
#define uchar unsigned char
#define uint unsigned int
#define TRIG P1_3 //P1_2
#define ECHO P0_7 //P0_1
extern uchar RG;
extern uchar H1;
extern uchar L1;
extern uchar H2;
extern uchar L2;
extern uchar H3;
extern uchar L3;
extern uchar LoadRegBuf[4];
//void Delay(uint n);
void Delay_1us(uint microSecs);
void Delay_10us(uint n);
void Delay_1s(uint n);
void SysClkSet32M();
void Init_UltrasoundRanging();
void UltrasoundRanging(uchar *ulLoadBufPtr);
__interrupt void P0_ISR(void);
×××××××××××××××××××××××××××××××××××××××××××
//×××××××××××Ultrasound.c****************************
#include &ioCC2530.h&
#include &Ultrasound.h&
uchar LoadRegBuf[4];//全局数据,用以存储定时计数器的值。
void Delay_1us(uint microSecs)
{ while(microSecs--)
{ /* 32 NOPs == 1 usecs 因为延时还有计算的缘故,用了31个nop*/
asm(&nop&); asm(&nop&); asm(&nop&); asm(&nop&); asm(&nop&);
asm(&nop&); asm(&nop&); asm(&nop&); asm(&nop&); asm(&nop&);
asm(&nop&); asm(&nop&); asm(&nop&); asm(&nop&); asm(&nop&);
asm(&nop&); asm(&nop&); asm(&nop&); asm(&nop&); asm(&nop&);
asm(&nop&); asm(&nop&); asm(&nop&); asm(&nop&); asm(&nop&);
asm(&nop&); asm(&nop&); asm(&nop&); asm(&nop&); asm(&nop&);
asm(&nop&);
void Delay_10us(uint n)
{ /* 320NOPs == 10usecs 因为延时还有计算的缘故,用了310个nop*/
for(tt = 0;tt&n;tt++);
for(yy = 310;yy&0;yy--);
{asm(&NOP&);}
void Delay_1s(uint n)
{ uint ulloop=1000;
for(tt =tt&0;tt--);
for( ulloop=1000;ulloop&0;ulloop--)
Delay_10us(100);
void SysClkSet32M()
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
//此时的CLKCONSTA为0x88。即普通时钟和定时器时钟都是32M。
void Init_UltrasoundRanging()
P1DIR = 0x08; //0为输入1为输出
设置TRIG P1_3为输出模式
TRIG=0; //将TRIG 设置为低电平
P0INP &= ~0x80; //有上拉、下拉 有初始化的左右
P0IEN |= 0x80; //P0_7 中断使能
PICTL |= 0x01; //设置P0_7引脚,下降沿触发中断
IEN1 |= 0x20; // P0IE = 1;
P0IFG = 0;
void UltrasoundRanging(uchar *ulLoadBufPtr)
SysClkSet32M();
Init_UltrasoundRanging();
Delay_1us(10); //需要延时10us以上的高电平
while(!ECHO);
T1CTL = 0x09; //通道0,中断有效,32分频;自动重装模式(0x0000-&0xffff);
L1=T1CNTL;
H1=T1CNTH;
*ulLoadBufPtr++=T1CNTL;
*ulLoadBufPtr++=T1CNTH;
Delay_10us(60000);
Delay_10us(60000);
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
T1CTL = 0x00;
LoadRegBuf[2]=T1CNTL;
LoadRegBuf[3]=T1CNTH;
L2=T1CNTL;
H2=T1CNTH;
if(P0IFG&0x080) //外部ECHO反馈信号
P0IFG = 0;
T1CTL = 0x09;
P0IF = 0; //清中断标志
××××××××××××××××××××××××××××××××××××××
#include &ioCC2530.h&
#include &Ultrasound.h&
void main(void)
UltrasoundRanging(LoadRegBuf);
Delay_1s(1);
data=256*H2+L2-L1-256*H1;
distance=(float)data*340/10000;
Delay_1s(2);
赞助商链接
racktom.com
copyright &copyright 。共享资料网内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 stm32 脉冲计数 的文章

 

随机推荐