(编写帖子额的时候不太熟练,倒置部分结构乱了 ) 一:解决问题思路
所有单片机,想要达到led闪烁,都需要延迟函数.延迟分为硬件延迟和软件延迟两种.硬件延迟涉及到定时器的概念,是后面要讲的内容,这里采用软件延迟的方法.
1 软件延迟(两种实现方式)
1.1 用指令实现延时
CC2530的每个指令是一个时钟,而标准的8051的指令周期是12个时钟。若选用32MHZ的时钟频率,那么时钟周期是1/32 us,一个指令也就是1/32us. 而CC2530系统上电默认是16MHZ的内部RC振荡器 - ZStack中大多使用的延时函数如下:
- void Delay_us(uint16 value){
- while (value--)
- {
- asm(“NOP”); //一个指令周期占用一个时钟周期
- asm(“NOP”);
- asm(“NOP”);
- }
- }
- void Delay_ms(uint16 value)
- {
- while(1)
- Delay_us(1000);
- }
复制代码 1.2 for循环实现延时 (仅做参考,主要用于讲解
- void delay_us(int n)
- {
- while(n--)
- {
- unsigned char a,b;
- for(a=173;a>0;a--)
- for(b=143;b>0;b--) ;
- }
-
- }
复制代码
2. 配置寄存器
2.1配置寄存器顺序
1.PxSEL //端口功能选择 0为通用I/0 1为外设
2.PxDIR //端口方向选择 0为输入 1为输出 LED不需要配置 PxINP寄存器
2.2 PXSEL 和PXDIR详细配置参数 (这里没办法粘贴图片,就直接给连接可以自行跳转
2-2 CC2530的通用IO及相关寄存器 - 夏日清凉~ - 博客园 (cnblogs.com)
3.demo
我的CC2530 led1和led2 是P1_0和P1_1; 而且是低电平点亮 这个根据实际情况近些年编写</div><div><div class="blockcode">
- #include <ioCC2530.h>
- #define led1(x) P1_0=~x
- #define led2(x) P1_1=~x
- void Delay_us(uint16 value){
- while (value--)
- {
- asm(“NOP”); //一个指令周期占用一个时钟周期
- asm(“NOP”);
- asm(“NOP”);
- }
- }
- void Delay_ms(uint16 value)
- {
- while(1)
- Delay_us(1000);
- }
-
- void main()
- {
- P1SEL &=~0x07;
- P1DIR |= 0x03;
-
-
-
-
- while(1)
- {
- led2(1);
- led1(0);
- Delay_ms(1000);
- led1(1);
- led2(0);
- Delay_ms(1000);
- }
-
- }
复制代码
文章参考:CC2530单片机精确延时的时间分析-CSDN博客
十二、CC2530系统时钟设置_通过配置时钟频率控制寄存器和时间频率状态寄存器实现cc2530使用外部32mhz晶-CSDN博客
|