找回密码
 注册
关于网站域名变更的通知
查看: 648|回复: 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>。
  `+ v4 X9 ?3 y  x6 Q1 a2 b4 `$ x
4 f1 p- `$ V; b' [. S说说我选择PIC32的理由(这个纯属个业余爱好,就是玩,不用于任何产品),因为平时较多的时候使用Mac Book,Microchip的MPLAB X开发环境是跨平台的,可以运行在windows、linux以及OS X上,能在OS X上很方便玩起来的单片机绝对不多(虽然有GCC这种跨平台神器,但是大家都知道,新手根本玩不转这东西);另外MPLAB X开发环境以及XC系列编译器是免费的,虽然免费的XC编译器好像很渣的样子(不能选择优化)。1 n) n7 Z# o. F4 [

4 K$ H6 @( ^( o$ CPIC32主要包括两大系列,PIC32MX和PIC32MZ,本文主要针对PIC32MX795F512L。PIC32MX7xx采用MIPS32&reg; M4K内核,工作电压2.3V-3.6V,最高主频80MHz。" _' Z' \) S, ~4 a/ u+ E! }
% o1 b5 h3 Y5 b* T9 M
这几天在看一本书《32位单片机C语言编程基于PIC32》,英文名《Programming 32-bit Microcontrollers in C Exploring the PIC32》(下载链接:http://download.eeworld.com.cn/download/lcofjp/62303),在此分享一些心得。: f- |; Z; d3 @! H% H
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位架构中,即使该模块需要使用这些引脚,用户也得自己制定每个引脚的正确方向。. }  S$ h3 A& g% ~* C* l: B

# Q9 T- z( m; m, h0 ?PIC32的中断分为两种工作模式:单向量工作模式和多向量工作模式。单向量工作模式只有一个中断函数,所有中断都在同一个函数中得到响应(8位单片机基本都是这种模式),可想而知,如果有多个中断要响应,则要判断多个标志位才能确定是产生了哪个中断,因此这种中断响应的延迟很大。多向量工作模式的话,和ARM cortex-M3的原理差不多,可以每个外设模块使用一个中断向量,最多可达64个中断向量。中断优先级分为两种,组优先级和子优先级,组优先级有0-7共8个,上电时,所有中断源的优先级都被默认地设定为ipl0,并屏蔽所有的中断。在相同的组优先级内,还有两个数据位用于定义4个子优先级。如果有2个组优先级相同的事件发生,那么子优先级高者将先被响应。每款PIC32单片机都定义了各种中断源的默认相对优先级。当其他条件都无效时(组优先级和子优先级都相同),将根据自然顺序决定响应同时发生的多个事件中的哪一个。/ k+ U# W) H0 i: y" J# h
中断函数的写法(其中一种,比较简单的写法):
0 r/ \1 o! V  Y1 F9 p  lvoid __ISR(VECTOR, IPL) HandlerName(void);
! H) k) @: V4 u( p5 c; ]9 M其中VECTOR指定要响应的某个中断向量,IPL指定中断的优先级。
( v8 F" p3 w3 W5 b# }例如:
7 F5 \6 u6 }/ o9 Q$ Zvoid __ISR(_TIMER_1_VECTOR, IPL0SOFT) Timer1ISR(void)
0 F. }  ~/ J2 e" P3 Z{2 u6 R" N' j* B
}! H9 F5 S/ v" E; q! T
最后来个流水灯的示例吧,调了半个晚上才弄出来,问题在于要给FPB进行分频时,就不要执行SYSTEMConfigPeRFormance函数了,它会把FPB调到系统能接受的最大值,导致频率不对。
2 I- {, f4 G3 p1 F' R7 H' }
# ?9 O7 ~( O. ?4 r#include <stdio.h>  b$ V! a3 G. f  H8 ]
#include <stdlib.h>
0 k- j3 p: i/ z8 h7 j. M#include <stdint.h>0 m- g4 w, d; a8 d+ V: m
#include <plib.h>  Y3 ?9 g: {8 H* G: m. p& w7 ?
# h: d2 C- `% y) e9 a$ i3 t
// DEVCFG3
4 X9 W, S" L" D/ P// USERID = No Setting! W9 S: X* g. a+ }/ q* C3 w
#pragma config FSRSSEL = PRIORITY_7     // SRS Select (SRS Priority 7)! S% y5 ]0 x& |% V) f; I
#pragma config FMIIEN = ON              // Ethernet RMII/MII Enable (MII Enabled)+ k- ^) P/ Y' ]! h
#pragma config FETHIO = ON              // Ethernet I/O Pin Select (Default Ethernet I/O)- G& a; `7 m5 p, @) W7 F
#pragma config FCANIO = ON              // CAN I/O Pin Select (Default CAN I/O)
. o: Q5 S8 B- o1 y5 Y#pragma config FUSBIDIO = ON            // USB USID Selection (Controlled by the USB Module)* s9 t# g% f  z  H/ v9 H5 \
#pragma config FVBUSONIO = ON           // USB VBUS ON Selection (Controlled by USB Module)
$ c- t; c! J  V5 a1 o
9 b" U, h% f" R( b0 }. V: z4 }// DEVCFG2
. J) [- U/ w5 X# R+ x8 L- s- H3 k#pragma config FPLLIDIV = DIV_2         // PLL Input Divider (4x Divider)
+ C0 @9 i- Z7 O2 j; s: \#pragma config FPLLMUL = MUL_18         // PLL Multiplier (18x Multiplier)
  k4 p$ n& y' H6 o: l) v. u+ ^#pragma config UPLLIDIV = DIV_1         // USB PLL Input Divider (1x Divider)
: ]9 Z( z5 ?$ ~( ]0 [/ R/ j#pragma config UPLLEN = OFF             // USB PLL Enable (Disabled and Bypassed). Y  f' W$ m" P; s( F: \# N2 v9 [
#pragma config FPLLODIV = DIV_1         // System PLL Output Clock Divider (PLL Divide by 1)
& E7 v- B8 B! Z# e8 ?) U7 J2 X7 R0 e9 j5 w8 ?# A' u1 h
// DEVCFG1
9 e8 S3 @: d/ f3 [: k#pragma config FNOSC = PRIPLL              // Oscillator Selection Bits (Primary Osc (XT,HS,EC))
7 g% ^9 Q5 M8 q. D7 J#pragma config FSOSCEN = ON             // Secondary Oscillator Enable (Enabled)6 _8 |+ h/ R$ W2 ?: o
#pragma config IESO = ON                // Internal/External Switch Over (Enabled)
( d1 B$ Y0 `1 v6 |#pragma config POSCMOD = XT             // Primary Oscillator Configuration (XT osc mode)
* m  {/ u0 L$ q! ]- u7 S1 n6 ?& r#pragma config OSCIOFNC = OFF           // CLKO Output Signal Active on the OSCO Pin (Disabled)& V/ @% K. }) \! ?# _# v; l; O
#pragma config FPBDIV = DIV_8           // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/8)
& ]- \# `3 L, z  S- I4 r5 @4 Z" @#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled)
. }6 R; S+ I4 c! O& i#pragma config WDTPS = PS1048576        // Watchdog Timer Postscaler (1:1048576)
) C- F: L" l; C" G, b" O; G8 z#pragma config FWDTEN = OFF             // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls))
. z5 A' ]* A$ H2 U+ \) E9 ^7 W  K: e5 x$ O1 `& \
// DEVCFG0- b' ?* j- D+ L' D4 }
#pragma config DEBUG = OFF              // Background Debugger Enable (Debugger is disabled)
+ e! L/ E2 H7 p#pragma config ICESEL = ICS_PGx2        // ICE/ICD Comm Channel Select (ICE EMUC2/EMUD2 pins shared with PGC2/PGD2)
& p9 q6 {2 P3 Y% y. g8 o7 \#pragma config PWP = OFF                // Program Flash Write Protect (Disable)
2 m/ D) z6 f# ?# W3 ^0 E#pragma config BWP = OFF                // Boot Flash Write Protect bit (Protection Disabled)
: y: U, q+ B) K! [) j& a* Z#pragma config CP = OFF                 // Code Protect (Protection Disabled)) g6 l  F# }' Y2 w8 c: N6 k

# Y3 e4 f/ D3 q* i/*
* k8 K4 N& s& O+ D/ L' @* a* KEY1,2,3 === RD6, RD7, RD13+ i) c1 }3 {5 S% r9 j! X. |1 W# ^6 q
* LED1,2,3 === RD0, RD1, RD23 B7 `3 p  I# ^! v& z6 G, \& c' a
*/
) k; Y3 _7 K6 Z0 W1 g' o" d8 `' I5 Mvolatile uint32_t value = 0;
0 e5 J$ z  n  @# o" `! `8 u- Q; ~. |! N% p
int main(int argc, char** argv) {
; M+ }$ W2 \  B/ z+ M2 J1 p
: @, j: n% P4 F, z% H# X    uint32_t old_value = 0;
) S. d0 F" A0 }0 R4 n- ]    //SYSTEMConfigPerformance(72000000L);
+ i6 q$ g8 U& r    DDPCONbits.JTAGEN = 0;
! i- m5 n# v( K  }4 {3 R. Z    TRISDCLR = 7;, D) Q: D5 Q* Y1 H+ v& Y6 V$ l
    PR1 = 35155;
  a3 V- P7 u! F  J) H    T1CON = 0x8030;# Y" n6 a" X4 S* Y! S
2 P0 g8 G7 b& r
    INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);// INTEnableSystemMultiVectoredInt();
! B: d4 c$ g1 G  d6 p    mT1SetIntPriority(1);
: `, Y  e4 g, j    mT1IntEnable(1);/ G* A; f  {' U& y. v
    INTEnableInterrupts();
. M( B) R- O9 N: G) ~
, i8 d2 I, `* l5 [1 O& Q    while(1)! C) {' p) h# Z/ Q7 x4 d+ y6 u. q: w" E3 h
    {! l) _9 V' ~8 |6 Z, m5 [
        if (old_value != value)& l8 B# R7 F- J2 j* t' d& x( E
        {
/ W' ?5 o6 ?' c! b: n            LATD = value;
' s# n8 N: M3 C8 N" L( x/ |9 u            old_value = value;0 b+ m% ~$ }  x% H; n$ k) c- Q
        }
6 I9 j' z9 g, C* \    }( L4 [- ~1 c. x4 e
    return (EXIT_SUCCESS);
2 }0 {* n6 I# e. v- n% |6 O2 X}. T. W; Z& y3 q2 n8 @

" s" }+ h0 ~: s( L! avoid __ISR(_TIMER_1_VECTOR, IPL1SOFT) Timer1ISR(void)0 `9 p( ~; ^, I# U
{/ x, o1 N( s9 h2 l6 h4 E
    switch(value)
5 v- }2 s( B7 R; |    {6 ~7 @5 L2 J5 M; p4 t# X& x1 ^/ D- X
        case 1:
- t" g" I& M1 z            value = 2;- e1 Y: L" @. ~
            break;
: j* [7 |' D& D9 b        case 2:
+ K8 e4 k+ C  I. p4 a/ k+ ]            value = 4;" J! ?0 N) p9 Q$ r8 r. L. `- a
            break;
! C' b4 `1 p# T8 a! s/ P6 N        case 4:9 v6 v) T/ F* D6 ^' K' S
            value = 1;
) e( N3 x6 I& t- \. I) h            break;% b  c9 J9 e* d* d; G
        default:% E, s! i! h0 e% \
            value = 1;
' R) G5 l6 g; w8 N2 s            break;
1 h6 f# \* `2 F& R6 _7 C    }9 j! E" l; p  l" \8 m' g$ ^
    mT1ClearIntFlag();" v4 \; A1 M7 V$ @& l3 T. L( U
}
) C  f3 }2 m  q7 ?复制代码

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-20 22:05 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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