Skip to content

Instantly share code, notes, and snippets.

@xvzf
Created February 19, 2020 22:35
Show Gist options
  • Save xvzf/95c6e06415d7441161d5fae634df8e71 to your computer and use it in GitHub Desktop.
Save xvzf/95c6e06415d7441161d5fae634df8e71 to your computer and use it in GitHub Desktop.
MPT Sh$t
/********************************************************************/
/* Hochschule fuer Technik und Wirtschaft */
/* Fakultät fuer Ingenieurwissenschaften */
/* Labor fuer Eingebettete Systeme */
/* Mikroprozessortechnik */
/********************************************************************/
/* */
/* C_Übung.C: */
/* Programmrumpf fuer C-Programme mit dem Keil */
/* Entwicklungsprogramm uVision fuer ARM-Mikrocontroller */
/* */
/********************************************************************/
/* Aufgaben-Nr.: * */
/* * */
/********************************************************************/
/* Gruppen-Nr.: * */
/* * */
/********************************************************************/
/* Name / Matrikel-Nr.: * Matthias Riegler */
/* * */
/* * */
/********************************************************************/
/* Abgabedatum: * */
/* * */
/********************************************************************/
#include <LPC21xx.H> /* LPC21xx Definitionen */
#define PCLOCK 12500000
#define BAUD 19200
#define FREQUENCY_DIVIDER (int)(PCLOCK/(BAUD*16))
#define UART0_PINSEL 0x05
#define UART_FIFO_TRANSMIT_MASK 0x20
#define UART_FIFO_RECEIVE_MASK 0x01
#define UART_FIFO 0x07 // 0b111
#define LCR_8BIT_1STOP_DLAB 0x83
#define DLAB_RESET 0x03
#define BYTE_HEXDUMP_COUNT 8
#define BYTE_4BIT_LSB 0x0F
#define BYTE_4BIT_MSB 0xF0
#define BYTE_4BIT_SHIFT 4
#define CR 0x0D
#define LF 0x0A
void transmitChar(char c);
char decToHex(unsigned char i);
unsigned char hexToDec(char c);
void* readAddr(void);
void hexDump(void* addr);
int main(void) {
int i = 0;
PINSEL0 |= UART0_PINSEL;
U0LCR = LCR_8BIT_1STOP_DLAB;
// Set Baudrate (LSB and MSB)
U0DLL = FREQUENCY_DIVIDER % 256;
U0DLM = FREQUENCY_DIVIDER / 256;
// RESET DLAB Bit in order to enable access to other control registers
U0LCR = DLAB_RESET;
// Enable receive&transmit FIFO buffer
U0FCR = UART_FIFO;
// Print validate connection string
for(;i < 10; i++) {
transmitChar(decToHex(i));
}
for(;;) {
hexDump(readAddr());
}
}
void transmitChar(char c) {
// send register ready?
while((U0LSR & UART_FIFO_TRANSMIT_MASK) == 0);
U0THR = c;
}
char readChar() {
// receive register ready?
while((U0LSR & UART_FIFO_RECEIVE_MASK) == 0);
return U0THR;
}
char decToHex(unsigned char i) {
// Single digit
if (i < 10) {
return '0' + i;
}
// A-F
return 'A' + (i-10);
}
unsigned char hexToDec(char c) {
// Single digit
if (c < 'A') {
return c - '0';
}
// A-F
return c - 'A';
}
void* readAddr(void) {
int i = 0;
char currChar = ' ';
unsigned long addr = 0;
transmitChar(CR);
transmitChar(LF);
for(; i < 8; i++) {
currChar = readChar();
if (currChar == CR) break;
// Update address
addr = hexToDec(currChar) | addr << 4;
// Echo input
transmitChar(currChar);
}
return (void*) addr;
}
void hexDump(void* addr) {
int i = 0;
// cast address to an unsigned char at that position
unsigned char *pc = (unsigned char*) addr;
// temp value
unsigned char toDump = 0x00;
transmitChar(':');
for(;i < 8; i++) {
transmitChar(' ');
toDump = *(pc + i);
// hexdump of one byte
transmitChar(decToHex((toDump & BYTE_4BIT_MSB) >> BYTE_4BIT_SHIFT));
transmitChar(decToHex(toDump & BYTE_4BIT_LSB));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment