LPC11C14


時鍾產生單元:CGU
系統振盪器:外部振盪器
IRC振盪器:內部振盪器
看門狗振盪器:
倍頻之前的時鍾:sys_pllclkin
倍頻之后的時鍾:sys_pllclkout

主時鍾源選擇寄存器:MAINCLKSEL
PLL倍頻

LPC1114發揮最大性能,選擇PLL后的時鍾,SYSCON->MAINCLKSEL        = 0x00000003;                     // 主時鍾選擇PLL后的時鍾

SYSPLLCLKSEL:系統倍頻時鍾源選擇寄存器,0-1位:00 選擇IRC振盪器。01 系統振盪器
            10選擇看門狗震盪器。11保留。
SYSCON->SYSPLLCLKSEL    = 0x00000001;//PLL時鍾源選擇系統振盪器


SYSAHBCLKDIV:系統AHB時鍾分頻器,除了給AH提供時鍾,還給內核存儲器以及APB提供時鍾。給這個寄存器寫0,LPC1114就不工作了,寫1就是LPC1114的時鍾就是主時鍾除以1.這個寄存器用8位:一般我們寫SYSCON->SYSAHBCLKDIV    = 0x01;//AHB時鍾分頻值為1.


UART:串行異步收發器。與PC機進行信息的收發。
SPI:通用串行同步收發器

SYSAHBCLKCTRL:系統外圍時鍾配置寄存器,它管理着LPC1114幾乎所有的獨立模塊的時鍾開啟與關閉。


問題1:采集數據間隔時間
由於采集環境數據(溫度、濕度、光度、三軸加速度、電量)時間間隔較長,不適合環境實時監控。

解決方案:修改系統定時器SysTick
將Tick的判斷值減小,同時將time_counter0的判斷值改到最小,由於M0主程序用while輪詢,執行語句需要時間,所以將采集數據的時間和其它時間計數器時間稍微有區別,采集數據間隔不需要做到每秒采集,所以采集數據的時間在其它時間計數器中的間隔最長,將近1秒采集一次。

 

 

M0內核處理器LPC1114時鍾倍頻最高能到50MHZ,
CGU時鍾配置圖

IRC振盪器:內部RC振盪器,12MHZ時鍾振盪器
系統振盪器:外部振盪器
Sys_pllclkin:倍頻之前的時鍾
Sys_pllclkout:倍頻之后的時鍾

MAINCLKSEL:主時鍾源選擇寄存器
   00 選擇IRC振盪器
   01選擇輸入到PLL之前的時鍾
   10選擇看門狗振盪器
   11選擇PLL之后的時鍾
系統默認的情況下是選擇IRC振盪器作為系統的主時鍾,為了讓PLL1114發揮最大的性能,選擇PLL后的時鍾作為主時鍾。
SYSPLLCLKSEL :系統倍頻時鍾源選擇寄存器


 
    00 選擇IRC振盪器
    01 選擇系統振盪器
    10 選擇看門狗振盪器
    11保留
    系統默認的情況下是選擇IRC振盪器作為PLL輸入時鍾源,但是我們外部安插了精確的12MHZ晶振,所以選擇外部12M晶振01作為時鍾源

AHB:高性能總線,用於高性能模塊之間的連接。

SYSAHBCLKDIV:系統AHB時鍾分頻器,不僅給AHB(LPC1114的AHB只有GPIO)提供時鍾,還給內核存儲器以及APB提供時鍾。給這個寄存器寫0,LPC1114就不工作了,寫1,LPC1114的系統時鍾就是主時鍾除以1

SYSPLLCLKUEN是PLL時鍾源更新允許寄存器,要想實現更新,必須對該寄存器先寫0,在寫1.
SYSCON->SYSPLLCLKUEN = 0x00;
SYSCON->SYSPLLCLKUEN = 0x01;更新

SYSPLLCTRL是系統倍頻控制寄存器,通過它可以確定倍頻的倍數。0-4位確定M值,5和6位確定P值。在普通模式下,PLL輸出頻率的公式是
    Fclkout=M*Fclkin=(FCCO)/(2*p)

  在普通模式下,輸出頻率實際上是有FCCO產生的,為了能讓PLL正常工作,FCCO需要在156-320MHZ之間。現在PLL的輸出頻率為12MHZ,LPC1114允許最大工作頻率是50MHZ,因此我們只能把它倍頻到48MHZ。所以,M=4.根據數據手冊P的值可以為1,2,,4,8.這里只有當P=2的時候FCCO的值為48*2*2=192,在156-320之間。所以M=4,P=2.

SYSPLLSTAT是倍頻狀態寄存器,專門用來看PLL有沒有鎖定,是一個只讀寄存器。
掉電配置寄存器:寫1掉電 寫0上電

int main(void)
{
SysCLK_config();
//使能GPIO時鍾
SYSCON->SYSAHBCLKCTRL |= (1<<6);
//把P1.9   P1.10 設置為輸出
GPIO1->DIR |= (1<<9);
GPIO1->DIR |= (1<<10);
while(1)
{
//關閉LED1 LED2
GPIO1->DATA |= (1<<9);
GPIO1->DATA |= (1<<10);
delay_ms(1000);
//打開LED1 LED2
GPIO1->DATA &= ~(1<<9);
GPIO1->DATA &= ~(1<<10);
delay_ms(1000);
}
}

當我們需要配置引腳功能復用時 需要先開啟IOCON時鍾 再復用引腳
//使能IOCON時鍾
SYSCON->SYSAHBCLKCTRL |= (1<<16);
IOCON->PIO0_0 &= ~0x07;//低三位清零 再賦值
IOCON->PIO0_0 |= 0x02;

看門狗:基本作用是在單片機由於不明原因產生錯誤時程序跑飛,不能及時喂狗而使單片機自動復位。

   看門狗寄存器有4個:
  
WDT->MOD:看門狗模式選擇寄存器
WDT->TC:看門狗定時器值
WDT->FEED看門狗喂狗寄存器
WDT->TV看門狗當前值寄存器(一般不用)

1 模式寄存器(M0):模式一:在定時時間內沒有喂狗,復位LPC1114
       WDT->MOD |= 0X03
      模式二:在定時時間內沒有喂狗,進入看門狗中斷服務函數  WDT->MOD |= 0X01(設置為中斷模式)
  NVIC_EnableRQ(WDT_IRQn)(開啟看門狗中斷)

2 定時器值寄存器(TC)
  這是一個完整的32位寄存器,該值可以是0-0xFFFFFFFF,不過對該寄存器寫入的值小於255時,LPC1114會自動把該值寫入255(0xFF)
  這是一個倒計時定時器,倒計時到0時,將置位模式寄存器MOD當中的2和3位。2位是看門狗超時標志WDTOF,3位是看門狗中斷標志位WDINT。


3  喂狗寄存器(FEED)

 喂狗時序為:先寫0xAA在寫0x55

WDT_CLK_Setup:1看門狗振盪器時鍾上電;2設置頻率;3選擇看門狗時鍾源;4更新時鍾源(先寫0 再寫1);5等待更新成功;6設置看門狗分頻值

PWM:1使能IOCON時鍾;2設置GPIO復用;3禁止IOCON時鍾;4復位定時器;5設置預分頻寄存器;6設置PWM輸出引腳;7設置周期寄存器;8設置周期及占空比;9啟動定時器

SysTick:系統定時器,基本作用是為操作系統服務的,與其他定時器不同的是他是24位的倒計時定時器。

static volatile uint32 TimeTick = 0;
void SysTick_Handler(void) //系統定時器中斷服務程序
{
TimeTick++;
}
void delay_ms(uint32 ms)
{
SYSTICK->STRELOAD = (((24000)*ms)-1); //往重載計數器里寫值
SYSTICK->STCURR = 0; //計數器清零
SYSTICK->STCTRL |= ((1<<1)|(1<<0)); //開啟計數器 開啟中斷
while(!TimeTick);
TimeTick = 0;
SYSTICK->STCTRL =0; //關閉計數器
}

1入口參數的范圍 用的時候不要超過這個范圍(定時器位數)
2如果超過范圍 須多次使用定時器
3 不要在中斷中使用,此函數是用中斷實現的,嵌套中斷比較麻煩,不能進行有效設置

 


串口UART:universal asynchronous receiver transmitter,即通用串行異步收發器。一般的串口有兩個作用,一是和電腦通訊,另一個是控制一些串轉並的芯片,現在大多數芯片都改成SPI控制或I2C控制,。

 
void UARTInit(uint32_t baudrate)
{
  uint32_t Fdiv;
  uint32_t regVal;

  UARTTxEmpty = 1;
  UARTCount = 0;
 
  NVIC_DisableIRQ(UART_IRQn);

  LPC_IOCON->PIO1_6 &= ~0x07;    /*  UART I/O config */
  LPC_IOCON->PIO1_6 |= 0x01;     /* UART RXD */
  LPC_IOCON->PIO1_7 &= ~0x07; 
  LPC_IOCON->PIO1_7 |= 0x01;     /* UART TXD */

  /* Enable UART clock */
  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);
  LPC_SYSCON->UARTCLKDIV = 0x1;     /* divided by 1 */

  LPC_UART->LCR = 0x83;             /* 8 bits, no Parity, 1 Stop bit */
  regVal = LPC_SYSCON->UARTCLKDIV;
  Fdiv = ((SystemAHBFrequency/regVal)/16)/baudrate ; /*baud rate */

  LPC_UART->DLM = Fdiv / 256;       
  LPC_UART->DLL = Fdiv % 256;
  LPC_UART->LCR = 0x03;  /* DLAB = 0 */
  LPC_UART->FCR = 0x07;  /* Enable and reset TX and RX FIFO. */

  /* Read to clear the line status. */
  regVal = LPC_UART->LSR;

  /* Ensure a clean start, no data in either TX or RX FIFO. */
  while (( LPC_UART->LSR & (LSR_THRE|LSR_TEMT)) != (LSR_THRE|LSR_TEMT) );
  while ( LPC_UART->LSR & LSR_RDR )
  {
 regVal = LPC_UART->RBR; /* Dump data from RX FIFO */
  }
 
  /* Enable the UART Interrupt */
  NVIC_EnableIRQ(UART_IRQn);

#if TX_INTERRUPT
  LPC_UART->IER = IER_RBR | IER_THRE | IER_RLS; /* Enable UART interrupt */
#else
  LPC_UART->IER = IER_RBR | IER_RLS; /* Enable UART interrupt */
#endif
  return;
}
配置引腳時先清空原來的狀態 再寫入新數據
1設置RX TX 2 使能時鍾 3 設置時鍾分頻值 4 8位傳輸1個停止位無奇偶校驗位 5 計算該波特率要求的除數鎖存寄存器值 6 寫鎖存器高低位 7 禁止對鎖存器的訪問 8 允許FIFO 9 讀UART狀態寄存器

啟動串口中斷方式:先開總中斷 再開串口中斷


GPIO控制寄存器:IOCON->PIOx_x是“引腳配置寄存器”,選擇引腳具體復用那
個功能。

I2Cinit 1 使能I2C模塊;2使能I2C時鍾;3使能IOCON時鍾;4配置GPIO位
I2C功能;5禁止IOCON功能;6 I2C通信7 清標志位8 使能I2C接口

GPIO->DIR是當引腳作為通用輸入輸出口時,該引腳作為輸出還是輸入腳,寫0
為輸入引腳,寫1為輸出引腳,默認情況下該寄存器為0,作為輸入引腳。


GPIO->DATA是“數據寄存器”,控制引腳電平高低,當作為輸入引腳喝死讀寄
存器就可以知道引腳的電平,當作為輸出引腳時,寫寄存器可以控制引腳的電平
高低。

Seg7led:7段數碼管

SPI:SD卡的通道接口之一。SD卡有兩種通信接口,分別是SD模式和SPI模式
,SD模式的讀寫數據比SPI模式快很多。但是LPC1114只有SPI。

 


DHT11:溫濕度模塊。包括一個電阻式感濕元件和一個NTC測溫元件,並與一個
高性能8位單片機相連接。
 
引腳說明:VDD供電3.5-5.5V DC
DATA 串行口數據,單總線
GND 接地,電源負極
NC 空腳

  單總線:只有一個數據線,系統中的數據交換,控制均有單總線完成。一次傳送40位數據高位先出。
 8位濕度整數數據+8位濕度小數數據+8位溫度整數數據+8位溫度小數數據+8位校驗位
示例:接收到的40位數據為:
0011 0101 0000 0000 0001 1000 0000 0000 0100 1101
濕度高8位 濕度低8位 溫度高8位 溫度低8位 校驗位
計算:
0011 0101+0000 0000+0001 1000+0000 0000= 0100 1101
接收數據正確:
濕度:0011 0101=35H=53%RH
溫度:0001 1000=18H=24℃
 
數據時序圖:用戶主機(MCU)發送一次開始信號后,DHT11從低功耗模式轉換到高速模式,待主機開始信號結束,DHT11發送響應信號,送出40位的數據,並觸發一次信息采集。

主機讀取的溫濕度數據總是前一次的測量值,如果兩次測量間隔時間很長,請連續讀兩次,以第二次獲得的值為實時的溫濕度值

外設讀取步驟:1 、DHT11上電(等待一秒,越過不穩定狀態在此期間不能發送任何命令),測試環境溫濕度數據,並記錄。同時DHT11的DATD數據線保持高電平,此時DATA引腳處於輸入狀態,時刻監測外部信號。
2、主機IO設置為低電平,低電平的時間不能小於18MS,給從機發送起始信號,然后拉高。
3、DHT11監測到外部信號有低電平的時候,等待外部低電平結束,DHT11輸出80微秒的低電平作為應答信號,緊接着輸出80微秒的高電平通知外設准備接受數據,微處理器的IO此時處於輸入狀態,檢測到IO有低電平后,等待80微秒的高電平后的數據接受。

4、由DHT11的DATA引腳輸出40位數據,微處理器根據IO電平變化接收40位
數據。

5、結束信號:DHT11的DATA引腳輸出40位數據后,繼續輸出低電平50微秒后
轉入輸入狀態。DHT11內部重測環境溫濕度數據,並記錄,等待外部信號的到來。

ADCinit:1ADC模塊上電;2使能ADC時鍾;3使能IOCON時鍾;4設置GPIO;
關閉IOCON時鍾;5選擇ADC輸入通道;6設置采樣時鍾頻率;7設置掃描模式;
8 位數模式;

SCL 線是高電平時,SDA 線從高電平向低電平切換,這個情況表示起始條件;
  SCL 線是高電平時,SDA 線由低電平向高電平切換,這個情況表示停止條件。
  起始和停止條件一般由主機產生,總線在起始條件后被認為處於忙的狀態
   
起始和停止條件

 
芯片的時序圖:
當CLK高電平的時候,如果SDA產生下降沿,則說明數據傳輸開始,
在CLK為高電平的時候傳輸數據,首先傳主機、從機的address,然后在傳數據。當在CLK處於高電平的時候,如果SDA產生了上升沿,說明傳輸結束。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM