Taltech_embedded/lab1/main.c

238 lines
6.3 KiB
C

#include <stdint.h>
#include <stdbool.h>
#include "inc/msp432p401r.h"
#define SW1 0x02 // on the left side of the LaunchPad board
#define SW2 0x10 // on the right side of the LaunchPad board
#define RED 0x01
#define GREEN 0x02
#define BLUE 0x04
// Version 1
// initialize P1.1 and P1.4 and make them inputs (P1.1 and P1.4 built-in buttons)
// initialize P1.0 as output to red LED
void Port1Init(void) {
P1->SEL0 = 0x00;
P1->SEL1 = 0x00; // configure P1.4 and P1.1 as GPIO
P1->DIR = 0x01; // make P1.4 and P1.1 in, P1.0 output
P1->REN = 0x12; // enable pull resistors on P1.4 and P1.1
P1->OUT = 0x12; // P1.4 and P1.1 are pull-up
}
// read P1.4, P1.1 inputs
uint8_t Port1Input(void) {
return P1->IN & (SW1 | SW2);
}
// write output to P1.0
void Port1Output(uint8_t data) {
P1->OUT = (P1->OUT & ~0x01) | data;
}
// initialize P2.2-P2.0 and make them outputs (P2.2-P2.0 built-in LEDs)
void Port2Init(void) {
P2->SEL0 = 0x00;
P2->SEL1 = 0x00; // configure P2.2-P2.0 as GPIO
P2->DS = 0x07; // make P2.2-P2.0 high drive strength
P2->DIR = 0x07; // make P2.2-P2.0 out
P2->OUT = 0x00; // all LEDs off
}
int main1(void) {
Port1Init();
Port2Init();
while (true) {
// switches are negative logic on P1.1 and P1.4
uint8_t switches = Port1Input() ^ (SW1 | SW2);
switch (switches) {
case SW1:
P2->OUT = BLUE;
Port1Output(1);
break;
case SW2:
P2->OUT = RED;
Port1Output(1);
break;
case SW1 | SW2:
P2->OUT = BLUE | RED;
Port1Output(1);
break;
default: // neither switch pressed
P2->OUT = 0;
Port1Output(0);
}
}
}
// Version 2
void Port1InitFriendly(void) {
P1->SEL0 &= ~0x13;
P1->SEL1 &= ~0x13; // 1) configure P1.4 P1.1 P1.0 as GPIO
P1->DIR &= ~0x12; // 2) make P1.4 and P1.1 in
P1->DIR |= 0x01; // 2) make P1.0 out
P1->REN |= 0x12; // 3) enable pull resistors on P1.4 and P1.1
}
void Port2InitFriendly(void) {
P2->SEL0 &= ~0x07;
P2->SEL1 &= ~0x07; // 1) configure P2.2-P2.0 as GPIO
P2->DIR |= 0x07; // 2) make P2.2-P2.0 out
P2->DS |= 0x07; // 3) activate increased drive strength
P2->OUT &= ~0x07; // all LEDs off
}
// write three outputs bits of P2
void Port2Output(uint8_t data) {
P2->OUT = (P2->OUT & ~0x07) | data;
}
int main2(void) {
Port1InitFriendly();
Port2InitFriendly();
while (true) {
// switches are negative logic on P1.1 and P1.4
uint8_t switches = Port1Input() ^ (SW1 | SW2);
switch (switches) {
case SW1:
Port2Output(BLUE);
Port1Output(1);
break;
case SW2:
Port2Output(RED);
Port1Output(1);
break;
case SW1 | SW2:
Port2Output(BLUE | RED);
Port1Output(1);
break;
default: // neither switch is pressed
Port2Output(0);
Port1Output(0);
}
}
}
// Version 3
void SwitchInit(void) {
P1->SEL0 &= ~0x12;
P1->SEL1 &= ~0x12; // 1) configure P1.4 and P1.1 as GPIO
P1->DIR &= ~0x12; // 2) make P1.4 and P1.1 in
P1->REN |= 0x12; // 3) enable pull resistors on P1.4 and P1.1
P1->OUT |= 0x12; // P1.4 and P1.1 are pull-up
}
// bit-banded addresses, positive logic
#define SW2IN ((*((volatile uint8_t *)(0x42098010)))^1)
#define SW1IN ((*((volatile uint8_t *)(0x42098004)))^1)
void RedLEDInit(void) {
P1->SEL0 &= ~0x01;
P1->SEL1 &= ~0x01; // 1) configure P1.0 as GPIO
P1->DIR |= 0x01; // 2) make P1.0 out
}
// bit-banded address
#define REDLED (*((volatile uint8_t *)(0x42098040)))
void ColorLEDInit(void) {
P2->SEL0 &= ~0x07;
P2->SEL1 &= ~0x07; // 1) configure P2.2-P2.0 as GPIO
P2->DIR |= 0x07; // 2) make P2.2-P2.0 out
P2->DS |= 0x07; // 3) activate increased drive strength
P2->OUT &= ~0x07; // all LEDs off
}
// bit-banded addresses
#define BLUEOUT (*((volatile uint8_t *)(0x42098068)))
#define GREENOUT (*((volatile uint8_t *)(0x42098064)))
#define REDOUT (*((volatile uint8_t *)(0x42098060)))
int main3(void) {
SwitchInit();
ColorLEDInit();
RedLEDInit();
GREENOUT = 0;
while (true) {
if (SW1IN || SW2IN) {
REDLED = 1;
} else {
REDLED = 0;
}
if (SW1IN) {
BLUEOUT = 1;
} else {
BLUEOUT = 0;
}
if (SW2IN) {
REDOUT = 1;
} else {
REDOUT = 0;
}
}
}
// Your solution here
void initRedLED(void) {
P1->SEL0 &= ~0x01;
P1->SEL1 &= ~0x01; // 1) configure P1.0 as GPIO
P1->DIR |= 0x01; // 2) make P1.0 output
}
void initColorLED(void) {
P2->SEL0 &= ~0x07;
P2->SEL1 &= ~0x07; // 1) configure P2.2-P2.0 as GPIO
P2->DIR |= 0x07; // 2) make P2.2-P2.0 out
P2->DS |= 0x07; // 3) activate increased drive strength
P2->OUT &= ~0x07; // 4) all LEDs off
}
void initInput(void) {
P1->SEL0 &= ~(SW1 | SW2);
P1->SEL1 &= ~(SW1 | SW2); // 1) configure P1.4 P1.1 P1.0 as GPIO
P1->DIR &= ~(SW1 | SW2); // 2) SW1 and SW2 input
P1->REN |= (SW1 | SW2); // 4) enable pull resistors on P1.4 and P1.1
}
// read P1.4, P1.1 inputs
uint8_t inP1(void) {
return P1->IN & (SW1 | SW2);
}
// write one output bit to P1
void outP1(uint8_t data) {
P1->OUT = (P1->OUT & ~0x01) | data;
}
// write three outputs bits to P2
void outP2(uint8_t data) {
P2->OUT = (P2->OUT & ~0x07) | data;
}
int main(void) {
initRedLED();
initColorLED();
initInput();
outP2(0);
while (true) {
uint8_t switches = inP1() ^ (SW1 | SW2);
switch (switches) {
case SW1:
outP1(RED);
outP2(BLUE);
break;
case SW2:
outP1(RED);
outP2(GREEN);
break;
case SW1 | SW2:
outP1(0);
outP2(RED);
break;
default:
outP1(0);
outP2(BLUE | GREEN);
}
}
}