PIC24系列单片机原理与开发.pdf
《PIC24系列单片机原理与开发.pdf》由会员分享,可在线阅读,更多相关《PIC24系列单片机原理与开发.pdf(199页珍藏版)》请在冰点文库上搜索。
![PIC24系列单片机原理与开发.pdf](https://file1.bingdoc.com/fileroot1/2023-5/11/dc0c436b-206b-4da8-a4f0-83e5fca61459/dc0c436b-206b-4da8-a4f0-83e5fca614591.gif)
?
1?
CPU?
32MHz?
16MIPS(?
/?
)?
8MHz?
PLL?
4?
17?
x17?
32?
/16?
16?
16?
C?
76?
12MB?
64KB?
16?
10?
500ksps?
/?
2.0V?
3.6V?
Flash?
/?
1000?
PIC24FJ128GA?
/?
RC?
LDO?
JTAG?
Power-onReset?
POR?
Power-upTimer?
PWRT?
OscillatorStart-upTimer?
OST?
WatchdogTimer?
WDT?
RC?
In-CircuitSerialProgramming?
ICSP?
In-CircuitEmulation?
ICE?
2?
3?
/4?
SPI?
4?
FIFO?
4?
2?
IIC?
/?
7?
/10?
2?
(UART)?
?
4?
FIFO?
IrDA?
/?
PMP/PSP?
8?
16?
16?
/?
Real-TimeClock/Calendar?
RTCC?
5?
16?
/?
32?
/?
5?
16?
5?
16?
/PWM?
I/O?
18mA?
5?
24?
CN?
16?
PIC24F?
.?
k?
16/32/64/128/256?
PIC24FJ64GA006T-I/PTMicrochip?
16?
Flash?
(64KB)?
:
?
(64pin)?
(?
)?
(TQFP)?
VDD10,26,38P?
VSS9,25,41P?
AVDD19P?
AVSS20P?
MCLR7I?
OSC1/CLKI/RC1239I/O?
OSC2/CLK0/RC1540I/O?
VCAP/VDDCORE56P?
ENVREG57I?
PGD1/EMUD1/PMA6/VREF+/AN0/CN2/RB016I/OPGC1/EMUC1/VREF-/AN1/CN3/RB115I/OC2IN-/AN2/SS1/CN4/RB214I/OC2IN+/AN3/CN5/RB313I/OC1IN-/AN4/CN6/RB412I/OC1IN+/AN5/CN7/RB511I/OPGC2/EMUC2/AN6/OCFA/RB617I/OPGD2/EMUD2/AN7/RB718I/OU2CTS/C1OUT/AN8/RB821I/OPMA7/C2OUT/AN9/RB922I/OTMS/PMA13/CVREF/AN10/RB1023I/OTDO/PMA12/AN11/RB1124I/OTCK/PMA11/AN12/RB1227I/OTDI/PMA10/AN13/RB1328I/OPMA1/U2RTS/BCLK2/AN14/RB1429I/OPMA0/AN15/OCFB/CN12/RB1530I/O?
RC?
2?
3?
OSC1/CLKI/RC1239I/OSOSCI/CN1/RC1347I/OSOSCO/T1CK/CN0/RC1448I/OOSC2/CLKO/RC1540I/O?
RD?
2?
3?
OC1/RD046I/OOC2/RD149I/OOC3/RD250I/OPMBE/OC4/RD351I/OPMWR/OC5/IC5/CN13/RD452I/OPMRD/CN14/RD553I/OCN15/RD654I/OCN16/RD755I/OIC1/RTCC/INT1/RD842I/OIC2/U1CTS/INT2/RD943I/O?
IC3/PMCS2/INT3/RD1044I/OIC4/PMCS1/INT4/RD1145I/O?
RE?
2?
3?
PMD0/RE060I/OPMD1/RE161I/OPMD2/RE262I/OPMD3/RE363I/OPMD4/RE464I/OPMD5/RE51I/OPMD6/RE62I/OPMD7/RE73I/O?
RF?
2?
3?
RF058I/ORF159I/OU1RX/SDI1/RF234I/OU1TX/SDO1/RF333I/OU2RX/SDA2/CN17/RF431I/OU2TX/SCL2/CN18/RF532I/OU1RTS/BCLK1/SCK1/INT0/RF635I/O?
RG?
2?
3?
SCL1/RG237I/OSDA1/RG336I/OSCK2/CN8/RG64I/OSDI2/CN9/RG75I/OSDO2/CN10/RG86I/OCN11/RG98I/O1.3.1?
1-4?
PIC24FJ128GA3.3V?
1.3.2?
1.3.3?
OSC1?
OSC2?
1.3.4?
(?
I/O?
)?
1.3.5?
A/D?
1.3.6?
INT0?
INT4?
1.3.7?
CN0?
CN18?
1.3.8?
P?
CN0:
1CN2:
7CN8:
11CN12CN13:
16CN17:
18I/O?
RC14:
13RB0:
5RG6:
9RB15RD4:
7RF4:
5MCLRMCLRMCLR?
PIC24FJxxGA006?
2?
SPI?
SerialPeripheralInterface?
SPI?
I/O?
1?
5?
PIC24FJxxGA006?
2?
IIC?
Inter?
IntegratedCircuit?
IIC(?
I2C)?
I/O?
1?
6?
1.3.9?
(ParallelMasterPort,PMP)PIC24F?
/I/O?
PMA0:
1PMA2:
5PMA6:
PMA7PMA8:
9PMA10:
13PMD0:
7PMBEPMCS1:
2PMRDPMWRRB15:
14RG9:
6RB0RB9RF5:
4RB13:
10RE0:
7RD3RD11:
12RD5RD41.3.10?
/PWM?
PWM?
PIC24FJxxGA006?
PWM?
U1RXU1TXU1RTSU1CTSU2RXU2TXU2RTSU2CTS?
RF2RF3RF6RD9RF4RF5RB14RB8?
SDI1SDO1SCK1SS1FSYNC1?
SCK2SDI2SDO2SS2FSYNC2?
RF2RF3RF6RB2RG6RG7RG8RG9?
IIC?
1IIC?
2IIC?
SCL1SDA1SDA2SCL2?
I/O?
RG2RG3RF4RF5?
MCU?
PIC24FJxxGA006?
IC1?
IC5,?
RD8?
RD11?
RD4?
1.3.11?
/?
PIC24FJxxGA006?
PGC1?
PGD1?
PGC2?
PGD2?
Microchip?
PIC24F?
MPLAB?
MPLABIDE?
MPLABIntegratedDevelopmentEnvironment?
MPLABIDE?
8/16?
SIM?
16?
PIC24?
dsPIC?
Microchip?
16?
MPLABC30?
MPLABIDE?
MPLABC30?
16?
C?
Flash?
MPLABICD2?
MPLABICD3?
PIC24?
13?
PIC24?
byZeng2012-6-7?
PIC24?
byZeng2012-6-7?
PIC24?
SFR?
SFR?
RAM?
Microchip?
MPLABC30?
gld?
(.gld?
?
p24FJ64GA006.gld)?
SFR?
RAM?
2.2.1?
2.2.2?
W?
2.2.3?
2?
1CPU?
RAM?
W0?
W150x0000?
0x001E?
PC0x002E23?
SR0x0042?
SPLIM0x0020?
CORCON0x0044?
TBLPAG0x0032?
PSVPAG0x0034?
RCOUNT0x0036REPEAT?
PIC24?
byZeng2012-6-72CPU?
2.2.4?
2.3.1?
SR?
B000000000PCPC?
PIC24?
byZeng2012-6-7?
SR?
U-0U-0U-0U-0U-0U-0U-0R/W-0?
DCbit15bit8R/W-0R/W-0R/W-0R-0R/W-0R/W-0R/W-0R/W-0?
bit7bit0?
1=?
0=?
PIC24?
byZeng2012-6-7?
2.3.2?
CORCON?
PIC24?
byZeng2012-6-72CPU?
2.3.3?
CPU?
/?
PIC24?
byZeng2012-6-7?
2.4.1?
Flash?
PC?
0x0001000x0001020x000104?
0x001234?
0x00?
23?
0?
PIC24?
byZeng2012-6-7?
Flash?
Flash?
PIC24?
byZeng2012-6-7?
PIC24?
byZeng2012-6-7?
_CONFIG1(JTAGEN_OFF&GCP_ON&GWRP_OFF&BKBUG_ON&COE_OFF&ICS_PGx1&FWDTEN_ON&FWPSA_PR32&WDTPS_PS64)?
JTAGEN_OFF?
GCP_ON?
GWRP_OFF?
BKBUG_ON?
COE_OFF?
ICS_PGx1?
FWDTEN_ON?
FWPSA_PR32?
WDTPS_PS64?
PIC24?
byZeng2012-6-7?
FWDTEN?
FWPSAWDTPS3WDTPS2WDTPSWDTPS0?
JTAGENGSS0GWRPDEBUGCOE?
ICS?
1111=1:
327681110=1:
163841101=1:
8,1921100=1:
40961011=1:
20481010=1:
10241001=1:
5121000=1:
2560111=1:
1280110=1:
640101=1:
320100=1:
160011=1:
80010=1:
40001=1:
20000=1:
1?
PIC24?
byZeng2012-6-7FCKSM1FCKSM0OSCIOFCN?
POSCMOD1POSCMOD0?
FNOSC2FNOSC1FNOSC0?
1?
0?
10MHz-32MHz?
3.5MHz-10MHz?
0-32MHz?
PIC24?
byZeng2012-6-7?
Mydebug?
_CONFIG1()?
Mydebug?
_CONFIG1()?
2.4.2RAM?
(?
)?
PIC24?
byZeng2012-6-7?
2.5.1?
PIC24?
PSV?
PSV?
16?
2-2?
MPLABC30?
const?
C?
PSV?
PSV?
CORCON?
1?
PSV?
PIC24?
W?
0x8000?
RAM?
W?
0x8000?
W=1?
?
CORCON?
PSV?
CORCON?
1?
W?
0x8000,?
CORCON?
PSV?
CORCON?
0?
23?
PSV?
23?
CPU?
8?
W?
15?
PSV?
23?
EA?
EA=?
EA=W?
W?
15?
1?
23?
EA15?
8?
PSV?
PIC24?
byZeng2012-6-7?
RAM?
PSV?
W?
W?
0?
W?
W?
0?
1?
2-1?
C?
PSV?
C?
MALABIDE?
2-6?
MALABIDE?
13?
MALABIDE?
(MPLABSIM)?
cRomConst1?
0x002a0?
Flash?
main()?
CONCON=0x0004,?
PSV?
CORCON?
1?
PSV?
C30?
c0?
cRomConst1?
PSV?
0x82a0?
CONCON?
0x00?
PSV?
x1=cRomConst1;?
#includeconstintcRomConst1=0x1234;/?
PSV?
intx1;char*ptr_Byte,Byte1,Byte2;intmain()x1=cRomConst1;/?
cRomConst1?
x1ptr_Byte=&cRomConst1;/char?
ptr_Byte?
cRomConst1?
Byte1=*ptr_Byte;/cRomConst1?
Byte1ptr_Byte+;/?
ptr_Byte?
1?
cRomConst1?
Byte2=*ptr_Byte;/cRomConst1?
Byte2?
8?
16?
RAM?
16?
PSV?
PSVPAG=0x01PSVPAG=0x00?
PSVPAG=0x02PIC24?
byZeng2012-6-7?
:
MPLABSIM?
intmain()?
x1=cRomConst1;0280FA0000lnk#0x00282841500mov.w0x82a0,0x00000x82a0?
cRomConst1?
RAM?
0284884000mov.w0x0000,0x08000x0000?
W0?
0x800?
x1ptr_Byte=&cRomConst1;0286282A00mov.w#0x82a0,0x0000cRomConst1?
RAM?
0x82a0?
W00288884010mov.w0x0000,0x0802W0?
ptr_Byte?
ptr_Byte?
=0x82a0Byte1=*ptr_Byte;028A804010mov.w0x0802,0x0000ptr_Byte?
W0?
028C784010mov.b0x0000,0x0000PSV?
:
W0?
W0028EB7E804mov.b0x0000,0x0804W0?
8?
Byte1?
Byte1=0x34ptr_Byte+;0290804010mov.w0x0802,0x0000ptr_Byte?
W0?
W0=0x82a00292E80000inc.w0x0000,0x0000W0?
1?
W0=0x82a1?
cRomConst1?
0294884010mov.w0x0000,0x0802ptr_Byte=0x82a1Byte2=*ptr_Byte;0296804010mov.w0x0802,0x0000W0?
cRomConst1?
RAM?
0298784010mov.b0x0000,0x0000PSV?
:
W0?
W0029AB7E805mov.b0x0000,0x0805Byte2?
0x12while
(1);029C37FFFFbra0x00029c?
2-2?
C?
PSV?
Flash?
cString?
xChar?
_attribute_(space(psv)?
cString?
PSV?
C30?
PSV?
_builtin_psvpage?
C30?
PSV?
MPLABIDE?
(?
)PIC24?
byZeng2012-6-7?
PSVPAGE?
#include/?
1:
JTAG?
OFF,?
?
Flash,?
?
ClipON,ICD?
PGC1/PGD1,?
WDT,WDT?
32,WDT?
64_CONFIG1(JTAGEN_OFF&GCP_OFF&GWRP_OFF&BKBUG_ON&COE_OFF&ICS_PGx1&FWDTEN_OFF&FWPSA_PR32&WDTPS_PS64)_CONFIG2(IESO_OFF&FNOSC_PRIPLL&FCKSM_CSDCMD&OSCIOFNC_ON&POSCMOD_XT)/XT?
constchar_attribute_(space(psv)cString=HelloPSV;/?
space(psv)?
PSV?
intmain()charxCharsizeofcString,i;CORCONbits.PSV=1;/?
PSV?
PSVPAG=_builtin_psvpage(cString);/?
C30?
cString?
Flash?
for(i=0;isizeof(xChar);i+)xChari=cStringi;while
(1);2.5.2?
W?
16?
/?
Flash?
24?
EA?
2-7?
EATBLPAG230?
16?
Wn?
8?
TBLPAG24?
EA?
PIC24?
byZeng2012-6-7?
TBLRDL?
TBLRDH?
Flash?
Flash?
Flash?
Flash?
Flash?
Flash?
2-3?
Rom?
RAM?
RamX?
C30?
_builtin_tblpage?
Uint*ptr?
8?
_builtin_tbloffset(Uint*ptr)?
16?
RamX.k1=1000?
RamX.k2=2000?
RamX.k3=12.34?
typedefunsignedcharUchar;typedefunsignedintUint;externvoidReadRomData(UintUpAddr8,UintLowAddr16,Uint*RamPtr,UintWordLen);structvStructUintk1;/?
Uintk2;floatk3;conststructvStructRom=1000,2000,12.34;/Flash?
(?
)structvStructRamX;/?
(?
)intmain()UintUpAddr8,LowAddr,i;UpAddr8=_builtin_tblpage(&Rom.k1);/UpAddr8Rom.k1?
8?
C30?
TBLRDL.W(Wn=0)?
2-8?
Flash?
PC?
0x0001000x0001020x0001040x00106?
230?
24?
816TBLRDH.B(Wn=1)?
0TBLRDH.B(Wn=0)TBLRDL.B(Wn=0)TBLRDL.B(Wn=1)?
PIC24?
byZeng2012-6-7LowAddr=_builtin_tbloffset(&Rom.k1);/LowAddrRom.k1?
16?
i=sizeof(Rom)/2;/i=?
while
(1);?
2.5.3Flash?
PIC24?
Flash?
In-CircuitSerialProgramming?
ICSP?
Flash?
ICSP?
PCB?
Flash?
Run-TimeSelf-Programming?
RTSP?
RTSP?
UART?
RTSP?
PIC24?
Flash?
128?
PIC24?
PIC24?
byZeng2012-6-7?
Flash?
NVMCON?
NVMKEY?
NVMCON?
NVMCON?
R/SO-0R/W-0R/W-0U-0U-0U-0U-0U-0WRWRENWRERR?
U-0R/W-0U-0U-0U-0R/W-0R/W-0R/W-0?
ERASE?
NVMOP?
WR?
1=?
00=?
WREN?
1=?
0=?
WRERR?
1=?
WR?
1?
1?
0=?
ERASE?
/?
1=?
WR?
0=?
WR?
NVMOP?
NVMOP?
1111=?
ICSP?
(ERASE=1)0011=?
ERASE=0?
ERASE=1?
0010=?
ERASE=1?
ERASE=0?
0001=?
ERASE=0?
ERASE=1?
PIC24FJ128GA?
(8?
)?
NVMCON=0x4042?
NVMCON?
0x4001?
PIC24F?
NVMOP?
0b0011?
PIC24FJ256GA110?
PIC24FJ256GB110?
NVMKEY?
Flash?
0x55?
0xAA?
NVMKEY?
NOP?
2?
8?
NVMKEY?
PIC24?
byZeng2012-6-7?
NVMKEY?
U-0U-0U-0U-0U-0U-0U-0U-0?
W-0W-0W-0W-0W-0W-0W-0W-0NVMKEY?
0?
NVMKEY?
1?
TBLPAG?
W?
2?
0x4042?
NVMCON?
3?
4?
0x55h?
NVMKEY?
5?
0xAAh?
NVMKEY?
6?
WR?
(NVMCOM?
1?
CPU?
WR?
7?
NOP?
(1)?
PIC24FJ64GA006?
3.3V?
21ms?
CPU?
1?
8?
512?
RAM?
2?
RAM?
3?
4?
(TBLPAG?
W?
)?
5?
RAM?
64?
6?
0x4001?
NVMCON?
7?
8?
0x55h?
NVMKEY?
PIC24?
byZeng2012-6-7?
9?
0xAAh?
NVMKEY?
10?
WR?
(NVMCOM?
1?
CPU?
WR?
11?
NOP?
12?
5?
11?
8?
512?
(1)?
(2)?
(3)?
3ms(?
)?
PIC24FJ64GA006?
3.3V?
1.5ms?
CPU?
2-4?
Flash?
C?
cRom1?
k1?
k2?
k3?
cRom2?
cRom1?
k1?
k2?
k3?
1000?
2000?
12.34?
cRom1?
k1?
k2?
k3?
1250?
2150?
13.42?
_attribute_?
cRom1?
Flash?
0x01000?
cRom1?
1k?
PC?
0x10000x13fe?
Flash?
_attribute_?
cRom2?
#includetypedefunsignedcharUchar;typedefunsignedintUint;externvoidflashPageErase(UintUpAddr8,UintLowAddr16);externvoidflashPageWrite(UintUpAddr8,UintLowAddr16,Uint*RamPtr);/*?
1:
JTAG?
OFF,?
?
Flash,?
?
ClipON,ICD?
PGC1/PGD1,?
WDT,WDT?
32,?
64*/_CONFIG1(JTAGEN_OFF&GCP_OFF&GWRP_OFF&BKBUG_ON&COE_OFF&ICS_PGx1&FWDTEN_OFF&FWPSA_PR32&WDTPS_PS64)_CONFIG2(IESO_OFF&FNOSC_PRIPLL&FCKSM_CSDCMD&OSCIOFNC_ON&POSCMOD_XT)/XT?
structvStructUintk1;/?
2?
1?
Uintk2;floatk3;const_attribute_(address(0x1000),space(psv)structvStructcRom1=1000,2000,12.34;/cRom1?
(?
)?
0x1000conststructvStructcRom2=1250,2150,13.42;/cRom2?
(?
)?
C30?
cRom1?
structvStructRamX;/?
cRom1UintXX64;/?
PIC24?
byZeng2012-6-7intmain()UintUpAddr8,LowAddr,i,*ptr;ptr=(Uint*)&cRom1;for(i=0;i64;i+)XXi=*ptr+;/?
cRom1?
XX?
ptr=(Uint*)&cRom2;for(i=0;i4;i+)XXi=*ptr+;/?
XX?
cRom1?
cRom2?
UpAddr8=_builtin_tblpage(&cRom1);/UpAddr8cRom1?
8?
tblpage()?
C30?
LowAddr=_builtin_tbloffset(&cRom1);/LowAddrcRom1?
16?
flashPageErase(UpAddr8,LowAddr);/?
cRom1?
Flash?
0x10000x13fe?
flashPageWrite(UpAddr8,LowAddr,&XX0);/?
XX?
cRom1?
(?
1?
)RamX=cRom1;/?
cRom1?
RamXwhile
(1);/?
RamX?
1250,2150,13.42?
.equERASE_CODE,0x4042;?
.equPROG_CODE,0x4001;?
.equbitWR,15.text.global_flashPageErase.global_flashPageWrite;=?
Flash?
512?
=;C?
:
voidflashPageErase(uintUpAddr8,uintLowAddr16);?
UpAddr8:
Flash?
8?
LowAddr16:
?
16?
_flashPageErase:
pushTBLPAGmovw0,TBLPAGtblwtlw1,w1;?
(8?
)mov#ERASE_CODE,w0movw0,NVMCONdisi#5;?
5?
7?
mov#0x55,W0;?
movW0,NVMKEYmov#0xAA,W0movW0,NVMKEYbsetNVMCON,#bitWR;?
nop;?
2?
noppopTBLPAG;?
?
returnPIC24?
byZeng2012-6-7;=?
Flash?
1?
(1?
64?
)=;C?
voidflashPageWrite(UintUpAddr8,UintLowAddr16,Uint*RamPtr);?
:
UpAddr8:
Flash?
8?
LowAddr16:
?
16?
RamPtr:
?
RAM?
_flashPa