CC2530(zigbee)入門開發: 定時器使用實例

      網友投稿 849 2022-05-30

      CC2530(zigbee)入門開發: 定時器使用實例

      theme: geek-black

      highlight: vs2015

      小知識,大挑戰!本文正在參與“程序員必備小知識”創作活動。

      第一章 定時器技術與CC2530時鐘源介紹

      1. 定時器技術

      定時器在單片機里也是屬于基本必備功能,非常常用;程序設計里,很多地方都需要使用到時間的概念,比如:使用定時器做一些輪詢檢測、精準的延時函數、串口斷幀檢測、定時器發送、提供心跳包等等。

      定時器在CPU內部的實現原理:

      定時器,是一種能夠對內部時鐘信號或外部輸入信號進行計數,當計數值達到設定要求時,向CPU提出中斷處理請求,從而實現定時或者計數功能的外設。

      定時器的最基本工作原理是進行計數。不管是定時器還是計數器,本質上都是計數器,可以進行加1(減1)計數,每出現一個計數信號,計數器就會自動加1(自動減1),當計數值從0變成最大值(或從最大值變成0)溢出時,定時就會向CPU提出中斷請求。

      CC2530一共帶了5個定時器,其中定時器1是一個16位的定時器,屬于CC2530中功能最全的一個定時,在應用開發中可以優先使用。

      根據文檔的介紹定時器1的工作模式有三種:

      第一個模式是自由運行模式:計數器從0x0000開始,在每個活動 時鐘邊沿增加1,當計數器達到0xFFFF時溢出,計數器重新載入0x0000并開始新一輪的遞增計數。該模式的計數周期是固定值0xFFFF,當達到最終計數 值0xFFFF時,標志位T1IF和OVFIF被設置。 第2個模式是模模式:計數器從0x0000開始,在每個活動時鐘邊 沿增加1,當計數器達到T1CC0寄存器保存的值時 溢出,計數器又將從0x0000開始新一輪的遞增計數, 模模式的計數周期可由用戶自行設定。 第3個模式是正計數/倒計數模式:計數器反復從0x0000開始,正計數到TICC0保存的最終計數值,然后再倒計數回0x0000,當達到最終計數值時,標志位T1IF和OVFIF被設置。

      2. 時鐘源

      CC2530一共有兩個可選的時鐘源,分別是內部和外部。

      1、內部RC震蕩器(32KHz、16MHz)

      2、外部石英晶振(32.768KHz、32MHz)

      一般在無線收發中采用外部石英晶振,因為外部石英晶振比較穩定,不受CPU內部溫度影響。

      3. 時鐘源的切換

      用于判斷時鐘源是否切換成功

      4. 定時器中斷

      定時器有3種情況能產生中斷請求(幾乎所有單片機都是這樣的事件分類):

      1. 計數器到達設定的計數值

      2. 產生輸入捕獲事件

      3. 產生輸出比較事件

      第二章 相關寄存器

      第三章: 示例代碼

      定時器1共有5對T1CCxH和T1CCxL寄存器,分別對應通道0到通道4。在使用定時器1的定時功能時,使用T1CC0H和T1CC0L兩個寄存器存放最大計數值的高8位和低8位。

      下面編寫定時器1的使用示例代碼,開啟了定時器中斷。分別定時1秒和10秒,在中斷服務函數里進行判斷,完成LED燈控制。

      #include //定義LED燈的端口 #define LED1 P1_2 #define LED2 P1_3 /* 函數功能:LED燈IO口初始化 硬件連接:LED1-->P1_2 , LED2-->P1_3 */ void LED_Init(void) { P1DIR |=0x3<<2; //配置P1_2、P1_3為輸出模式 LED1 = 1; LED2 = 1; } /*延時200毫秒*/ void delay200ms(void) //誤差 -0.125us { unsigned char a,b,c; for(c=95;c>0;c--) for(b=181;b>0;b--) for(a=14;a>0;a--); } /*===============定時器1初始化函數==================*/ void Init_Timer1() { T1CC0L = 0xd4; //設置最大計數值的低8位 T1CC0H = 0x30; //設置最大計數值的高8位 T1CCTL0 |= 0x04; //開啟通道0的輸出比較模式 T1IE = 1; //使能定時器1中斷 T1OVFIM = 1; //使能定時器1溢出中斷 EA = 1; //使能總中斷 T1CTL = 0x0e; //分頻系數是128,模模式 } unsigned char count = 0; /*================定時器1服務函數====================*/ #pragma vector = T1_VECTOR __interrupt void Timer1_Sevice() { T1STAT &= ~0x01; //清除定時器1通道0中斷標志 count++; if(count%10 == 0) //定時1秒到 { LED1 = !LED1; } if(count == 100) //定時10秒到 { LED2 = !LED2; count = 0; } } /*主函數*/ void main(void) { LED_Init();//初始化LED燈控制IO口 Init_Timer1(); while(1) { } }

      單片機

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:「免費開源」基于Vue和Quasar的crudapi前端SPA項目實戰之業務數據(七)
      下一篇:【技術方案分享】華為云OBS&RDS開發實戰-java版(下篇)
      相關文章
      亚洲综合精品香蕉久久网| 亚洲综合校园春色| 亚洲av无码兔费综合| wwwxxx亚洲| 亚洲网红精品大秀在线观看| 久久香蕉国产线看观看亚洲片| 一本久久a久久精品亚洲| 久久久久亚洲精品无码网址| 亚洲无码黄色网址| 中文字幕亚洲一区二区三区| 久久精品国产精品亚洲人人| 亚洲国产一区二区视频网站| 亚洲成A人片在线观看无码3D| 亚洲国产精品一区二区九九| 亚洲精品无码99在线观看| 久久久久久A亚洲欧洲AV冫| 中文字幕亚洲一区二区va在线| 亚洲综合在线另类色区奇米| 久久亚洲国产欧洲精品一| 亚洲av无码乱码国产精品| 亚洲欧洲国产精品你懂的| 久久精品国产精品亚洲毛片| 亚洲精品欧洲精品| 精品丝袜国产自在线拍亚洲| 亚洲中文字幕无码久久| 亚洲av乱码一区二区三区按摩| 亚洲 国产 图片| 亚洲日韩精品一区二区三区 | 久久精品国产亚洲AV未满十八| 亚洲成a人片在线不卡一二三区| 色婷婷六月亚洲综合香蕉| 亚洲成a人片在线播放| 久久精品国产精品亚洲下载| 久久91亚洲人成电影网站| 亚洲AV无一区二区三区久久| 久久久亚洲欧洲日产国码是AV| 亚洲av永久无码精品天堂久久| 亚洲日本成本人观看| 亚洲第一黄片大全| 国产亚洲精品va在线| 91精品国产亚洲爽啪在线影院|