下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
ARMCortex-M0LPC1114第一章主頻控 第二章通用輸入輸出引腳 第三章串口 第四章通用定時 第五章系統(tǒng)定時器 第六章看門 喂狗 第七章模數(shù)轉(zhuǎn)換器 ADC中 第八章低功耗模 在這一章,我將向大家詳細介紹怎樣改變Cortex-M0LPC1114的主頻。LPC111X/LPC11CXXIRCPCB6鐘分頻為需要的時鐘值。時鐘輸出從300Hz到2.3MHz可調(diào)。源。所以,ISP程序使用的時鐘就是IRC,也就是說,當你自己做的板子無上圖即是PLL模塊的原理圖,被虛線包圍的是模擬電路部分。虛線左面的FCLKINPLL10MHz25MHz。虛線右面的是FCCOMPFCLKOUTPLLFCLKOUT=M*FCLKIN=12MHz48MHzFCLKIN=12MHz,FCLKOUT48MHzM4P2FCCO192MHz,符合156到320MHz范圍。鐘,PLLPLLPLLIRC R0,=SystemInitR0,=main ,可以看到,程序并不是先從main函數(shù)SystemInitmainSystemInitKEILsystem_LPC11xx.c了。關(guān)于這個函數(shù)的詳細說明,請看第1.5節(jié)的內(nèi)容。打開system_LPC11xx.c文件后,在KEIL編輯器狀態(tài)欄的上面,可以看到sheetTextEditor,ConfigurationWizard。如下圖系統(tǒng)振蕩器配置寄存器系統(tǒng)PLL控制寄存器(SYSPLLCTRL);(SYSAHBLKDIVIRCPLLPLL配置步驟為,首先,點擊SYSPLLCLKSEL右邊的項目,點擊下拉菜單,從中選擇IRCOscillator,即把IRC振蕩器時鐘作為PLL的時鐘輸入。然后,在M=MSEL+voidSystemInit(void)volatileuint32_t #if/*Clock #if((SYSPLLCLKSEL_Val&0x03)== LPC_SYSCON->PDRUNCFG&=~(1<</*Power-upSystemOsc for(i=0;i<200;i++) /*SelectPLL = =/*UpdateClock/*ToggleUpdate12.LPC_SYSCON- = /*WaitUntil #if((MAINCLKSEL_Val&0x03)== /*MainClockisPLL = &=~(1<< /*Power-up /*WaitUntilPLL #if(((MAINCLKSEL_Val&0x03)==2) = &=~(1<< /*Power-upWDT for(i=0;i<200; = /*SelectPLLClock = /*UpdateMCLKClockSource = /*ToggleUpdate =while(!(LPC_SYSCON->MAINCLKUEN&/*WaitUntilLPC_SYSCON->SYSAHBCLKDIV=31.用來計數(shù),然后一共使用了4個條件編譯,其中1個總體的條件編譯和3個嵌 volatileuint32_tuint32_t32uint32_t可以看到,uint32_tunsignedint類型,用typedef #if30.CLOCK_SETUP11endif面執(zhí)行,在此函數(shù)中,endifCLOCK_SETUP的IRC12MHz主頻下,把CLOCK_SETUP定義為0即可。ToDefinitionOf‘CLOCK_SETUP上圖中看到,CLOCK_SETUP1,所以里面的語句被編譯執(zhí)行。我們可以在這里把CLOCK_SETUP設置為0來執(zhí)行系統(tǒng)初始化函數(shù)。#if((SYSPLLCLKSEL_Val&0x03)==LPC_SYSCON->PDRUNCFG&=~(1<<5);for(i=0;i<200;i++)NOP();/*Power-upSystemOscSYSPLLCLKSEL_VAL位值0IRC振蕩器輸出掉0011IRC振蕩器掉0012001300141015101610171018-保留位能給此位19-保留位能給此位0-保留位能給此位1-保留位能給此位1-保留位能給此位0 保留位 -01IRC、FLASH、BODADC塊、系統(tǒng)振蕩器模塊、看門狗振蕩器模塊、系統(tǒng)PLL是掉電狀態(tài)。由此處就可以看到,為什么復位后是IRC在擔當著單片機的工作時鐘。位值00110120MHz頻率115-25MHz頻率范--bit0和bit1。bit0決定了是否啟用系統(tǒng)振蕩器。bit00代表啟用,bit1發(fā)生器來工作,或者是別的單片機產(chǎn)生的時鐘輸出引腳連接到了XTALIN引腳5PDRUNCFG寄存器的bit506SYSOSCCTRL_VALSYSOSCCTRL。 /*SelectPLL10.LPC_SYSCON->SYSPLLCLKUEN=/*UpdateClock11.LPC_SYSCON->SYSPLLCLKUEN=/*ToggleUpdateLPC_SYSCON->SYSPLLCLKUEN=/*WaitUntil第9行到第13行,設置PLL,涉及到兩個寄存器:SYSPLLCLKSEL和位值-功耗有要求的,最好還是關(guān)閉用不著的時鐘。當使用CANCAN的通信速率大于100kbit/s時,必須選擇系統(tǒng)振蕩器工作。位值001--當SYSPLLCLKSEL01達0x2跳出while循環(huán)向下執(zhí)行。#if((MAINCLKSEL_Val&0x03)==/*MainClockisPLL =&=~(1<</*Power-up/*WaitUntilPLL涉及到3個寄存器:SYSPLLCTRL、PDRUNCFG、SYSPLLSTAT位值反饋分頻值:M=11111:M=P=P=P=P=--保留位,給這些位寫Pbit0~4bit5和bit6決定了除數(shù)P。位值位值0PLL鎖狀01PLL已-鎖定的時候,PLL才可以正常工作。15MSELPSEL16PDRUNCFGbit70PLL#if(((MAINCLKSEL_Val&0x03)==2)for(i=0;i<200; =&=~(1<</*Power-upWDT19~23面的的語句。涉及到2個寄存器:WDTOSCCTRL和PDRUNCFG。00000:00000:(1+DIVSEL)=00001:(1+DIVSEL)=11111:(1+DIVSEL)=位值wdt_osc_clk=Fclkana/(1+0 0.6 1.05 1.4 1.75 2.1 2.4 2.7 3.0 3.25 3.5 3.75 4.0 4.2 4.4 4.6 是DIVSEL,另一個是FREQSEL。wdt_osc_clk=Fclkana/ (1+Fclkana:由bit5~8FREQSEL值決定。20DIVSELFREQSEL21PDRUNCFGbit60,給看門狗振蕩器上電。第22行,簡單的延時函數(shù),等待看門狗振蕩器穩(wěn)定。====/*SelectPLLClock /*UpdateMCLKClockSource/*ToggleUpdatewhile(!(LPC_SYSCON->MAINCLKUEN&/*WaitUntil位值IRC振蕩 bit1bit0主時鐘源,有4個時鐘源可供選擇。分別是IRC振蕩器、看門狗振蕩器、輸入到PLL的時鐘和PLL輸出的時鐘。位值001--29.29.LPC_SYSCON->SYSAHBCLKDIV=SYSAHBCLKDIV:系統(tǒng)AHB時鐘分頻寄存器位0:系統(tǒng)時鐘11.255:分頻值為-內(nèi)部所有的外設模塊。當DIV=0X0時,關(guān)閉主時鐘。CLKOUTLPC111XLPC11CXXP0.1=0關(guān)閉時鐘輸voidCLKOUT_EN(uint8_t{LPC_SYSCON->SYSAHBCLKCTRL|=(1<<16);//使能IOCONP0.1腳設置為CLKOUT=;IOCON//寫while(!(LPC_SYSCON->CLKOUTUEN&17.PIO0_1:PIO0_1引腳控制寄存器CLKOUTDIV:CLKOUT分頻寄存器CLKOUTUEN:CLKOUTSYSAHBCLKCTRLAHB位值0AHBAPB的時鐘讀101110121013101410150016101700180019001001101001001--00 1001001001--11SYSAHBCLKCTRLbit160IOCON位值選擇功選擇功選擇功5001--00GPIO1---10行,給PIO0_10xD1P0.1位0:255頻值 第12行,給CLKOUTDIV寄存器寫入分頻值。位值--第13行,給CLKOUTCLKSEL寄存器寫入了0x03,即選擇主時鐘作為CLKOUT的輸出時鐘。因為我們要觀察主時鐘是否配置正確。位值0時01--14、15CLKOUTCLKSEL先寫0再寫1達到時鐘更新的目的。DIV為48,即在CLKOUT引腳上輸出1MHz的時鐘;如果DIV為96,即在CLKOUT引腳上將輸出500KHz的時鐘。第二章通用輸入輸出引腳寬度,引腳從Px.0~Px.11,P3口是6位的寬度,引腳從P3.0~P3.5。ADC由于GPIO的各種輸入輸入應用。位---引腳的電平,bit7就對應P0.7引腳的電平,以此類推。bit12到bit31這些位保留不用。LPC1114的四個端口,每個端口都有一個DATA寄存器。由于P36P3DATAbit0bit5沒有意義。此時DATA寄存器的值只受引腳外部電平的影響。位---方向寄存器用來設置GPIO引腳的輸入和輸出功能。寄存器當中的bit0到DIRbit50P0.5GPIO0DIR位---bt0到,btbt0給對應的bt位---bit0bit11bitbit1,把對應的bit0,則觸發(fā)方式由中斷事件寄存器位---bit0到bit11,每一個bit感應寄存器”配合使用,決定引腳的電平觸發(fā)方式。給對應的bit0,如果bit1,位
個bit與引腳順序?qū)?。給對應的bit位寫0,對應引腳的中斷。給對應bit位寫1,不對應引腳的中斷置為1,那么“中斷狀態(tài)寄存器”中的對應狀態(tài)位將置1,如果這里的對應7.原始中斷狀態(tài)寄存器位---位 --蔽寄存器”中的引腳對應位設置為1,這個寄存器中的對應位才會置1。也就是019.中斷清除寄存器位---中斷清除寄存器是一個只寫寄存器,用來清除對應引腳中斷狀態(tài)位。GPIOGPIO是每個單片機的必備功能。單片機與電路的工作,大多數(shù)都是通GPIORation敢放言,學會了控制引腳的電平和引腳的電平,就等于學會了單片LED_1PLED2_P電平的時候,LEDLEDLEDP1.0LED1 #defineLED1_ONLPC_GPIO1->DATA&=#defineLED2_ONLPC_GPIO1->DATA&=void{for(}void{LPC_SYSCON->SYSAHBCLKCTRL|1<<16能IOCONLPC_IOCON->R_PIO1_0&==}}LPC_IOCON->R_PIO1_1&=LPC_IOCON->R_PIO1_1|0x01把LPC_IOCON->R_PIO1_1&=LPC_IOCON->R_PIO1_1|0x01把P1.1時LPC_GPIO1->DIR|1<<0P1.0置為輸出LPC_GPIO1->DIR|1<<1P1.1置為輸出引}int{{第2~5行,宏定義,為了下面書寫方便以及閱讀方便,例如,當下面程序中需要開LED1,只需要寫LED1_ON即可。程序在編譯的時候,會把LED1_ONLPC_GPIO1->DATA&=~(1<<0)代替,這就是#define的作用。LPC_GPIO1->DATA&=~(1<<0)即給GPIO1DATA寄存器bit0寫0,即使得P1.0為低電平。12~24LEDP1.0和P1.1GPIODIR #defineLED1_ONLPC_GPIO1->DATA&=#defineLED2_ONLPC_GPIO1->DATA&=void{for(15.void{LPC_SYSCON->SYSAHBCLKCTRL|1<<16能IOCONLPC_IOCON->R_PIO1_0&=LPC_IOCON->R_PIO1_0|0x01P1.0設置LPC_IOCON->R_PIO1_1&=LPC_IOCON->R_PIO1_1|0x01P1.1設置LPC_SYSCON->SYSAHBCLKCTRL&~(1<<16能IOCONLPC_GPIO1->DIR|1<<0P1.0LPC_GPIO1->DATA|1<<0P1.0LPC_GPIO1->DIR|1<<1P1.1LPC_GPIO1->DATA|1<<1P1.128.int{{if(KEY1_DOWNKEY1{ //延時消if(KEY1_DOWNKEY1{ {{}}}}第6~9行,按鍵1和按鍵2的宏定義,P1.9和P1.10引腳上的電平。例如,P1.0引腳的電平:(LPC_GPIO1->DATA&(1<<9))!=(1<<9)在main函數(shù)中,沒有對按鍵的初始化,是因為P1.9P1.10的情況下就是GPIO,而且是輸入功能。#defineLED1_ONLPC_GPIO1->DATA&=#defineLED2_ONLPC_GPIO1->DATA&=#defineKEY1_DOWN(LPC_GPIO1-void{LPC_SYSCON->SYSAHBCLKCTRL|1<<16能IOCONLPC_IOCON->R_PIO1_0&=LPC_IOCON->R_PIO1_0|0x01P1.0設置LPC_IOCON->R_PIO1_1&=LPC_IOCON->R_PIO1_1|0x01P1.1設置LPC_SYSCON->SYSAHBCLKCTRL&~(1<<16能IOCONLPC_GPIO1->DIR|1<<0P1.0LPC_GPIO1->DATA|1<<0P1.0LPC_GPIO1->DIR|1<<1P1.1LPC_GPIO1->DATA|1<<1P1.120.int{{))// {LPC_GPIO1->IC=0XFFF;//清RIS}{LPC_GPIO1->IC=0XFFF;//清RIS}}}寄存器中設置的中斷方式產(chǎn)生,就會使得RIS位置1,由IS、IBE、IEV寄存器第38行。發(fā)中斷、雙邊沿中斷,一共5種中斷方式。 #defineLED1_ONLPC_GPIO1->DATA&=#defineLED2_ONLPC_GPIO1->DATA&=void{LPC_SYSCON->SYSAHBCLKCTRL|1<<16IOCONLPC_IOCON->R_PIO1_0&=LPC_SYSCON->SYSAHBCLKCTRL&~(1<<16IOCONLPC_GPIO1->DIR|1<<1P1.1}void{是{LPC_GPIO1->IC0XFFF;//清中 是{LPC_GPIO1->IC0XFFF;//清中 37.int{led_initLPC_GPIO1->IE|1<<9許P1.9腳上的中LPC_GPIO1->IE|1<<10許P1.10腳上的中NVIC_EnableIRQ(EINT1_IRQnGPIO1{ 48.關(guān)于按鍵、LED的宏 和P1.1043NVIC第21~37是P1口的中斷服務函數(shù)。在中斷服務函數(shù)里面,MIS寄IE就是MIS的開關(guān),MIS某位置1,進入中斷服務函數(shù)事件LPC_GPIO1->ISLPC_GPIO1->IS|=LPC_GPIO1->IS|=LPC_GPIO1->IEVLPC_GPIO1->IEV|=LPC_GPIO1->IEV|=LPC_GPIO1->IBELPC_GPIO1->IBE|=LPC_GPIO1->IBE|=第三章串口RXDTXDRXDTXD externuint8_texternvoidUART_init(uint32_tbaudrate);externuint8_tUART_recive(void);{ LPC_SYSCON->SYSAHBCLKCTRL|1<<16能IOCONLPC_IOCON->PIO1_6&=LPC_IOCON->PIO1_6|0x01P1.6腳設置為LPC_IOCON->PIO1_7|0x01P1.7腳設置為LPC_SYSCON->SYSAHBCLKCTRL&~(1<<16能IOCON DL_valueSystemCoreClock/16/baudrate;//計算該波特率要求的除數(shù)鎖存寄存器LPC_UART->DLM=DL_value/ LPC_UART->DLLDL_value //DLABLPC_UART->FCR FIFO,RxFIFO和ClearLPC_UART 21.uint8_t{( 26.27.voidUART_send_byte(uint8_t{}3~21第22~26行,定義了串口接收函數(shù)。第27~31行,定義了串口發(fā)送函數(shù)。5:DL_valueClear。DL_value值,ClearUARTuint32_tClear,當你編譯的時候,將會產(chǎn)生一個提醒:variable“Clear”wassetbutneverused.而寫成uint32_tClear=Clear就會排除這個提示,當然,不排除這個提醒也不會6~11P1.6P1.7RXDTXD第14行,設置串口的協(xié)議,并開啟除數(shù)鎖存器的允許。因為接下來我第16、17行,寫鎖存器值。第19行,清空串口收發(fā)FIFO。24行,檢測LSR寄存器的bit0,看是否接收到數(shù)據(jù)。第25行,返回接收到的數(shù)據(jù)。30LSRbit5不同的寄存器。這一點,和普通51以及STM32是有區(qū)別的。例如,普通51單片機的收發(fā)數(shù)據(jù)都用SBUF,STM32收發(fā)數(shù)據(jù)都用DR。void{for(}int{{rec_bufUART_recive}} void{中斷ID變 //讀中斷IDIRQ_IDIRQ_ID>>1)&0x7測if(IRQ_ID==0x02{rec_buf=LPC_UART-;//把接}}16.intuart.huart.c在main.c文件中,輸入以下代碼:17.17.LPC_UART->IER=0x01{;}}19IERbit01清0,得到bit1~bit3的值。void{uint8_tdlm,LPC_UART->ACR=許自動波特whileLPC_UART->ACR&0x010x0);//等待自動波特LPC_UART->ACR|0x018;//清除自動波特率中斷標LPC_UART->LCR=LPC1114泛應用于支持AT命令的產(chǎn)品。自動波特率檢測,需要串口給單片機發(fā)送一個字節(jié),該字節(jié)的bit1和bit0Aaascii0x410x61A或auart.huart.c在main.c文件中,加入以下代碼: FIFO,RxFIFO和baud=((SystemCoreClock/LPC_SYSCON->SYSAHBCLKDIV)/(16*(256*dlm+dll)));}int{LPC_IOCON->PIO1_6&=LPC_IOCON->PIO1_6|0x01P1.6LPC_IOCON->PIO1_7|0x01P1.7={}}自動波特率有兩種模式,模式0和模式1的區(qū)別在于檢測波特率發(fā)送的字節(jié)前兩位,模式0,支持發(fā)送的字節(jié)bit1和bit0為01;模式1,支持發(fā)送的字節(jié)bit1和bit0為01或11。bit009ACR寄存器bit81,清除中斷標志。第10行,打開鎖存器允許位。第13行,關(guān)閉鎖存器的允許。第14行,清空串口收發(fā)FIFO。LPC11144,232,216給它們分別取名稱為CT16B0、CT16B1、CT32B0、CT32B1。511LPC11142100.50.02 #define #defineexternvoidvoid{ LPC_TMR16B0->IR=中LPC_TMR16B0->MCR0x04;//MR0斷產(chǎn)生TCPC,并停止定時器工}{LPC_TMR16B0->PR=SystemCoreClock/1000-1LPC_TMR16B0->MR0 意:MR016存器,值不(}{LPC_TMR16B0->PR=1LPC_TMR16B0->MR0 意:MR016存器,值不(}5SYSAHBCLKCTRLbit71CT16B0于SYSAHBCLKCTRL寄存器的定義,詳見第一章。6IRbit01MR07MCRbit21MR0PCTCPR是預分頻值寄存器,PC是預分頻計數(shù)器,TC是定時器計數(shù)器。單片機每個PCLK,PC都會加1,當PC的值等于PR的值,TC的值就會+1,PC的值0PCLKPRTC間間隔即1/ =0.02微秒。11TCRbit11,復位定時器,復位定時器后,PC=0,12PRSystemCoreClockss1/Hz1000,單位及毫秒,再減例如:當主頻為50MHz時,PR值就是 講到,TC的值每PR+1遞增,即50000個PCLK,TC遞增,那TC遞增的間隔時間即為50000*0.02微秒=1毫秒。14TCR寄存器bit0115TCRbit0bit00后,使TCRbit0為0.PR里,PR=49,即TC遞增的時間間隔是50*0.02微秒=1微秒#defineLED1_ONLPC_GPIO1->DATA&=#defineLED2_ONLPC_GPIO1->DATA&=void{LPC_SYSCON->SYSAHBCLKCTRL|1<<16能IOCONLPC_IOCON->R_PIO1_0&=LPC_IOCON->R_PIO1_0|0x01P1.0設置LPC_IOCON->R_PIO1_1&=LPC_IOCON->R_PIO1_1|0x01P1.1設置LPC_SYSCON->SYSAHBCLKCTRL&~(1<<16能IOCONLPC_GPIO1->DIR|1<<0P1.0LPC_GPIO1->DATA|1<<0P1.0LPC_GPIO1->DIR|1<<1P1.1LPC_GPIO1->DATA|1<<1P1.119.int{{ 33.下面,以“16位定時器0”為例,做一個實驗,在“16位定時器0”的捕P0.2P1.9P1.9KEY1引腳,所以,只要按一下按鍵,計數(shù)就會增加1。uart.huart.c #defineexternvoidexternvoidT16B0_delay_ms(uint16_tms);externvoidT16B0_delay_us(uint16_tus);extern timer.h{LPC_SYSCON->SYSAHBCLKCTRL|{LPC_SYSCON->SYSAHBCLKCTRL|1<<16);//使能IOCONLPC_IOCON->PIO0_2&=LPC_IOCON->PIO0_2|=0x02;/*CT16B0CAP0LPC_SYSCON->SYSAHBCLKCTRL&~(1<<16);//禁能IOCONLPC_SYSCON->SYSAHBCLKCTRL|1<<7);//使能TIM16B0LPC_TMR16B0->CTCR0x02數(shù)腳CT16B0_CAP0}3~6P0.2CT16B0CAP016器0的捕獲引腳,改變引腳功能,就需要打開IOCON模塊的時鐘,所以給SYSAHBCLKCTRLbit161IOCON位值計數(shù)模式:TCCAP腳上的上升沿遞計數(shù)模式:TCCAP腳上的下降沿遞計數(shù)模式:TCCAP腳上的雙邊沿遞寫-int{temp1=LPC_TMR16B0-
{temp2=LPC_TMR16B0-{temp1=LPC_TMR16B0-}}口,打開串口調(diào)試助手,選好串,波特率設置為9600,按動開發(fā)板上的鍵KEY1CAPCAPvoidvoid{LPC_SYSCON->SYSAHBCLKCTRL|1<<16);//使能IOCONLPC_IOCON->PIO0_2&=LPC_IOCON->PIO0_2|=0x02;/*CT16B0CAP0LPC_SYSCON->SYSAHBCLKCTRL&~(1<<16);//禁能IOCONtimer.htimer.c #defineexternvoidextern #defineexternvoidexternvoidT16B0_delay_ms(uint16_tms);externvoidT16B0_delay_us(uint16_tus);externexternvoid TIM16B0LPC_TMR16B0->PR=SystemCoreClock/100000-LPC_TMR16B0->IR=LPC_TMR16B0->MR00XFFFFLPC_TMR16B0->TCR=CT16B0}1213LPC1114斷。所以,我們在這里,給匹配寄存器MR0寫入定時器的最大值,然后設置定0。假如沒有溢出中斷,你做的車速表將停留在剎車一瞬間的車速不歸0,這是一件多么悲催的作品! //非精確延voiddelay_ms(uint16_t{for(12.voidCLKOUT_EN(uint8_t{ 門狗振蕩器時鐘上電 //使能IOCON P0.1設置CLKOUT //禁能IOCON == ;// 25.void{)//如{temp=LPC_TMR16B0-freq100000/temp {freq= LPC_TMR16B0->IR0X1F39.int{CLKOUT_EN(200);//{}}第42行,打開串口并設置串口波特率為9600。45~50100助手,選擇好串和波特率,選擇為16進制接收。把開發(fā)板上的P0.1腳,CLKOUTP0.2CAP第28行,判斷是否是CAP引起的中斷。第30行,CR0寄存器的值。當CAP引腳上有下降沿中斷產(chǎn)生,CR032TC10秒增1,每次發(fā)生下降沿中斷,就會定時器的值,再清0,所以出來的就是100000/temp。 期,單位微uint8_tvoid{//占空比,范圍//如果占空比值不是中 #defineexternuint16_tcycle;externuint8_tduty;externvoidexternvoidT16B0_delay_ms(uint16_tms);externvoidT16B0_delay_us(uint16_tus);externvoid externvoidT16B0_CAP_Init(void);externvoidT16B0M0_ externvoid LPC_SYSCON->SYSAHBCLKCTRL|1<<16);//使能IOCONLPC_IOCON->PIO0_8&=LPC_IOCON->PIO0_8|=LPC_SYSCON->SYSAHBCLKCTRL&~(1<<16);//禁能IOCONLPC_TMR16B0->PR=C=//1匹把LPC_TMR16B0->MR3=}void{}第3~18行,定義了一個初始化函數(shù),設置輸出引腳為第15行,寫入周期第22行,輸入占空比值。voidvoiddelay_ms(uint16_t{for(}int{cycle=duty= {}}10000100Hz99,然后,在while循環(huán)里面,間隔50毫秒改一次占空比,占空比從99~50循環(huán)變化。P0.8100Hz的信號,占空比從99P0.8LEDLED位符位符描00102-保留。不能給這些位寫不-保留。不能給這些位寫不2位到0-保留。不能給這3位器歸0,且清CTRL中的COUNTFLAG位。0-保留。不能給這 #defineLED1_ONLPC_GPIO1->DATA&=#defineLED2_ONLPC_GPIO1->DATA&= void{LPC_SYSCON->SYSAHBCLKCTRL|1<<16IOCONLPC_IOCON->R_PIO1_0&=LPC_IOCON->R_PIO1_1&=LPC_SYSCON->SYSAHBCLKCTRL&~(1<<16IOCONLPC_GPIO1->DIR|=LPC_GPIO1->DIR|=}voidvoid{23.int{{msTicks=0;msTicks=}}27SysTick_ConfigKEILcore_cm0.h文數(shù)是要賦給LOADSysTick_ConfigCTRL寄存器的bit21,即選擇主時鐘作為系統(tǒng)定時器的時鐘源。那么,定時器兩值遞減的時間間隔就是1SystemCoreClock秒,SystemCoreClock是當前的主頻,參數(shù)就應該是SystemCoreClock/100。第六章看門狗模塊,可以使用的看門狗。LPC1114內(nèi)部有看門狗模塊,所以無需用另外的看門狗。這一章,我將向大家介紹如何使用LPC1114內(nèi)部的看門狗240,如果沒有喂狗,將會引起看門狗事件。用戶給的定時器初值如果小于0xFF,初值將自動變?yōu)?xFF,也就是說,看門狗的初值不會小于0xFF。使用看門狗定時器,需要把SYSAHBCLKCTRLbit151源,使用WDTCLKSEL選擇時鐘源,使用WDTCLKDIV寄存器開啟時鐘。{//更新時鐘//先寫0,再1更新whileLPC_SYSCON->WDTCLKUEN&0x01));//等待更新成LPC_SYSCON->SYSAHBCLKCTRL|1<<15許WDT;//給值0x03:不喂狗elseif(mode==0LPC_WDT->MOD|0x01;//寫值0x01:不喂狗發(fā)生中LPC_WDT->FEED=LPC_WDT->FEED=看門狗,開}的時間為(25000÷100000)×4=1秒。3PDRUNCFGbit60第4行,配置WDTOSCCTRLWDT_OSC_CLK為300KHz(DIVSEL=0,F(xiàn)REQSEL=位值 位0:關(guān)閉看門狗1:分頻值…255頻值-(關(guān)于SYSAHBCLKCTRL寄存器說明,請看第二章)位位0x00-寫位位值000110012清03軟件清00400的1的值時,才可以改變。這個位在WDRESET=1候使--給這些位-1516FEED0xAA0x55,第一次喂狗開啟看門狗。位---置1后,再喂一次狗才能有效開啟看門狗。voidvoid{LPC_WDT->FEED=LPC_WDT->FEED= 沒有立即給FEED寄存器寫0x55,而是去配置其他的看門狗寄存器,將會立即void{for(}intint{uint8_tWDT_Enable(1);//看門狗初始化,1{}}第12行,定義一個變量。 #define #defineexternvoid/*數(shù):mode=1mode0{//01whileLPC_SYSCON->WDTCLKUEN&0x013,LPC_SYSCON->SYSAHBCLKCTRL|1<<15WDTif(mode==1)LPC_WDT->MOD|=0x03:elseif(mode==0LPC_WDT->MOD|0x01;//寫值0x01:LPC_WDT->FEED=LPC_WDT->FEED=}/*void{LPC_WDT->FEED=}符‘A’,在看門狗中斷函數(shù)里面,讓單片機給串口發(fā)送字符‘B開 uart.c文件的介紹,請看第四章內(nèi)容。 void{for( 10./*函數(shù)功能:看門狗中斷服務函 /*明:當MOD0x01 void{LPC_WDT->MOD&= 22.int{WDT_Enable(0);//看門狗初始化,1{}} (1UL<< (1UL<<{7.SCB->AIRCR=((0x5FA<<SCB_AIRCR_VECTKEY_Pos)|11. SCB->AIRCR=((0x5FA<<SCB_AIRCR_VECTKEY_Pos)|后給bit2位寫1??撮T狗定時器是一個倒計時定時器。假設我們規(guī)定,當定時器計數(shù)到位0-寫-中斷。該值是個10位的值,最大0x3FF,即1023。1023,當定時器倒計時到1023的時候,產(chǎn)生中斷,在看門狗中斷服務函數(shù)位-寫-當我們故意把看門狗定時器中斷服務函數(shù)里面的喂狗函數(shù)放到發(fā)送第一個在main.c文件中,輸入以下代碼:void{for( void{LPC_WDT->MOD&=14.int{uint8_t{ 26. #define #defineexternvoidexternvoidexternvoidvoid{LPC_SYSCON->PDRUNCFG&~(0x1<<6LPC_SYSCON->WDTOSCCTRL=(0x1<<5);//擇//更新時鐘01到更whileLPC_SYSCON->WDTCLKUEN&0x01));//等待更新成置看門狗分頻值LPC_SYSCON->SYSAHBCLKCTRL|1<<15許WDTLPC_WDT->WINDOW4600LPC_WDT->MOD|=LPC_WDT->FEED=18.void{LPC_WDT->FEED=LPC_WDT->FEED=23.第13行,設置提醒中斷值。第七章模數(shù)轉(zhuǎn)換器10通過CT16B0和CT32B0的CAP引腳外部上升沿或下降沿信號來啟動轉(zhuǎn)CT16B0MAT0、MAT1CT32B0MAT0、MAT1降沿來啟動轉(zhuǎn)換,注意,前面說的CAP引腳上的信號,是捕獲的外部信號,而MAT面這些話并不難,因為CAP是捕獲引腳,所以是外部信號,MAT是匹配輸意,單片機的MAT0和MAT1引腳上不必體現(xiàn)出電平的變化。位值選擇哪個引腳用和轉(zhuǎn)換,當bit0=1,用AD0;bit1=1,…,當bit7=1,用就是說,這7位當中,只允許有1個位是1SEL=0X010(注意:當BURST=1的時候,AD0INTEN寄存001硬件掃描模式:AD換將會按CLKS設置的速度重復轉(zhuǎn)換,掃描所有SEL置成1的位。首先掃描SEL最小11clocks/1010clocks/99clocks/88clocks/77clocks/66clocks/55clocks/44clocks/3-給這些位0引位當PIO1_5/DIR/CT32B0_CAP0上產(chǎn)生bit27設00在引1在引-在CR寄存器中,由SEL位選擇輸入通道,由CLKDIV決定ADBURST在adc.h在adc.h #define#defineexternvoidADC_Init(uint8_t voidADC_Init(uint8_t{LPC_SYSCON->PDRUNCFG& 能ADC 能IOCON{case00置setchannelLPC_IOCON->R_PIO0_11&=~(3<<3)P0.11腳設置AD0LPC_IOCON->R_PIO0_11&=~(1<<7)//模擬輸入模case1://通道1配置setchannel//把P1.0腳設置為AD1LPC_IOCON->R_PIO1_0&=~(3<<3)LPC_IOCON->R_PIO1_0&=~(1<<7)擬case2://通道2配置setchannel//把P1.1腳設置為AD2LPC_IOCON->R_PIO1_1&=~(3<<3)LPC_IOCON->R_PIO1_1&=~(1<<7)擬case3://通道3配置setchannel//把P1.2腳設置為AD3LPC_IOCON->R_PIO1_2&=~(3<<3)LPC_IOCON->R_PIO1_2&=~(1<<7)擬case4://通道4配置setchannelLPC_IOCON->SWDIO_PIO1_3|=//把P1.3腳設置為AD4LPC_IOCON->SWDIO_PIO1_3&=~(3<<3)LPC_IOCON->SWDIO_PIO1_3&=~(1<<7)擬case5://通道5配置setchannelLPC_IOCON->PIO1_4| //把P1.4引腳設置為AD5LPC_IOCON->PIO1_4&~(3<<3 LPC_IOCON->PIO1_4&~(1<<7 //模擬輸入模case6://通道6配置setchannel LPC_IOCON->PIO1_10| //把P1.10引腳設置為AD6LPC_IOCON->PIO1_10&~(3<<3 LPC_IOCON->PIO1_10&~(1<<7 //模擬輸入模case7://通道7配置setchannel LPC_IOCON->PIO1_11| //把P1.11引腳設置為AD7LPC_IOCON->PIO1_11&~(3<<3 LPC_IOCON->PIO1_11&~(1<<7 //模擬輸入模 //關(guān)閉IOCONLPC_ADC->CR /* 選擇通 /*bit15:bit8把采樣時鐘頻率設置為2MHz63.64.uint32_tADC_Read(uint8_t{LPC_ADC->CR|1<<24動轉(zhuǎn)adc_value=(LPC_ADC-adc_value=(LPC_ADC-72.return第5行,如果參數(shù)大于7,參數(shù)錯誤,退出函數(shù)第6行,給PDRUNCFG寄存器bit4寫1,給ADCPDRUNCFG于SYSAHBCLKCTRL寄存器的介紹,請看第一章。61IOCON第67行,啟動轉(zhuǎn)換。第69行,獲取ADC值。ADC值位于DR寄存器bit6~bit15DR寄存器的值右移6位,即LPC_ADC->DR[channel]>>6;再把移位后的數(shù)的bit0~bit9取出,即把bit10以上的數(shù)都寫成0,即把數(shù)“與”0x >[hanel>>&0xFF有頭緒。當我給他們解釋一番之后,才發(fā)現(xiàn),只要看了DR寄存器的定義,和C語言中“右移”運行于“與”的運行即可解決。所以Ration再次強調(diào),高手并也就是說,ADC值由0~1023來表示0~VDD的電壓值。利用等比公式x/adc_value=Vref/1024x寄存器:位值-0DONE1這些位表示ADC腳上的測出的ADC-0置DR00void{for( intint{{adc_value=ADC_Read(7);}} ,波特率調(diào)成9600,選擇十六進制接收,即可以看到在AD7(P1.11)通道上測到的電壓值。注意:輸入到AD7(P1.11)引因為Vref=3300mV,所以發(fā)送到電腦的電壓值單位也是mV,先發(fā)送高88在單片機上,有兩個CAP引腳可以觸發(fā)ADCCT16B0CAP0CT32B0CAP0LPC_ADC->CR=(1<<Channel)|/*選擇通LPC_ADC->CR=(1<<Channel)|/*選擇通/*bit15:bit8把采樣時鐘頻率設置為2MHz/*CT16B0CAP0觸發(fā)轉(zhuǎn)換/*下降沿觸發(fā)adc.c文件中,將ADC_InitCR { adc_value=return調(diào)試助手發(fā)送一個數(shù)據(jù)。在RationLPC1114開發(fā)板上,可以把按鍵的引腳和P0.2腳相連,只要按一下按鍵,就會給CAP0一個下降沿。由前所述,MAT觸發(fā)轉(zhuǎn)換并不是由外部信號引起的,而是由自身定時器的匹配引起的。一共有四個匹配寄存器可以用于MAT觸發(fā)轉(zhuǎn)換,它們分別是:7.1.1 #define#defineexternvoidADC_Init(uint8_texternuint32_tADC_Read(uint8_tChannel);externvoidTIM16B0_MAT_Init(uint16_tcycle_ms);{ LPC_TMR16B0->PR=SystemCoreClock/1000-//1msLPC_TMR16B0->IR=LPC_TMR16B0->TCR=這個函數(shù),用于MAT0產(chǎn)生電平翻轉(zhuǎn),當發(fā)生下降沿的時候,ADC換。MR0寄存器用于ADC轉(zhuǎn)換的時間。實際上,轉(zhuǎn)換的時間是MR0值的兩倍,因為,當MR0TC沿時,不會發(fā)生ADC轉(zhuǎn)換。關(guān)于這些定時器寄存器的配置,詳見第四章。int{{adc_value=}}打開串口調(diào)試助手,選好串,波特率調(diào)成9600,選擇十六進制接收,會看到串口助手上間隔1秒中,發(fā)送一次AD7(P1.11)引腳上測到的電壓。ADCDRbit31位,當8如果這個位是1,當全局DR寄存器的DONE位置1,中用這個位必須為1-0LPC_ADC->INTEN=LPC_ADC->INTEN=void{void{adc_value=(LPC_ADC-adc_value=
CAPCAP會觸發(fā)ADC轉(zhuǎn)換,轉(zhuǎn)換結(jié)束后,進入ADC中斷服務函數(shù)。硬件掃描模式與軟件控制模式的主要區(qū)別是:軟件控制模式需要有觸發(fā)條件,D7.1.1LPC_ADC->CR=LPC_ADC->CR=* 選擇通/*bit15:bit8把采樣時鐘頻率設置為2MHz/*硬件掃描模式3CR寄存器中的BURST{adc_value=((LPC_ADC-adc_value=returnLPC_ADC->CR=LPC_ADC->CR=/* /*bit15:bit8把采樣時鐘頻率設置為2MHz/*硬件掃描模式CR寄存器的bit0~bit7SEL1void{uint16_tfor( 10.11.uint8_t{adc_temp=adc_value[0]=adc_value[1]=adc_temp=adc_value[2]=adc_value[3]=adc_temp=adc_value[4]=adc_value[5]=adc_temp=adc_value[6]=adc_value[7]=adc_temp=adc_value[8]=adc_value[9]=adc_temp=adc_value[11]=adc_temp=adc_value[12]=adc_value[13]=adc_temp=adc_value[15]=adc_temp;}}LPC1114內(nèi)部有很多的模塊,幾乎每個模塊都可以通過相關(guān)寄存器來控制睡眠模式(Sleep的寄存器、SRAM中的數(shù)據(jù)以及單片機引腳的電平都會保持不變。PCONDPDENWFI#defineLED1_ONLPC_GPIO1->DATA&=#defineLED2_ONLPC_GPIO1->DATA&=/*數(shù)名稱:延時函void{for(15.16./*函數(shù)名稱:LED燈初始 void{LPC_SYSCON->SYSAHBCLKCTRL|1<<16能IOCONLPC_IOCON->R_PIO1_0&=LPC_IOCON->R_PIO1_0|0x01P1.0設置LPC_IOCON->R_PIO1_1&=LPC_IOCON->R_PIO1_1|0x01P1.1設置LPC_SYSCON->SYSAHBCLKCTRL&~(1<<16能IOCONLPC_GPIO1->DIR|1<<0P1.0LPC_GPIO1->DATA|1<<0P1.0LPC_GPIO1->DIR|1<<1P1.1LPC_GPIO1->DATA|1<<1P1.131.32./*函數(shù)名稱:GPIO1中斷函 void{=LPC_GPIO1->IC0XFFF;//清RIS39.40./*函數(shù)名稱:主函 int44.44. uint8_tLPC_GPIO1->IE|1<<9P1.9{{cnt=}}}第46行,初始化了led燈。47,48P1.9P1.10第49行,打開了GPIO1上的NVIC中斷。50whilewhile流水燈的效果(ledP1.9P1.1059cnt20cnt062進入睡眠模式后,流水燈停止流水。這時,可以給P1.9或P1.10一個下降沿來喚醒單片機。RATIONV3.0上,P19和P1.10連接KEY1和KEY2,只要按下KEY1或KEY2,就會喚醒單片機,使得流水燈繼續(xù)執(zhí)行。當cnt到達20后,又會進入睡眠模式。 #defineexternvoidvoid{LPC_PMU->PCON&=~(1<<1);SCB->SCR&=~(1<<2);}DPDEN=0;選擇sleep/deep-sleepSLEEPDEEP=0擇sleepwfi令進入低功耗模PCONPMUSCRCrotex-M0位值0--保留位,不能給1001--寫8001--寫01 - 給這些位寫 LPC_PMU->PCON& DPDEN=0;選擇sleep/deep-sleep位0-010=0200=睡眠模 1=深度睡眠模3-保04發(fā)送中斷信號。當有中斷進入等待中斷模式,中斷信號可將 WFE如果CPU會在下一個WFE指令后生效。當然執(zhí)行SEV指令也可將CPU喚醒 SCB->SCR& SLEEPDEEP=0擇sleep wfi(); wfi個中斷到來,掛起后,相當于一直執(zhí)行NOP指令。深度睡眠模式(Deep-sleep在深度睡眠模式,除了BODPDSLEEPCFG模式期間BOD模塊和看門狗振蕩器是否需要工作。在深度睡眠模式,消除了flash、所有模擬外設、處理器自身、器、相PLL都會掉電。如果需要看門狗振蕩器工作,它的時鐘必須設置到最小值,即把WDTOSCCTRL寄存器中的FREQSEL位設置為0001。當需要定時器喚醒單片機,可以在SYSAHBCLKCTRL寄存器中開啟看門狗PCONDPDENPDSLEEPCFG打開,然后在MAINCLKSEL把主時鐘源選擇為看門狗振蕩器時鐘;如果使用外部引腳來喚醒單片機,配置STARTAPRP0STARTERP0,STARTRSRP0CLRNVICSYSAHBCLKCTRLWDTWFI13P0.0~P0.11P1.0。定時器匹配引腳時,只能是在P0.1、P0.8~P0.11引腳上,因為只有這幾個引#defineLED1_ONLPC_GPIO1->DATA&=#defineLED2_ONLPC_GPIO1->DATA&=/*數(shù)名稱:延時函voiddelay(){for(}16.17./*函數(shù)名稱:LED燈初始 18.void{LPC_SYSCON->SYSAHBCLKCTRL|1<<16能IOCONLPC_IOCON->R_PIO1_0&=LPC_IOCON->R_PIO1_0|0x01P1.0設置LPC_IOCON->R_PIO1_1&=LPC_IOCON->R_PIO1_1|0x01P1.1腳設置為LPC_SYSCO
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年評估共享經(jīng)濟對房地產(chǎn)市場的影響
- 2026黑龍江七臺河市農(nóng)投百安供熱有限公司招聘16人筆試備考試題及答案解析
- 2026年電磁場對材料力學性能的顯著影響
- 2025年粵東醫(yī)院筆試題及答案
- 2025年楊浦區(qū)小學英語筆試及答案
- 2025年中拓國際投資集團筆試及答案
- 2025年天津事業(yè)單位專技崗考試及答案
- 2025年宿城人事考試及答案
- 2026年鐵路集團嫩江公司市場化招聘10人筆試模擬試題及答案解析
- 2025年美林數(shù)據(jù)公司招聘筆試題及答案
- 民爆物品倉庫安全操作規(guī)程
- 老年癡呆科普課件整理
- 2022年鈷資源產(chǎn)業(yè)鏈全景圖鑒
- von frey絲K值表完整版
- 勾股定理復習導學案
- GB/T 22900-2022科學技術(shù)研究項目評價通則
- SB/T 11094-2014中藥材倉儲管理規(guī)范
- GB/T 6418-2008銅基釬料
- GB/T 16621-1996母樹林營建技術(shù)
- GB/T 14518-1993膠粘劑的pH值測定
- GB/T 14072-1993林木種質(zhì)資源保存原則與方法
評論
0/150
提交評論