Documente Academic
Documente Profesional
Documente Cultură
4/25/2015
Richard Kuo
Assistant Professor
www.ee.ntou.edu.tw
Outline
Department of Electrical Engineering,
National Taiwan Ocean University
4.NuMicro_GPIO.ppt
GPIO Interface Introduction
Lab. LED control (smpl_GPIO_LED1, smpl_GPIO_RGBled)
Lab. Buzzer control (smpl_GPIO_Buzzer)
Lab. Sensor input (smpl_GPIO_PIR)
Lab. 7-segment Display (smpl_7seg)
Lab. Keypad scanning (smpl_Keypad)
Lab. Step Motor control (smpl_GPIO_StepMotor)
Lab. GPIO Interrupt (smpl_GPIO_IRQ)
Homework
www.ee.ntou.edu.tw
Peripherals
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
LEDs
Buzzer
Keypad
IR
Relays
PIR
Step Motor
www.ee.ntou.edu.tw
www.ee.ntou.edu.tw
www.ee.ntou.edu.tw
Push-Pull Output
www.ee.ntou.edu.tw
Open-Drain
www.ee.ntou.edu.tw
Quasi bi-direction
www.ee.ntou.edu.tw
StdDriver/GPIO_OutputInput
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
I/O groups :
NUC140 = GPA, GPB, GPC, GPD, GPE
NANO102 = PA, PB, PC, PD, PE, PF
port no = BIT0~15
I/O modes
GPIO_PMD_INPUT : input only mode
GPIO_PMD_OUTPUT : push-pull output mode
GPIO_PMD_OPEN_DRAIN : open-drain output mode
GPIO_PMD_QUASI : quai bi-direction mode
www.ee.ntou.edu.tw
LED
Department of Electrical Engineering,
National Taiwan Ocean University
PC12
GPIO_SetMode(PC, BIT12, GPIO_PMD_OUTPUT);
www.ee.ntou.edu.tw
smpl_GPIO_LED1
Department of Electrical Engineering,
National Taiwan Ocean University
int main(void)
{
Initialize Clocks & Pins
SYS_Init();
GPIO_SetMode(PC, BIT12, GPIO_PMD_OUTPUT);
while(1) {
PC12 =0; // turn on LED
CLK_SysTickDelay(100000);
PC12 =1; // turn off LED
CLK_SysTickDelay(100000);
}
}
// Delay
// Delay
www.ee.ntou.edu.tw
Output Mode
www.ee.ntou.edu.tw
www.ee.ntou.edu.tw
www.ee.ntou.edu.tw
Application Circuit
5~9V Battery
smpl_GPIO_PIR
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
smpl_GPIO_PIR
Department of Electrical Engineering,
National Taiwan Ocean University
int main(void)
{
SYS_Init();
GPIO_SetMode(PA, BIT0, GPIO_PMD_INPUT);
while(1) {
if (PA0==1) printf("PIR detected!\n");
else
printf("PIR no detection!\n");
}
}
www.ee.ntou.edu.tw
Input Mode
Application Circuit
www.ee.ntou.edu.tw
Picture
Vcc
TCRT5000
PA0
R2
10K
R1
220
Gnd
Top View
www.ee.ntou.edu.tw
0 ohm
R1 is shorted
smpl_GPIO_Buzzer
Department of Electrical Engineering,
National Taiwan Ocean University
void Init_Buzzer(void)
{
GPIO_SetMode(PB, BIT11, GPIO_PMD_OUTPUT);
PB11=1; // turn off Buzzer
}
void Buzz(int number)
{
int i;
for (i=0; i<number; i++) {
PB11 =0; // turn on Buzzer
CLK_SysTickDelay(100000); // Delay
PB11 =1; // turn off Buzzer
CLK_SysTickDelay(100000); // Delay
}
}
www.ee.ntou.edu.tw
7-segment display
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
www.ee.ntou.edu.tw
Drive Low will turn on 7-seg. LED
Seven_Segment.c
Department of Electrical Engineering,
National Taiwan Ocean University
#include <stdio.h>
#include "NUC100Series.h"
#include "GPIO.h"
#include "SYS.h"
#include "Seven_Segment.h"
#define SEG_N0 0x82
#define SEG_N1 0xEE
#define SEG_N2 0x07
#define SEG_N3 0x46
#define SEG_N4 0x6A
#define SEG_N5 0x52
#define SEG_N6 0x12
#define SEG_N7 0xE6
#define SEG_N8 0x02
#define SEG_N9 0x62
#define SEG_N10 0x22
#define SEG_N11 0x1A
#define SEG_N12 0x93
#define SEG_N13 0x0E
#define SEG_N14 0x13
#define SEG_N15 0x33
www.ee.ntou.edu.tw
unsigned char SEG_BUF[16]={SEG_N0, SEG_N1,
SEG_N2, SEG_N3, SEG_N4, SEG_N5, SEG_N6, SEG_N7,
SEG_N8, SEG_N9, SEG_N10, SEG_N11, SEG_N12,
SEG_N13, SEG_N14, SEG_N15};
void OpenSevenSegment(void)
{
GPIO_SetMode(PC, BIT4, GPIO_PMD_OUTPUT);
GPIO_SetMode(PC, BIT5, GPIO_PMD_OUTPUT);
GPIO_SetMode(PC, BIT6, GPIO_PMD_OUTPUT);
GPIO_SetMode(PC, BIT7, GPIO_PMD_OUTPUT);
PC4=0; PC5=0; PC6=0; PC7=0;
GPIO_SetMode(PE, BIT0, GPIO_PMD_OUTPUT);
GPIO_SetMode(PE, BIT1, GPIO_PMD_OUTPUT);
GPIO_SetMode(PE, BIT2, GPIO_PMD_OUTPUT);
GPIO_SetMode(PE, BIT3, GPIO_PMD_OUTPUT);
GPIO_SetMode(PE, BIT4, GPIO_PMD_OUTPUT);
GPIO_SetMode(PE, BIT5, GPIO_PMD_OUTPUT);
GPIO_SetMode(PE, BIT6, GPIO_PMD_OUTPUT);
GPIO_SetMode(PE, BIT7, GPIO_PMD_OUTPUT);
PE0=0; PE1=0; PE2=0; PE3=0;
PE4=0; PE5=0; PE6=0; PE7=0;
}
Seven_Segment.c
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
switch(i) {
case 0: PE0=0; break;
case 1: PE1=0; break;
case 2: PE2=0; break;
case 3: PE3=0; break;
case 4: PE4=0; break;
case 5: PE5=0; break;
case 6: PE6=0; break;
case 7: PE7=0; break;
}
temp=temp>>1;
}
switch(no) {
case 0: PC4=1; break;
case 1: PC5=1; break;
case 2: PC6=1; break;
case 3: PC7=1; break;
}
}
Seven_Segment.c
Department of Electrical Engineering,
National Taiwan Ocean University
void CloseSevenSegment(void)
{
PC4=0;
PC5=0;
PC6=0;
PC7=0;
}
www.ee.ntou.edu.tw
4x4 Keypad
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
www.ee.ntou.edu.tw
www.ee.ntou.edu.tw
Keypad scanning
Set input pins PA3,4,5 to 1
Set output pins to 0 one at a time PA0,1,2
PA3=1; PA4=1; PA5=1;
PA0=1; PA1=1; PA2=0;
if (PA3==0) return 1;
if (PA4==0) return 4;
if (PA5==0) return 7;
www.ee.ntou.edu.tw
Scankey.c
Department of Electrical Engineering,
National Taiwan Ocean University
void OpenKeyPad(void)
{
GPIO_SetMode(PA, BIT0, GPIO_PMD_QUASI);
GPIO_SetMode(PA, BIT1, GPIO_PMD_QUASI);
GPIO_SetMode(PA, BIT2, GPIO_PMD_QUASI);
GPIO_SetMode(PA, BIT3, GPIO_PMD_QUASI);
GPIO_SetMode(PA, BIT4, GPIO_PMD_QUASI);
GPIO_SetMode(PA, BIT5, GPIO_PMD_QUASI);
}
www.ee.ntou.edu.tw
uint8_t ScanKey(void)
{
PA0=1; PA1=1; PA2=0; PA3=1; PA4=1; PA5=1;
if (PA3==0) return 1;
if (PA4==0) return 4;
if (PA5==0) return 7;
PA0=1; PA1=0; PA2=1; PA3=1; PA4=1; PA5=1;
if (PA3==0) return 2;
if (PA4==0) return 5;
if (PA5==0) return 8;
PA0=0; PA1=1; PA2=1; PA3=1; PA4=1; PA5=1;
if (PA3==0) return 3;
if (PA4==0) return 6;
if (PA5==0) return 9;
return 0;
}
smpl_7seg_Keypad
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
7-segment
display number =
5
smpl_GPIO_Keypad
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
Vcc/Gnd
Press key
smpl_GPIO_Keypad
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
Press key1
Press key2
Press key3
Press key4
Relay #1 off
Relay #2 off
Relay #3 off
Relay #4 off
Vcc = 3.3V, GPIO output hi (base) Relay Control pin = low (collector)
Smpl_GPIO_Keypad
Department of Electrical Engineering,
National Taiwan Ocean University
int main(void)
{
uint32_t i =0;
SYS_Init();
OpenKeyPad();
Init_GPIO();
while(1)
{
i=ScanKey();
switch(i) {
case 1 : PB0=1; break;
case 2 : PB1=1; break;
case 3 : PB2=1; break;
case 4 : PB3=1; break;
default: PB0=0; PB1=0; PB2=0; PB3=0; break;
}
}
}
www.ee.ntou.edu.tw
MAX7219
www.ee.ntou.edu.tw
N1588
MAX7219.c
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
//
// MAX7219 Driver : drive 8x8 LEDs
//
#include <stdio.h>
#include "NUC100Series.h"
#include "SYS.h"
#include "GPIO.h"
void Init_GPIO(void)
{
GPIO_SetMode(PA, BIT0, GPIO_PMD_OUTPUT);
GPIO_SetMode(PA, BIT1, GPIO_PMD_OUTPUT);
GPIO_SetMode(PA, BIT2, GPIO_PMD_OUTPUT);
PA0=0; PA1=0; PA2=0;
}
MAX7219.c
Department of Electrical Engineering,
National Taiwan Ocean University
void write_MAX7219(uint8_t address,uint8_t dat)
{
CS_LO;
WriteData_MAX7219(address);
WriteData_MAX7219(dat);
CS_HI;
}
void Init_MAX7219(void)
{
write_MAX7219(0x09, 0x00);
write_MAX7219(0x0a, 0x03);
write_MAX7219(0x0b, 0x07);
write_MAX7219(0x0c, 0x01);
write_MAX7219(0x0f, 0x00);
}
www.ee.ntou.edu.tw
smpl_GPIO_LED8x8
Department of Electrical Engineering,
National Taiwan Ocean University
int main(void)
{
uint8_t i,j;
SYS_Init();
Init_GPIO();
Init_MAX7219();
while(1) {
for(j=0;j<38;j++) {
for(i=1;i<9;i++)
write_MAX7219(i, Font8x8[j][i-1]);
CLK_SysTickDelay(100000);
}
}
}
www.ee.ntou.edu.tw
www.ee.ntou.edu.tw
Pullup resistor
MCU
www.ee.ntou.edu.tw
www.ee.ntou.edu.tw
GPAB_IRQHandler (NUC100Series)
Department of Electrical Engineering,
National Taiwan Ocean University
volatile uint8_t KEY1_Flag = 0;
volatile uint8_t KEY2_Flag = 0;
volatile uint8_t KEY3_Flag = 0;
void GPAB_IRQHandler(void)
{
if (PB->ISRC & BIT12) {
// check if PB12 interrupt occurred
PB->ISRC |= BIT12;
// clear PB12 interrupt status
KEY1_Flag=1;
// set a flag for PB12(KEY1)
} else if (PB->ISRC & BIT13) { // check if PB13 interrupt occurred
PB->ISRC |= BIT13;
// clear PB13 interrupt status
KEY2_Flag=1;
// set a flag for PB13(KEY2)
} else if (PB->ISRC & BIT14) { // check if PB14 interrupt occurred
PB->ISRC |= BIT14;
// clear PB14 interrupt status
KEY3_Flag=1;
// set a flag for PB14(KEY3)
} else {
// else it is unexpected interrupts
PB->ISRC = PB->ISRC;
// clear all GPB pins
}
}
www.ee.ntou.edu.tw
GPABC_IRQHandler (Nano100Series)
Department of Electrical Engineering,
National Taiwan Ocean University
volatile uint8_t KEY1_Flag = 0;
volatile uint8_t KEY2_Flag = 0;
volatile uint8_t KEY3_Flag = 0;
void GPABC_IRQHandler(void)
{
if (PB->ISRC & BIT12) {
// check if PB12 interrupt occurred
PB->ISRC |= BIT12;
// clear PB12 interrupt status
KEY1_Flag=1;
// set a flag for PB12(KEY1)
} else if (PB->ISRC & BIT13) { // check if PB13 interrupt occurred
PB->ISRC |= BIT13;
// clear PB13 interrupt status
KEY2_Flag=1;
// set a flag for PB13(KEY2)
} else if (PB->ISRC & BIT14) { // check if PB14 interrupt occurred
PB->ISRC |= BIT14;
// clear PB14 interrupt status
KEY3_Flag=1;
// set a flag for PB14(KEY3)
} else {
// else it is unexpected interrupts
PB->ISRC = PB->ISRC;
// clear all GPB pins
}
}
www.ee.ntou.edu.tw
smpl_GPIO_IRQ
Department of Electrical Engineering,
National Taiwan Ocean University
int32_t main()
{
SYS_Init();
Init_KEY();
printf("Testing KEY1/2/3 IRQ generation:\n");
while(1) {
if (KEY1_Flag) {
printf("KEY1/PB12 Interrupt!\n");
KEY1_Flag=0; }
if (KEY2_Flag) {
printf("KEY2/PB13 Interrupt!\n");
if (KEY3_Flag) {
printf("KEY3/PB14 Interrupt!\n");
KEY3_Flag=0; }
}
}
www.ee.ntou.edu.tw
KEY2_Flag=0; }
Stepping Motor
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
http://www.piclist.com/images/www/hobby_elec/e_step1.htm
www.ee.ntou.edu.tw
http://commons.wikimedia.org/wiki/File:Drive.png
28YBJ-48
ULN2003 IC
www.ee.ntou.edu.tw
smpl_GPIO_Stepmotor
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
5V Step Motor
Driver IC : TI ULN2003A
Connections
Stepping Control
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
Clockwise : 0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08
Port
Step
InA
InB
InC
InD
Port
Step
InA
InB
InC
InD
smpl_GPIO_Stepmotor
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
Ex.Video : http://youtu.be/jxIFTKsBAT0
www.ee.ntou.edu.tw
PD0
PD2
PD1
PD3
PD6
PD5
PD4
PA0
www.ee.ntou.edu.tw
PD8
PD7
PA1
PA2
www.ee.ntou.edu.tw
www.ee.ntou.edu.tw
www.ee.ntou.edu.tw
Project Objectives
To use Cortex-M0 learning board to control the electronic safe
To study/trace the PCB & circuit of Electronic Safe
To draw the flow chart & implement the firmware of MCU
Functional Description
Flow Chart
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
while(1)
Start
Keycode
==
passcode
number=Scankey()
Setup HCLK
Y
Init_RGBLED
Init_Buzzer
InitLock
Init SWInt
number!=0
Y
print_LCD
RGBLED(BLUE)
Buzz(1)
OpenKeyPad
Initial LCD
Print 2 lines
N
i==4
i=0
Y
print_LCD
RGBLED(GREEN)
Buzz(3)
OpenLock
print_LCD
RGBLED(RED)
Buzz(2)
CloseLock
www.ee.ntou.edu.tw
Vcc
Gnd
Ground
GPB15
GPA11
2N2222
GPA12
www.ee.ntou.edu.tw
+6V
GPA13
GPA14
GPA15
2N2222
Gnd
Important Notice !
Department of Electrical Engineering,
National Taiwan Ocean University
www.ee.ntou.edu.tw
This educational material are neither intended nor warranted for usage in systems or
equipment, any malfunction or failure of which may cause loss of human life, bodily
injury or severe property damage. Such applications are deemed, Insecure Usage.
Insecure usage includes, but is not limited to: equipment for surgical implementation,
atomic energy control instruments, airplane or spaceship instruments, the control or
operation of dynamic, brake or safety systems designed for vehicular use, traffic signal
instruments, all types of safety devices, and other applications intended to support or
sustain life.
All Insecure Usage shall be made at users own risk, and in the event that third parties
lay claims to the author as a result of customers Insecure Usage, the user shall
indemnify the damages and liabilities thus incurred by using this material.
Please note that all lecture and sample codes are subject to change without notice. All the
trademarks of products and companies mentioned in this material belong to their
respective owners.