系統(tǒng)時(shí)鐘
振蕩器
- 采用 32.768hz 和 32M 兩種晶振。
- 為什么是32.768?(2^15 = 32768)分頻下來就是1秒鐘。
- 晶振與RC振蕩器的優(yōu)缺點(diǎn)
- 晶振:有源(通電可用、簡單)纹安、無源(需要結(jié)合)陆淀;起振慢考余;穩(wěn)定、高精度轧苫;成本高楚堤;受溫度影響大;
- RC振蕩器:起振速度快含懊;頻率高身冬;簡單;成本低廉岔乔;精度低酥筝;受溫度影響。
- CLKCONCMD(時(shí)鐘控制命令寄存器)
[圖片上傳失敗...(image-5a8b86-1625738279930)]
- 系統(tǒng)時(shí)鐘源復(fù)位之后為1雏门,則在未設(shè)置時(shí)樱哼,為16MHz。(默認(rèn))
- 分頻剿配、倍頻
- 倍頻搅幅,系統(tǒng)時(shí)鐘高于時(shí)鐘源,PLL
- 選擇的系統(tǒng)頻率不能高于系統(tǒng)時(shí)鐘源呼胚,最高只能達(dá)到系統(tǒng)時(shí)鐘源的頻率茄唐。
- 查看設(shè)置是否起效
- CLKCONSTA時(shí)鐘控制狀態(tài)寄存器(只讀)與CLKCONCMD(時(shí)鐘控制命令寄存器)設(shè)置是否一致。
- SLEEPSTA睡眠模式控制狀態(tài)寄存器
[圖片上傳失敗...(image-bb1d7c-1625738279930)]
中斷
- 中斷源 中斷使能IEN(interrupt enable)
- 中斷類型
- 中斷優(yōu)先級(jí)(優(yōu)先級(jí)的數(shù)字大小與優(yōu)先級(jí)別關(guān)系查看手冊)
-
中斷處理過程
中斷處理過程 -
當(dāng)相應(yīng)的中斷源使能并發(fā)生時(shí)蝇更,中斷標(biāo)志位將自動(dòng)置1沪编,然后程序跳往中斷服務(wù)程序的入口地址執(zhí)行中斷服務(wù)程序。待中斷服務(wù)程序處理完畢后年扩,軟件中斷清零還是硬件中斷清零——查手冊蚁廓。(中斷執(zhí)行完之后中斷標(biāo)志位清零)
中斷處理 - I/O中斷:通過判斷PxIFG寄存中的中斷狀態(tài)標(biāo)志位可以判斷哪個(gè)引腳發(fā)生中斷。PxIFG寄存器有三個(gè)厨幻,分別是P0IFG相嵌、P1IFG和P2IFG。
-
通用IO口中斷設(shè)置:
通用IO口中斷設(shè)置 - 作業(yè):將KEY實(shí)驗(yàn)由查詢方式改成中斷方式(參考代碼)
#include <ioCC2530.h>
#define LED1 P1_4
#define S5 P0_4
#define S6 P0_5
#define POINT_VECTOR VECT(13,0x6B)
#define ON 0
#define OFF 1
#define DOWN 0
#define UP 1
void led_init(void);
void key_init(void);
void delay_ms(int nms);
__interrupt void P0_ISR(void);
void main(void)
{
led_init();
key_init();
while(1){
}
}
void led_init(void)
{
P1SEL&=~0x10;
P1DIR |=0x10;
LED1=OFF;//初始狀態(tài)
}
void delay_ms(int nms)
{
unsigned int i,j;
for(i=nms;i>0;i--)
for(j=578;j>0;j--);
}
void key_init(void)
{
P0IFG=0x00;
P0INP &=~0x30;
P0IEN|=0x30;
PICTL|=0X01;
EA=1;
IEN1|=0x20;
}
#pragma vector=POINT_VECTOR
__interrupt void P0_ISR(void)
{
P0IEN&=~0x30;
if(P0IFG>0)
{
if(P0IFG==0x10)
{
LED1=ON;
}
if(P0IFG==0x20)
{
LED1=OFF;
}
P0IFG=0;
}
}
定時(shí)器
- 概述:CC2530有4個(gè)定時(shí)器:定時(shí)器1~4况脆,另外還有一個(gè)睡眠定時(shí)器饭宾,和定時(shí)器2配合使用,可以使CC2530進(jìn)入低功耗模式格了。
- 方式:自由運(yùn)行模式(是模計(jì)數(shù)模式的一種)看铆、模計(jì)數(shù)模式、正計(jì)數(shù)/倒計(jì)數(shù)模式
- 自由運(yùn)行模式:在自由運(yùn)行操作模式下盛末,計(jì)數(shù)器從0x0000開始弹惦,每個(gè)活動(dòng)時(shí)鐘邊沿增加1否淤。當(dāng)計(jì)數(shù)器達(dá)到0xFFFF溢出,計(jì)數(shù)器載入0x0000棠隐。自由運(yùn)行模式可以用于產(chǎn)生獨(dú)立的時(shí)間間隔叹括,并輸出信號(hào)頻率。
- 模計(jì)數(shù)模式:當(dāng)定時(shí)器運(yùn)行在模計(jì)數(shù)器模式宵荒,16位計(jì)數(shù)器從0x0000開始,每個(gè)活動(dòng)時(shí)鐘邊沿增加1净嘀。當(dāng)計(jì)數(shù)器達(dá)到T1CC0(溢出)报咳。寄存器T1CC0H:T1CC0L保存最終計(jì)數(shù)值,計(jì)算器將復(fù)位到0x0000挖藏,并繼續(xù)遞增暑刃。如果定時(shí)器開始于T1CC0以上的一個(gè)值,當(dāng)達(dá)到最終計(jì)數(shù)值0xFFFF時(shí)膜眠,由硬件自動(dòng)設(shè)置標(biāo)志IRCON.T1IF和T1STAT.OVFIF岩臣。如果設(shè)置了相應(yīng)的中斷屏蔽位,將產(chǎn)生一個(gè)中斷請求宵膨。模計(jì)數(shù)器模式可以用于周期不是0xFFFF的應(yīng)用程序架谎。
- 正計(jì)數(shù)/倒計(jì)數(shù)模式:在正計(jì)數(shù)/倒計(jì)數(shù)模式,計(jì)數(shù)器反復(fù)從0x0000開始辟躏,“正計(jì)數(shù)”直到達(dá)到T1CC0H:T1CC0L保存的值谷扣。然后計(jì)數(shù)器將“倒計(jì)數(shù)”直到0x0000。這個(gè)定時(shí)器的輸出模式用于周期必須是對稱輸出脈沖而不是0xFFFF的應(yīng)用程序捎琐。在正計(jì)數(shù)/倒計(jì)數(shù)模式会涎,達(dá)到最終計(jì)數(shù)值時(shí),設(shè)置標(biāo)志位IRCON.T1IF和T1STAT.OVFIF瑞凑。如果設(shè)置了相應(yīng)的中斷屏蔽位末秃,將產(chǎn)生一個(gè)中斷請求。
- 定時(shí)器
- 睡眠定時(shí)器:睡眠定時(shí)器用于設(shè)置系統(tǒng)進(jìn)入和退出低功耗休眠模式之間的周期籽御。睡眠定時(shí)器還用于當(dāng)進(jìn)入低功耗模式時(shí)练慕,維持定時(shí)器2的定時(shí)。
- 定時(shí)器1是一個(gè)獨(dú)立的16位定時(shí)器技掏,支持典型的定時(shí)/計(jì)數(shù)功能贺待,有5個(gè)獨(dú)立的捕獲/比較通道。每個(gè)通道使用一個(gè)I/O引腳零截。在定時(shí)器1中由T1CTL.DIV設(shè)置的分頻器值進(jìn)一步劃分麸塞,這個(gè)分頻值可以為1、8涧衙、32或128哪工。因此當(dāng)32MHz晶振用作系統(tǒng)時(shí)鐘源時(shí)奥此,定時(shí)器1可以使用最低時(shí)鐘頻率是1953.125Hz,最高是32MHz雁比。 (1953.125 = 0.25*(10^6)/128)
- MODE:00:暫停運(yùn)行稚虎;01:自由運(yùn)行,從0x0000到0xFFFF反復(fù)計(jì)數(shù)偎捎;10:模蠢终,從0x0000到T1CC0反復(fù)技術(shù);11:正計(jì)數(shù)/倒計(jì)數(shù)茴她,從0x0000到T1CC0反復(fù)計(jì)數(shù)且從T1CC0倒計(jì)數(shù)到0x0000寻拂。
- 定時(shí)器2主要用于為IEEE802.15.4 CSAM/CA算法提供定時(shí),并且為IEEE802.15.4 MAC層提供一般的計(jì)時(shí)功能丈牢。16位定時(shí)器正計(jì)數(shù)祭钉,可變周期可精確到31.25ns。(500000/16 = 31250)
- 定時(shí)器3和定時(shí)器4是是兩個(gè)8位定時(shí)器己沛,每個(gè)定時(shí)器有兩個(gè)獨(dú)立的比較通道慌核。每個(gè)通道上使用一個(gè)I/O引腳。時(shí)鐘分頻器申尼,可以被1垮卓,2,4师幕,8扒接,16,32们衙,64钾怔,128整除。
- 作業(yè):通過操作定時(shí)器相關(guān)寄存器蒙挑,實(shí)現(xiàn) 500MS 翻轉(zhuǎn)一次 LED 燈宗侦。(參考代碼)
#include<iocc2530.h>
#define uint unsigned int
#define uchar unsigned char
//定義控制燈的端口
// #define LED1 P1_0 //定義 LED1 為 P10 口控制
// #define LED2 P1_1 //定義 LED2 為 P11 口控制
#define LED1 P1_4 //定義 LED1 為 P14 口控制
#define ON 0
#define OFF 1
#define Down 0
#define Up 1
void led_init(void);
void delay_ms(unsigned int nms);
void T1_init(void);
/*************************************************
*.函數(shù)說明:LED燈初始化函數(shù),配置LED燈相應(yīng)端口
*.函數(shù)名稱:led_init(void)
*.參數(shù)說明:無
**************************************************/
void led_init(void)
{
P1SEL &=~0x10; //p1.4為普通IO
P1DIR |= 0x10; //p1.4為輸出
LED1 = OFF; //LED1初始化為熄滅
}
/*************************************************
*函數(shù)名稱:void Delay_Ms(unsigned int xms)
*功能描述:延時(shí)函數(shù)
*參數(shù)說明:xms:延時(shí)的時(shí)間(以 MS 為單位)
**************************************************/
void delay_ms(unsigned int nms)
{
unsigned int i,j;
for(i=nms;i>0;i--)
for(j=578;j>0;j--);
}
/**************************************************
*.函 數(shù) 名 : T1_init(void)
*.功能描述 : Timer1 中斷方式初始化函數(shù)
*.輸入?yún)?shù) : NONE
*.輸出參數(shù) : NONE
*.返 回 值 : NONE
***************************************************/
void T1_init(void)
{
/* T1CTL|=0x0c; //128 分頻,自由運(yùn)行模式
// T1CTL |=0x02; //模 運(yùn)行模式
T1IE = 1; //開 Timer1 中斷
EA = 1; //開總中斷
*/
//16MHz RC是默認(rèn)的時(shí)鐘源忆蚀,沒有校準(zhǔn)的時(shí)候誤差是正負(fù)18%
//定時(shí)器的工作頻率 16MHz / 128 = 125000Hz
//定時(shí)500ms,也就是計(jì)數(shù)62500
//周期應(yīng)該是1秒矾利,實(shí)測940毫秒,RC的誤差馋袜,切換到外部晶振應(yīng)該會(huì)準(zhǔn)確一些的男旗。
T1CTL |= 0x0c; //128分頻,取模模式
T1CC0L = (62500 & 0xff); //配置通道0的低8位
T1CC0H = 62500 >> 8; //配置通道0的高8位
TIMIF |= 0x20; //打開定時(shí)器的中斷溢出標(biāo)志
T1IE = 1; //打開定時(shí)器1的中斷
EA = 1; //打開總中斷
T1CCTL0 |= 0x46;//打開通道0的中斷,設(shè)置為比較器模式,下降沿計(jì)數(shù)欣鳖。
T1CTL |= 0x02; //設(shè)置為取模模式察皇,定時(shí)器開始工作
}
void main(void)
{
led_init();//初始化 LED 端口配置
T1_init(); //初始化Timer1
while(1)
{
}
}
/**************************************************
函 數(shù) 名 : T1_ISR
功能描述 : 中斷服務(wù)函數(shù)
輸入?yún)?shù) : NONE
輸出參數(shù) : NONE
返 回 值 : NONE
***************************************************/
#pragma vector = T1_VECTOR //Timer1 中斷向量
__interrupt void T1_ISR(void)
{
if ((T1STAT & 0x01) == 0x01) { //通道1中斷標(biāo)志
LED1 = ~LED1;
T1STAT &= ~0x01;//清除通道1的中斷標(biāo)志
}
T1STAT &= ~0x20; //清除定時(shí)器1的中斷標(biāo)志
/*
static unsigned char cnt = 0;
IRCON = 0x00; //清中斷標(biāo)志, 也可由硬件自動(dòng)完成
cnt++;
if(cnt == 1)
{
cnt = 0; //計(jì)數(shù)清零
LED1=~LED1;//1 次中斷后 LED 取反,閃爍一輪(0.5 秒時(shí)間)
}
*/
}
超聲波模塊HC-SR04
- 工作原理
- 采用IO口TRIG觸發(fā)測距,給至少10us的高電平信號(hào)什荣;
- 模塊自動(dòng)發(fā)送8個(gè)40khz的方波矾缓,自動(dòng)檢測是否有信號(hào)返回;
- 有信號(hào)返回稻爬,通過IO口ECHO輸出一個(gè)高電平嗜闻,高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間。測試距離=(高電平*聲速(340m/s)/2)或uS/58=厘米;(0.01m除以340m/s再乘以來回兩倍距離,再乘以10^6辆沦,轉(zhuǎn)換為uS單位,得到58.82352個(gè)周期)
- 作業(yè):結(jié)合超聲波模塊及Timer1定時(shí)器實(shí)現(xiàn)超聲波測距(倒車?yán)走_(dá))(參考代碼下篇見)
版權(quán)聲明:本文為CSDN博主「路燈謠」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議翠肘,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lululumiao/article/details/118559792