Today I implement "Hello World" on PIC32MZ EC starter kit. The application of "Hello World" only lights up a LED. There are three LEDs on the starter kit board -- LED1 and LED2 and LED3.  At the moment, I only light LED1 on RH0.

Every PIC application has to set several configuration bits, PIC32 is no exception. So we start with configuration bits. The following is the configuration bits I set for the "Hello world" application.

// PIC32MZ2048ECH144 Configuration Bit Settings

// 'C' source line config statements

#include <xc.h>

// DEVCFG3  BFFFFFFF
// USERID = No Setting
#pragma config FMIIEN = ON // Ethernet RMII/MII Enable (MII Enabled) // in MII Mode, you need a 25MHz XTAL, in RMII Mode, need a 50MHz Clock.
#pragma config FETHIO = ON // Ethernet I/O Pin Select (Default Ethernet I/O)
#pragma config PGL1WAY = ON // Permission Group Lock One Way Configuration (Allow only one reconfiguration)
#pragma config PMDL1WAY = ON // Peripheral Module Disable Configuration (Allow only one reconfiguration)
#pragma config IOL1WAY = ON // Peripheral Pin Select Configuration (Allow only one reconfiguration)
#pragma config FUSBIDIO = OFF // USB USBID Selection (Controlled by Port Function) // DEVCFG2  7FF9B11A
#pragma config FPLLIDIV = DIV_3 // System PLL Input Divider (3x Divider)
#pragma config FPLLRNG = RANGE_5_10_MHZ // System PLL Input Range (5-10 MHz Input)
#pragma config FPLLICLK = PLL_POSC // System PLL Input Clock Selection (POSC is input to the System PLL)
#pragma config FPLLMULT = MUL_50 // System PLL Multiplier (PLL Multiply by 50)
#pragma config FPLLODIV = DIV_2 // System PLL Output Clock Divider (2x Divider)
#pragma config UPLLFSEL = FREQ_24MHZ // USB PLL Input Frequency Selection (USB PLL input is 24 MHz)
#pragma config UPLLEN = OFF // USB PLL Enable (USB PLL is disabled) // DEVCFG1  7F7F3839
#pragma config FNOSC = SPLL // Oscillator Selection Bits (System PLL)
#pragma config DMTINTV = WIN_127_128 // DMT Count Window Interval (Window/Interval value is 127/128 counter value)
#pragma config FSOSCEN = OFF // Secondary Oscillator Enable (Disable SOSC)
#pragma config IESO = OFF // Internal/External Switch Over (Disabled)
#pragma config POSCMOD = EC // Primary Oscillator Configuration (External clock mode)
#pragma config OSCIOFNC = ON // CLKO Output Signal Active on the OSCO Pin (Enabled)
#pragma config FCKSM = CSDCMD // Clock Switching and Monitor Selection (Clock Switch Disabled, FSCM Disabled)
#pragma config WDTPS = PS1048576 // Watchdog Timer Postscaler (1:1048576)
#pragma config WDTSPGM = STOP // Watchdog Timer Stop During Flash Programming (WDT stops during Flash programming)
#pragma config WINDIS = NORMAL // Watchdog Timer Window Mode (Watchdog Timer is in non-Window mode)
#pragma config FWDTEN = OFF // Watchdog Timer Enable (WDT Disabled)
#pragma config FWDTWINSZ = WINSZ_25 // Watchdog Timer Window Size (Window size is 25%)
#pragma config DMTCNT = DMT31 // Deadman Timer Count Selection (2^31 (2147483648))
#pragma config FDMTEN = OFF // Deadman Timer Enable (Deadman Timer is disabled) // DEVCFG0  FFFFFFF7
#pragma config DEBUG = OFF // Background Debugger Enable (Debugger is disabled)
#pragma config JTAGEN = ON // JTAG Enable (JTAG Port Enabled)
#pragma config ICESEL = ICS_PGx2 // ICE/ICD Comm Channel Select (Communicate on PGEC2/PGED2)
#pragma config TRCEN = ON // Trace Enable (Trace features in the CPU are enabled)
#pragma config BOOTISA = MIPS32 // Boot ISA Selection (Boot code and Exception code is MIPS32)
#pragma config FECCCON = OFF_UNLOCKED // Dynamic Flash ECC Configuration (ECC and Dynamic ECC are disabled (ECCCON bits are writable))
#pragma config FSLEEP = OFF // Flash Sleep Mode (Flash is powered down when the device is in Sleep mode)
#pragma config DBGPER = ALLOW_PG2 // Debug Mode CPU Access Permission (Allow CPU access to Permission Group 2 permission regions)
#pragma config EJTAGBEN = NORMAL // EJTAG Boot (Normal EJTAG functionality) // DEVCP0
#pragma config CP = OFF // Code Protect (Protection Disabled) // SEQ0 // DEVADC1 // DEVADC2 // DEVADC3 // DEVADC4 // DEVADC5

Please remember a configuration bit can only be programmed logic 0, the unprogrammed state is logic 1, and device configuration bits may vary according to hardware and software. An important point is that PLL must output between 350 and 700 MHz. The PLL output is 400MHz in my configuration. Anyway, above configuration words work to me till now.

  Configuration bits is set, then we will continue with main function. The main function is very simple, just toggle H0 to logic 1. But before we do that, we should change the direction of H0 to be output. For 8-bit PIC, we usually code that like below.

     TRISHbits.TRISH0 = ;   // clear TRISH bit0,  H0 to be output
PORTHbits.RH0 = ; // set PORTH bit0

  But for PIC32, below code is recommended (use LATx to write IO, PORTx to read IO).

    TRISHbits.TRISH0 = ;
LATHbits.LATH0 = ;

  Every PIC32 I/O module register has a corresponding CLR(clear), SET(set) and INV(invert) register designed to provide fast atomic bit manipulations, a value written to a SET, CLR or INV register effectively performs the implied operation, but only on the corresponding base register and only bits specified as '1' as modified. Bits specified as '0' are not modified.

  So the above implemention has alternative option

    TRISHCLR = (<<);    // TRISH bit0 clear
LATHSET = (<<); // LATH bit0 set '1'

It almost like

    TRISH &= 0xFFFFFFFE;
LATH |= 0x00000001;

  But it performs faster and more effectively than above. So far, there is an important point not to clarify. The I/O port H0 mixes with analog feature, and the analog feature should be disabled. For this point, PIC32MZ is different than PIC32MX. On PIC32MX devices, the analog function of an I/O pin was determined by the PCFGx bit in AD1PCFG register. On PIC32MZ devices, the analog selection function has been moved into a separate register on each I/O port. Clear ANSxy (ANSELx<y>) bit to select digital mode.

  Finally, the main code of "Hello world" is

#include <proc/p32mz2048ech144.h>

#include "ConfigurationBits.h"

//#define LED_IOCTL()    TRISHbits.TRISH0 = 0
//#define LED_SETON() LATHbits.LATH0 = 1
//#define LED_OPEN() ANSELHbits.ANSH0 = 0 //#define LED_IOCTL() TRISH &= 0xFFFFFFFE
//#define LED_SETON() LATH |= 0x00000001
//#define LED_OPEN() ANSELH &= 0xFFFFFFFE #define LED_IOCTL() TRISHCLR = (1<<0)
#define LED_SETON() LATHSET = (1<<0)
#define LED_OPEN() ANSELH &= 0xFFFFFFFE void main()
{
LED_OPEN();
LED_IOCTL();
LED_SETON();
while ()
{
; // do nothing
}
}

PIC32MZ tutorial -- Hello World的更多相关文章

  1. PIC32MZ tutorial -- OC Interrupt

    In my previous blog "PIC32MZ tutorial -- Output Compare", I shows how to apply Output Comp ...

  2. PIC32MZ tutorial -- External Interrupt

    In my older blog "PIC32MZ tutorial -- Key Debounce", I shows how to acheive key debounce w ...

  3. PIC32MZ tutorial -- UART Communication

    At this moment, I accomplish the interface of UART communication for PIC32MZ EC Starter Kit. This in ...

  4. PIC32MZ tutorial -- Watchdog Timer

    Watchdog is a very necessary module for embedded system. Someone said that embedded system operates ...

  5. PIC32MZ tutorial -- Output Compare

    Output Compare is a powerful feature of embedded world. The PIC32 Output Compare module compares the ...

  6. PIC32MZ tutorial -- Input Capture

    Today I accomplish a simple application for PIC32MZ EC Starter Kit. This application uses Input Capt ...

  7. PIC32MZ tutorial -- 32-bit Timer

    The microcontroller is PIC32MZ2048ECH144 on the PIC32MZ EC Starter Kit. This microcontroller has fou ...

  8. PIC32MZ tutorial -- Change Notification

    In my last post I implement "Key Debounce" with port polling, port polling is not very eff ...

  9. PIC32MZ tutorial -- Key Debounce

    Today I accomplish a application on PIC32MZ EC Starter Kit. The feature of application is to light u ...

  10. PIC32MZ tutorial -- Timer Interrupt

    An interrupt is an internal or external event that requires quick attention from the controller. The ...

随机推荐

  1. java EE实现动态SQL的

    结果图 情况一:

  2. 第一章 ------ AutoYout介绍

    1.使用自动布局的好处: (1)让两个视图进行尺寸匹配,使两个视图始终保持相同的宽度 (2)无论父视图如何改变,视图都可以相对于父视图居中 (3)拜放一行视图时将几个视图的底部对齐 (4)将两个视图偏 ...

  3. get到的新技能

    1.重拾选择器 (一)类选择器与id选择器的区别 W3C标准这样规定的,在同一个页面内,不允许有相同名字的id对象出现,但是允许相同名字的class. 这样,一般网站分为头,体,脚部分,因为考虑到它们 ...

  4. Mybatis-动态 SQL

    MyBatis 的强大特性之一便是它的动态 SQL. 如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省 ...

  5. G - YY's new problem(HUSH算法,目前还不懂什么是HUSH算法)

      Time Limit:4000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Pra ...

  6. js常见函数汇总

    /**  * 隐藏元素  * @param {String} elem  */ function hide(elem){     var curDisplay = getStyle(elem, 'di ...

  7. Eclipse Java 调试基本技巧

    前言 这一部分是Eclipse中最为重要的部分.调试的重要性想必大家都清楚. 调试无疑是做项目最苦比的事情,但优秀的编码习惯,良好的调试方式能让这没那么苦,甚至还有点乐趣:). 本文讲解使用Eclip ...

  8. 在笔记本电脑开通无线WIFI

    1.Windows + R启动运行,输入services.msc进入服务 2.在服务中将Security Center服务从自动启动转为禁止启动 3.在服务中将Windows Firewall的启动类 ...

  9. wireshark如何抓取别人电脑的数据包

    抓取别人的数据包有几种办法,第一种是你和别人共同使用的那个交换机有镜像端口的功能,这样你就可以把交换机上任意一个人的数据端口做镜像,然后你在镜像端口上插根网线连到你的网卡上,你就可以抓取别人的数据了: ...

  10. IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!)

    IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!) 1. -----------自动代码-------- 常用的有fori/sout/psvm+Tab即可生成循环.System.ou ...