单片机cc2530的日常学习笔记

将寄存器的某些位清零或置1

置1操作

使用或操作:任何值与0相或,保持原值;

任何值与1相或,结果都为1

注意:寄存机从右往左开始计算从0位开始,实际计算是直接将要置1位置,进行置然后计算出16进制

image-20230925094712329


清0操作

使用与操作:任何值与1相与,保持原值;

任何值与0相与,结果为0

注意:为了方便记忆 我们通常使用取反进行操作 先将要清0的位置进行置1操作然后进行取反

image-20230925100637355


通用I/0及其相关寄存器

I/O 引脚概述

共有 40 个引脚,

其中 21 个为可编程数字 I/O 引脚,

分为 3 个端口组。

P0 端口 8 个引脚,

P1 端口 8 个引脚,

P2 端口 5 个引脚。

其中,P1_0 和 P1_1 引 脚没有上拉/下拉能力

但具有 20mA 的高驱动输出能力,其余的 I/O 引脚具有 4mA 的输出驱 动能力。在 P2 端口的 5 个引脚中,其中 2 个用于仿真器接口,2 个引脚用于外部 32KHz 晶 振,在应用中,我们能够使用的数字 I/O

相关寄存器

image-20230926203431493

PXSEL

1
2
3
4
5
6
PXSEL:端口功能能选择,谁知端口是通用端口还是外设功能端口
0:对应端口被设置为通用 I/O 功能。
1:对应端口被设置为外设功能
例子:
P1SEL &= ~0x13; //将 P1_4、P1_1 和 P1_0 设置成通用 I/O 功能, 0001 0011。
P0SEL |= 0x45; //将 P0_6、P0_2 和 P0_0 设置成外设功能, 0100 0101

PXDIR

1
2
3
4
5
6
PXDIR:作为通用i/o时用来选择传输方向
0:输入
1:输出
例子:
P0DIR &= ~0x14; //将 P0_4 和 P0_2 设置输入方向, 0001 0100。
P1DIR |= 0x26; //将 P1_5、P1_2 和 P1_1 设置输出方向, 0010 011

PXINP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PXINP:作为输入端口时,选择模式是上拉/下拉还是三态

P0INP 端口输入配置寄存器
设置 P0_7 到 P0_0端口的输入模式
0:上拉/下拉(需要结合 P2INP 联合配置)。
1:三态0INP 端口输入配置寄存

P1INP 端口输入配置寄存器
设置 P1_7 到 P1_2 端口的输入模式。
0:上拉/下拉(需要结合 P2INP 联合配置)。
1:三态

P2INP 端口输入配置寄存器
第七位:为 P2 端口所有引脚选择上拉或下拉。 0:上拉。 1:下拉
第六位:为 P1 端口所有引脚选择上拉或下拉 0:上拉。 1:下拉。
第五位: 为 P0 端口所有引脚选择上拉或下拉 0:上拉。 1:下拉。
0到4位: 设置 P2_4 到 P2_0 端口的输入模式。 0:上拉/下拉。 1:三态
例子:
将 P0_1 和 P0_3 端口设置成上拉模式
P0INP &= ~0x0A; //先将 P0_3 和 P0_1 端口设置成上拉/下拉。
P2INP &= ~0x20; //再将 P0 端口的所有引脚设置上拉模式

PX

1
PX:数据端口,用来控制端口的输出或获取端口的输入

外部中断及相关寄存器

简介:

cc2530的P0,P1,P2端口的每个引脚都具有外部中断输入功能,要使得某些引脚具有中断功能进行设置

IENx中断使能寄存器

用于设置中断使能

image-20231010161216503

image-20231010161234231

CC2530中定时器1~定时器4的中断使能位分别是IEN1寄存器中的T1IE、T2IE、T3IE、T4IE 可用于设置定时器中断

image-20231010161250319

1
2
3
IEN1 |= 0x20;//开P0端口组中断    //IEN1可位寻址也可使用 P0IE=1 (IEN0也可以位寻址)
IEN2 |= 0x10;//开P1端口组中断
IEN2 |= 0x02;//开P2端口组中断

PXIEN端口触发寄存器

设置那个端口触发中断使能

image-20231010161841838

PICTL寄存器 设置中断触发方式

D0到D3设置各个端口的中断触发方式 0为上升沿触发,1为下降沿触发

image-20231010162303585

PXIFG端口状态标志寄存器

必须再中断函数中进行清除操作否则cpu会反复进入中断

image-20231011091118576

image-20231011091140561

PXIF中断标志位

分别对应三个端口位的状态标志寄存器,当某引脚触发特定 这个端口组就会自动置1 当在中断服务函数中必须手动清除

注意:先清除 PXIFN 再清除PXIF

1
2
3
/*先清除引脚标志位,再清除端口标志位,否则会不断进入中断*/
P1IFG &= ~ 0x04; //软件清除P1_2引脚的标志位
P1IF = 0; //软件清除P1端口组的标志位

总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

void Init_INTP() //中断初始化函数
{
EA = 1; //开总中断
IENx = ? ; //要用哪一个端口组?P0,P1还是P2?
/*
IEN1 |= 0x20;开P0端口组中断
IEN2 |= 0x10;开P1端口组中断
IEN2 |= 0x01;开P2端口组中断
以上都为固定开各个端口组中断的写法,至于为什么是这样子才能开P0,P1,或P2端口组的中断,翻看手册就知道了
*/
PxIEN = ? ; //开端口组中断之后,要选择用哪一个引脚?
PICTL = ? ; //开引脚中断之后,选择沿触发方式,上升沿还是下降沿?
}



定时器相关

定时器/计数

image-20231013105638296

自由运行模式

1
2
计数器从0x0000开始,在每个活动时钟边沿加1,当计数器大道0xffff是就会溢出,计数器重新载入0x0000并开始新的一轮计数
计数周期是固定值0xffff 可用于产生独立的时间间隔,输出信号频率

模模式

1
2
3
4
计数器从0x0000开始在每个活动时钟边沿加1 当计数器到达T1CC0寄存器保存值时溢出,计数器又将从0x0000开始新的一轮计数
计数周期可由用户设定 T1CC0
注意: 使用模模式,需要开启通道0的输出比较模式
定时器1通道0的输出比较功能通过T1CCTL0寄存器来设置

正计数/倒计数模式

1
2
计数器反复从0x0000开始 正计数到 T1CC0 保存的最终计数值.然后再倒计数回到0x0000 
可用于中心对齐的pwm信号输出

定时器产生中断请求的三种情况

1
2
3
4
5
6
1. 计数器达到最终计数值(溢出或回到0)
2. 输入捕获事件
3. 输出比较事件(模模式时使用)
注意: 使用模模式,需要开启通道0的输出比较模式,否则计数器的值达到T1CC0后,不会产生溢出中断
CC2530中定时器1~定时器4的中断使能位分别是IEN1寄存器中的T1IE、T2IE、T3IE、T4IE
CC2530中定时器1~定时器4分别有一个计数溢出中断屏蔽位:TxOVFIM(可位寻址)。一般不需要对TxOVFIM进行置1操作,因为上电复位时其初始值就是1

定时器1的最大计数值和计算与设置

image-20231014214751516

定时器1相关寄存器

T1CCX(五对T1CCX与T1CCXL)

image-20231014215316117

T1CNTH与T1CNTL(读取16位计数器值)

image-20231014215454350

T1CTL (定时器1的控制寄存器)

image-20231014215721720

注意一旦设置了这个值之后 定时器立刻开始了计数工作

将定时器 1 通道 0 的模式选择为比较模式 T1CCTL0 |= 0x04; //模模式定时,需开启通道 0 的比较模式


定时器3和定时器4

CC2530 的定时器 3 和定时器 4 是两个 8 位计数器,在每个时钟边沿递增或递减。每个 定时器有两个独立的比较通道,每个通道使用一个 I/O 引脚。这两个定时器有四种工作模式, 分别是:自由运行模式,倒计数模式,模模式和正计数/倒计数模式。 在倒计数模式中,定时器启动后,计数器载入 TxCC0 的内容,然后计数器倒计数,直到 其值为 0x00。当达到 0x00 时,设置 TIMIF.TxOVFIF 标志位,如果设置了相应的中断屏蔽位 TxCTL.OVFIM,就会产生一个中断请求。需要注意的是,倒计数模式中,定时器只运行一次, 一般用于需要事件超时间隔的应用。

image-20231016161036481

image-20231016161048378

看门狗定时器

看门狗中断标志位 WDTIF需要手动清除

WDTIF=0; //手动清除寄存器

image-20231017145442357

WDCTL 看门狗控制寄存器

image-20231017145704336

系统时钟设置

系统时钟是从所选的主时钟源获得的

CC2530的主时钟源,可以用16MHz的内部RC震荡器,也可以用32MHz的外部晶振

image-20231017191242206

时钟控制命令寄存器CLKCONCMD

image-20231017191336117

CLKCONCMD.OSC位选择主系统的时钟源。
改变CLKCONCMD.OSC位不会立即改变系统的时钟。
时钟源的改变首先在CLKCONSTA.OSC位与CLKCONCMD.OSC位相等的时候生效。因为在实际改变时钟源之前需要有稳定的时钟。

意思就是要先检测是否稳定在改变值:

时钟控制状态寄存器(只读) CLKCONSTA

image-20231017192603814

1
2
3
4
将CC2530的系统时钟源从 16MHz 的内部RC振荡器切换成32MHz的外部品报。
CLKCONCMD &= ~0x40; //0SC位清0,选择系统时钟源为 32MHz 第六位置0
while(CLKCONSTA & 0x40); //等待外部晶振稳定
CLKCONCMD &= ~0x07; //设置当前系统时钟的速度为 32MHz 前三位都清零

串口

串行通信接口概述

CC2530 有 2 路功能完成相同的串行通信接口 USART0 和 USATT1,它们能够分别运行于异 步 UART 模式或者同步 SPI 模式。在 UART 模式中,有 2 个独立的中断向量:发送中断和接 收完成中断。当数据缓冲寄存器就绪,准备接受新的发送数据时,就产生一个中断请求。该 中断在传送开始后立刻发生,也就是,当字节正在发送时,新的字节能够装入数据缓冲器。

PERCFG 外设控制寄存器(结合串口外设 I/O 引脚映射)

image-20231018094357627

image-20231018094442831

波特率的设置

image-20231018095320686

UxBAUD 波特率控制寄存器

image-20231018100333537

UxGCR 通用控制寄存器

image-20231018100430225

UxDBUF 接收/发送数据缓存寄存器

image-20231018100519279

UxUCR UART 控制寄存器

image-20231018100616109

UxCSR 控制和状态寄存器

image-20231018100700227