找回密码
 注册
关于网站域名变更的通知
查看: 654|回复: 2
打印 上一主题 下一主题

【PIC32】入门学习

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-5-30 17:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
前端时间晒了自己入手的<MPLAB STARTER KIT FOR PIC18 mcuS>,大概了解了一下之后,发现8位单片机并不适合我玩,因为我习惯了32位单片机的高大上(8位机基本没用过,起步就是16位的MSP430),所以后来又入手了<PIC32 Ethernet Starter Kit II>。% }( {' E' n4 g% k! U+ ]: M

7 v& d% p; |8 c0 H( }! u说说我选择PIC32的理由(这个纯属个业余爱好,就是玩,不用于任何产品),因为平时较多的时候使用Mac Book,Microchip的MPLAB X开发环境是跨平台的,可以运行在windows、linux以及OS X上,能在OS X上很方便玩起来的单片机绝对不多(虽然有GCC这种跨平台神器,但是大家都知道,新手根本玩不转这东西);另外MPLAB X开发环境以及XC系列编译器是免费的,虽然免费的XC编译器好像很渣的样子(不能选择优化)。% f- I' O* v2 t9 }# Z$ O3 k, t# n; z" \

& \* Y3 `9 g0 l' cPIC32主要包括两大系列,PIC32MX和PIC32MZ,本文主要针对PIC32MX795F512L。PIC32MX7xx采用MIPS32&reg; M4K内核,工作电压2.3V-3.6V,最高主频80MHz。4 a2 U3 u5 X6 y' {7 P3 `
" f( c8 C7 U  l1 {) \- D
这几天在看一本书《32位单片机C语言编程基于PIC32》,英文名《Programming 32-bit Microcontrollers in C Exploring the PIC32》(下载链接:http://download.eeworld.com.cn/download/lcofjp/62303),在此分享一些心得。: o! J/ Q6 m. y; O" ]9 `0 s
PIC32也拥有像STM32类似的外设库(PIC32MX Peripheral Library),在使用的时候包含plib.h即可。先来说说IO口,PIC32提供两种调试接口,JTAG和ICSP/ICD接口,要使用PORTA的部分引脚作为IO口,必须禁止JTAG接口:DDPCONbits.JTAGEN = 0; PORTB的大部分引脚与ADC输入引脚复用,复位时被配置为模拟功能,若要作为IO口使用,则需配置ADC模块: AD1PCFG = 0xFFFF; 如果某个外围模块的输入输出引脚与IO端口复用,那么一旦启用该外围设备,它就将完全控制该IO端口,与方向控制寄存器(TRISx)的内容无关,然而在8位架构中,即使该模块需要使用这些引脚,用户也得自己制定每个引脚的正确方向。- n, y/ V4 {- {2 R# k8 J
. \% O' }' H( q0 O0 ~) {0 n0 ^3 d
PIC32的中断分为两种工作模式:单向量工作模式和多向量工作模式。单向量工作模式只有一个中断函数,所有中断都在同一个函数中得到响应(8位单片机基本都是这种模式),可想而知,如果有多个中断要响应,则要判断多个标志位才能确定是产生了哪个中断,因此这种中断响应的延迟很大。多向量工作模式的话,和ARM cortex-M3的原理差不多,可以每个外设模块使用一个中断向量,最多可达64个中断向量。中断优先级分为两种,组优先级和子优先级,组优先级有0-7共8个,上电时,所有中断源的优先级都被默认地设定为ipl0,并屏蔽所有的中断。在相同的组优先级内,还有两个数据位用于定义4个子优先级。如果有2个组优先级相同的事件发生,那么子优先级高者将先被响应。每款PIC32单片机都定义了各种中断源的默认相对优先级。当其他条件都无效时(组优先级和子优先级都相同),将根据自然顺序决定响应同时发生的多个事件中的哪一个。
, d/ r% |: T" u8 s" O! v中断函数的写法(其中一种,比较简单的写法):
0 {7 n+ G3 E  i: j: lvoid __ISR(VECTOR, IPL) HandlerName(void);
6 b" v" _7 k2 U" _+ ~其中VECTOR指定要响应的某个中断向量,IPL指定中断的优先级。
2 j+ _4 X9 `. {  T例如:) C7 u2 s) N3 v% B  [* ?
void __ISR(_TIMER_1_VECTOR, IPL0SOFT) Timer1ISR(void)
5 ^. F. i& }: F4 R5 L2 g{
: J' j* o2 e% v}
1 \% U/ V2 w) _' F' ]; b最后来个流水灯的示例吧,调了半个晚上才弄出来,问题在于要给FPB进行分频时,就不要执行SYSTEMConfigPeRFormance函数了,它会把FPB调到系统能接受的最大值,导致频率不对。, n$ Y$ X; y4 \- f2 ]
+ t3 b  @% z$ M; c( c- r
#include <stdio.h>
+ ^( \7 y! `$ y# A+ W$ b+ j1 ]# N#include <stdlib.h># t1 D- S" R2 H2 |
#include <stdint.h>
/ ?/ e" [; p) z- U9 u#include <plib.h>
0 |- Z3 K; c$ c2 e( j7 e7 p8 W' \* t  O. J
// DEVCFG3
3 i  P/ a0 i7 D# p* p% R// USERID = No Setting" [* k3 E! m  U1 a1 K' b9 ~
#pragma config FSRSSEL = PRIORITY_7     // SRS Select (SRS Priority 7)  t, q6 T$ u& X0 @4 w3 G9 i
#pragma config FMIIEN = ON              // Ethernet RMII/MII Enable (MII Enabled)
3 {; Y' l6 t8 T  E* @( V#pragma config FETHIO = ON              // Ethernet I/O Pin Select (Default Ethernet I/O)
( W/ ~5 }) J9 B2 Y2 j+ K0 M#pragma config FCANIO = ON              // CAN I/O Pin Select (Default CAN I/O)
9 [. o  S7 R2 x" y#pragma config FUSBIDIO = ON            // USB USID Selection (Controlled by the USB Module)( V1 \( a# L9 q! B9 ?# o
#pragma config FVBUSONIO = ON           // USB VBUS ON Selection (Controlled by USB Module)
- p# |/ t; Y/ W2 Q
+ M5 T* d& _$ V" O+ d// DEVCFG2
9 j4 |; p& D6 F+ s#pragma config FPLLIDIV = DIV_2         // PLL Input Divider (4x Divider)% l2 O6 t+ Q) ~$ E( @2 a  Y
#pragma config FPLLMUL = MUL_18         // PLL Multiplier (18x Multiplier), l1 D1 t/ s2 K* Y( X6 ]
#pragma config UPLLIDIV = DIV_1         // USB PLL Input Divider (1x Divider)/ `; I. o) y9 _' y# k& f. o
#pragma config UPLLEN = OFF             // USB PLL Enable (Disabled and Bypassed)" U/ [5 O6 c9 O
#pragma config FPLLODIV = DIV_1         // System PLL Output Clock Divider (PLL Divide by 1); z/ I; Y2 O+ d

- ]3 |2 d" W% G9 j& Z0 d' k// DEVCFG19 ^& f4 f& F3 l9 n5 p9 t. N
#pragma config FNOSC = PRIPLL              // Oscillator Selection Bits (Primary Osc (XT,HS,EC))* L% U' `$ O! [& t
#pragma config FSOSCEN = ON             // Secondary Oscillator Enable (Enabled)
5 g8 P' I0 `( l$ E+ }#pragma config IESO = ON                // Internal/External Switch Over (Enabled)
1 ]9 ^/ ]5 N, M( C1 ]# u: j  {  A#pragma config POSCMOD = XT             // Primary Oscillator Configuration (XT osc mode)/ W$ F* p; r- {. c
#pragma config OSCIOFNC = OFF           // CLKO Output Signal Active on the OSCO Pin (Disabled)' ?* a4 D. a: p- C5 c
#pragma config FPBDIV = DIV_8           // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/8)
% i) r7 Q" \6 E$ O4 X( v  q#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled)
! s" m6 f' f4 ]6 ]; ^) P/ ]" ^' ~#pragma config WDTPS = PS1048576        // Watchdog Timer Postscaler (1:1048576)
9 R. A" Y5 Y" v9 y' M& R& O- @#pragma config FWDTEN = OFF             // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls))0 o; a* R) I3 X

4 ?! @+ s, K, h9 u( G3 q// DEVCFG0
- }6 x" }" R- [#pragma config DEBUG = OFF              // Background Debugger Enable (Debugger is disabled)
' b( {8 C+ W6 W0 V1 V5 _/ s* Y#pragma config ICESEL = ICS_PGx2        // ICE/ICD Comm Channel Select (ICE EMUC2/EMUD2 pins shared with PGC2/PGD2)
+ [2 r0 `" _1 ^7 J#pragma config PWP = OFF                // Program Flash Write Protect (Disable)% z' a' g7 W% R$ r' p- A+ I9 g6 d
#pragma config BWP = OFF                // Boot Flash Write Protect bit (Protection Disabled): }9 F/ W  v; P9 {4 W
#pragma config CP = OFF                 // Code Protect (Protection Disabled)
# v, q- L6 C' R  M; u% D3 \; S6 [' G- N  I: e! k
/*
) G0 I( t1 I, A( {* KEY1,2,3 === RD6, RD7, RD13: d2 g# f6 z' i5 c6 j: s2 i
* LED1,2,3 === RD0, RD1, RD2
/ |2 U- E: M- e/ G8 ?8 Z' J*/
/ u% E6 b  I0 y# R* K6 kvolatile uint32_t value = 0;: D1 h( V1 t' B6 n# B3 v& |! I

! x% H' [6 b* [8 q* b* K5 cint main(int argc, char** argv) {
/ I( w" C8 E4 x: m- x- X% s$ P8 s( c( p. _% Z
    uint32_t old_value = 0;# |1 D8 s* G+ s. ?+ a
    //SYSTEMConfigPerformance(72000000L);: h" N: K9 }  n" r
    DDPCONbits.JTAGEN = 0;3 B$ K4 s) X- \7 H0 p
    TRISDCLR = 7;
* ?$ f6 R# t, v* i/ p9 r, x    PR1 = 35155;
) S$ `: ^9 F3 E- J) C$ H6 i$ m5 w    T1CON = 0x8030;% O! A' L0 s0 c9 ?
  d, X# d; X0 a3 X& ?
    INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);// INTEnableSystemMultiVectoredInt();1 q( T& R" p8 J0 L$ y  a/ w* W0 |
    mT1SetIntPriority(1);4 W$ s! d2 o* o* ^
    mT1IntEnable(1);& d/ n" L! j% v) r5 A; Z4 _
    INTEnableInterrupts();
6 ?; B% u; L# U9 J. y# Q3 J+ C. g0 `- G3 r- f" M- `
    while(1)
6 ]2 Y5 s! z# f! r7 r% m    {/ u8 H; `/ ~2 C* y7 i
        if (old_value != value)
7 @7 C' i6 P( w: e4 N/ n        {
* q/ R0 U2 H. Z$ c4 m            LATD = value;
5 ?8 U$ C7 L8 t            old_value = value;
0 T. H, y: W+ y  g  p        }- |/ g9 \3 x6 v  c
    }
  x; \2 p; g3 g1 @    return (EXIT_SUCCESS);
  U. r5 v, u3 L  `4 M7 T& T}# F9 }. T1 N+ {% E$ i9 Q; |2 @
% F# w8 B8 Y. j2 {& J8 D( M
void __ISR(_TIMER_1_VECTOR, IPL1SOFT) Timer1ISR(void)
1 G% P) D* D' b{$ H2 V' E3 F% }8 @% b
    switch(value)
( G) q& i' c. `    {! G  O% z2 X: P; U2 A$ {& h
        case 1:: z3 f1 |- F" L( Z0 K" m
            value = 2;1 h- ^7 H( A! d
            break;
4 a8 ~( L% b) {) n        case 2:% l4 K4 A- K' r
            value = 4;) E: v& k! g% r% v
            break;
- S2 h; ~- W* M; D" N        case 4:5 Q3 F- p8 g+ o0 u0 [3 C% l
            value = 1;
1 ^: M! n  M' y# Y            break;( i( a6 j6 O7 J" c0 l3 B; ^) q
        default:3 \& `$ X. W% }$ J/ z# g
            value = 1;$ t' f  t# J* y4 X
            break;
1 T, z$ @3 \6 R" w9 E    }
! C. [6 u* i! I7 M4 H    mT1ClearIntFlag();
% ?& f7 w% M- }7 m  P}+ }) _' K2 j. E3 e  N% l
复制代码

该用户从未签到

2#
发表于 2016-5-31 16:01 | 只看该作者
学习学习,谢谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-20 06:40 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表