Updates to style, started Pack documentation

This commit is contained in:
Andreas Mieke 2018-03-15 16:49:13 +01:00
parent 1f0e2aad64
commit a8ba4b7a79
19 changed files with 1037 additions and 37 deletions

View file

@ -1,6 +1,6 @@
%% Vorlage HTBL Hollabrunn Diplomarbeit
%% KOMA Script
\documentclass[12pt,ngerman,a4paper,parskip,twoside,listof=totoc]{scrartcl}
\documentclass[12pt,ngerman,a4paper,parskip,twoside,listof=totoc,tikz,border=5mm]{scrartcl}
\usepackage{hhline} % Tutorial Table border
\usepackage{listings} % Code Listings

50
Mieke/CMSISPacks.tex Normal file
View file

@ -0,0 +1,50 @@
\subsection[CMSIS-Packs]{\gls{CMSIS}-Packs}
\label{sec:cmsis-packs}
Libraries und Beispielprojekte für die \uVision{} 5 werden in sogenannten \gls{CMSIS}-Packs verwaltet. \gls{CMSIS}-Packs sind \gls{ZIP}-Dateien, welche eine Beschreibungs-Datei im \texttt{.pdsc}-Format enthält. Dies ist intern eine \gls{XML}-Datei, welche den Inhalt und die Abhängigkeiten eines \gls{CMSIS}-Packs beschreibt.
Im Zuge dieser Diplomarbeit entstand ein \gls{CMSIS}-Pack für die HTL \gls{STDLib} und einige Assembler Helper-Dateien, welche für das alte \gls{Minimalsystem} verwendet werden. Dies macht das Arbeiten mit der alten Platform in Verbindung mit \uVision{} 5 einfacher als dies mit der Version 4 war. Des weiteren bietet diese Pack-Strukturierung eine einfache Möglichkeit des Updatens von Libraries, was mit der \uVision{} 4 in dieser Form überhaupt nicht möglich war.
\subsubsection{Die Erstellung}
\label{sec:cmsis-erstellung}
Die Erstellung eines minimalen \gls{CMSIS}-Packs ist nicht allzu schwer und in einigen Minuten erledigt. Die Erstellung von komplexeren Packs mit Abhängigkeiten, Beispielprojekten und so weiter kann unter \cite{arm:CMSISPack} eingesehen werden. Im folgenden Beispiel wird das \gls{STDLib}-Pack erstellt.
\begin{warning}
Hinweis: Hier wird nur auf die Erstellung des Packs an sich, nicht aber auf die Erstellung der im Pack inkludierten Libraries eingegangen.
\end{warning}
\subsubsubsection{Inhalt}
\label{sec:cmsis-inhalt}
Der Inhalt des \gls{STDLib} \gls{CMSIS}-Packs kann in \fref{fig:cmsis-inhalt} gesehen werden.
% \dirtree{%
% .1 /.
% .2 Header.
% .3 armv10_serbus.h.
% .3 armv10_std.h.
% .3 STD_STM32_F103RB_ASM.INC.
% .3 STM32_F103RB_MEM_MAP.INC.
% .2 Library.
% .3 armv10_serbus.lib.
% .3 ARMV10_STD.lib.
% .2 HTBL_Hollabrunn.STD-Pack.pdsc.
% }
\begin{forest}
for tree={font=\sffamily, grow'=0,
folder indent=0.2em, folder icons,
edge=densely dotted}
[/
[Header
[armv10\_serbus.h, is file]
[armv10\_std.h, is file]
[STD\_STM32\_F103RB\_ASM.INC, is file]
[STM32\_F103RB\_MEM\_MAP.INC, is file]]
[Library
[armv10\_serbus.lib, is file]
[ARMV10\_STD.lib, is file]]
[HTBL Hollabrunn.STD-Pack.pdsc, is file]
]
\end{forest}

View file

@ -12,4 +12,6 @@ Zur Programmierung des neuen \gls{Minimalsystem}s wurde die \gls{IDE} Keil \uVis
In den nun folgenden Kapiteln wurde dieses Tutorial, in leicht abgewandelter Form, übernommen, das Originaldokument kann unter \cite{doku:tutorial} gefunden werden.
\input{Mieke/Tutorial/Tutorial}
\input{Mieke/Tutorial/Tutorial}
\input{Mieke/CMSISPacks}

View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<package schemaVersion="1.4" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="PACK.xsd">
<vendor>HTBL Hollabrunn</vendor>
<name>STD-Pack</name>
<description>HTL Hollabrunn library and include pack</description>
<url></url>
<supportContact></supportContact>
<releases>
<release version="1.0.0" date="2017-07-16">
Initial version
</release>
</releases>
<keywords>
<keyword>HTBL Hollabrunn</keyword>
<keyword>STD Library</keyword>
<keyword>Serbus Library</keyword>
</keywords>
<components>
<component Cclass="HTBL Hollabrunn" Cgroup="Libraries" Csub="STDLib" Cversion="1.0.0">
<description>Standard library for the HTBL</description>
<files>
<file category="header" name="Header/armv10_std.h"/>
<file category="library" name="Library/ARMV10_STD.lib"/>
</files>
</component>
<component Cclass="HTBL Hollabrunn" Cgroup="Libraries" Csub="SerbusLib" Cversion="1.0.0" condition="STDLib">
<description>Serial bus library for the HTBL</description>
<files>
<file category="header" name="Header/armv10_serbus.h"/>
<file category="library" name="Library/armv10_serbus.lib"/>
</files>
</component>
<component Cclass="HTBL Hollabrunn" Cgroup="Assembler" Csub="Includes" Cversion="1.0.0">
<description>Assembler includes for the HTBL</description>
<files>
<file category="header" name="Header/STD_STM32_F103RB_ASM.INC"/>
<file category="header" name="Header/STM32_F103RB_MEM_MAP.INC"/>
</files>
</component>
</components>
<conditions>
<condition id="STDLib">
<description>Standard library</description>
<require Cclass="HTBL Hollabrunn" Cgroup="Libraries" Csub="STDLib" />
</condition>
</conditions>
</package>

View file

@ -0,0 +1,30 @@
;******************************************************************************
;* (C) Copyright HTL - HOLLABRUNN 2009-2010 All rights reserved. AUSTRIA *
;* *
;* File Name: std32_f103rb_std.inc *
;* Autor: Josef Reisinger *
;* Version: V1.00 *
;* Date: 25/10/2010 *
;* Description: Standard Library für ARM Corttex M3 *
;******************************************************************************
;* History: V1.00 creation *
;* *
;******************************************************************************
EXTERN init_leds_switches
EXTERN set_leds
EXTERN get_actual_switches
EXTERN wait_ms
EXTERN wait_10us
EXTERN uart_init
EXTERN uart_put_char
EXTERN uart_get_char
EXTERN uart_put_string
EXTERN uart_clear
EXTERN uart_put_hex
EXTERN nib2asc
EXTERN hex2bcd
EXTERN asc2nib
END

View file

@ -0,0 +1,73 @@
; File soll in Verzeichnis "C:\Keil\ARM\INC\ST\STM32F10x" kopiert werden (Installationspfad µVision)
PERIPH_BB_BASE EQU 0x42000000
PERIPH_BASE EQU 0x40000000
APB2PERIPH_BASE EQU PERIPH_BASE + 0x10000
AHBPERIPH_BASE EQU PERIPH_BASE + 0x20000
GPIOA_BASE EQU APB2PERIPH_BASE + 0x0800
GPIOA_CRL EQU GPIOA_BASE
GPIOA_CRH EQU GPIOA_BASE+0x04
GPIOA_IDR EQU GPIOA_BASE+0x08
GPIOA_ODR EQU GPIOA_BASE+0x0c
GPIOA_BSRR EQU GPIOA_BASE+0x10
GPIOA_BRR EQU GPIOA_BASE+0x14
GPIOA_LCKR EQU GPIOA_BASE+0x18
GPIOB_BASE EQU APB2PERIPH_BASE + 0x0C00
GPIOB_CRL EQU GPIOB_BASE
GPIOB_CRH EQU GPIOB_BASE+0x04
GPIOB_IDR EQU GPIOB_BASE+0x08
GPIOB_ODR EQU GPIOB_BASE+0x0c
GPIOB_BSRR EQU GPIOB_BASE+0x10
GPIOB_BRR EQU GPIOB_BASE+0x14
GPIOB_LCKR EQU GPIOB_BASE+0x18
GPIOC_BASE EQU APB2PERIPH_BASE + 0x1000
GPIOC_CRL EQU GPIOC_BASE
GPIOC_CRH EQU GPIOC_BASE+0x04
GPIOC_IDR EQU GPIOC_BASE+0x08
GPIOC_ODR EQU GPIOC_BASE+0x0c
GPIOC_BSRR EQU GPIOC_BASE+0x10
GPIOC_BRR EQU GPIOC_BASE+0x14
GPIOC_LCKR EQU GPIOC_BASE+0x18
USART1_BASE EQU APB2PERIPH_BASE + 0x3800
USART1_SR EQU USART1_BASE
USART1_DR EQU USART1_BASE+0x04
USART1_BRR EQU USART1_BASE+0x08
USART1_CR1 EQU USART1_BASE+0x0C
USART1_CR2 EQU USART1_BASE+0x10
USART1_CR3 EQU USART1_BASE+0x14
USART1_GTPR EQU USART1_BASE+0x18
RCC_BASE EQU AHBPERIPH_BASE + 0x1000
RCC_CR EQU RCC_BASE
RCC_CFGR EQU RCC_BASE+0x04
RCC_CIR EQU RCC_BASE+0x08
RCC_APB2RSTR EQU RCC_BASE+0x0C
RCC_APB1RSTR EQU RCC_BASE+0x10
RCC_AHBENR EQU RCC_BASE+0x14
RCC_APB2ENR EQU RCC_BASE+0x18
RCC_APB1ENR EQU RCC_BASE+0x1C
RCC_BDCR EQU RCC_BASE+0x20
RCC_CSR EQU RCC_BASE+0x24
RCC_AHBRSTR EQU RCC_BASE+0x28
RCC_CFGR2 EQU RCC_BASE+0x2C
RCC_APB2ENR_IOPAEN EQU 0x0004
RCC_APB2ENR_IOPBEN EQU 0x0008
RCC_APB2ENR_IOPCEN EQU 0x0010
RCC_APB2ENR_USART1EN EQU 0x4000
END

View file

@ -0,0 +1,328 @@
/******************************************************************************/
/* (C) Copyright HTL - HOLLABRUNN 2009-2010 All rights reserved. AUSTRIA */
/* */
/* File Name: armv10_serbus.h */
/* Autor: Jakob Maier */
/* Version: V1.00 */
/* Date: 23/07/2010 */
/* Description: Library für Serielle Busse (I2C und SPI) für ARM Corttex M3 */
/* */
/******************************************************************************/
/* History: 07.05.2010: Jakob Maier creation V1.00 (I2C) */
/* - Beinhaltet alle wesentlichen Unterprogramme */
/* die zur Kommunikation über den I2C-Bus */
/* 28.02.2011: REJ V1.1 */
/* - Library aus Funktionen erstellt */
/******************************************************************************/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __ARMV10_SERBUS_H
#define __ARMV10_SERBUS_H
//Hardware:
//*********
//
//SCL=PB6
//SDA=PB7
//Wichtig: Die Leitungen zur Sicherheit mit 2stk. 4,7kOhm Pull-Up Widerständen an die 3,3V anpassen!
//
//Master Receiver:
//****************
//
//1 Byte + Stop: init (-) start(adr+1,1) - read(&dat,x)
//1 Byte + Stop: init (-) I2C1_read_1(adr+x,&dat)
//
//2 Byte + Stop: init (-) start(adr+1,0) - read(&dat,1) - read(&dat,x)
//2 Byte + Stop: init (-) start(adr+1,0) - I2C1_read_last2(&dat1,&dat2)
//
//3 Byte + Stop: init (-) start(adr+1,0) (-) read(&dat,0) - read(&dat,1) - read(&dat,x)
//3 Byte + Stop: init (-) start(adr+1,0) (-) read(&dat,0) - I2C1_read_last2(&dat1,&dat2)
//
//4 Byte + Stop: init (-) start(adr+1,0) (-) read(&dat,0) (-) read(&dat,0) - read(&dat,1) - read(&dat,x)
//4 Byte + Stop: init (-) start(adr+1,0) (-) read(&dat,0) (-) read(&dat,0) - I2C1_read_last2(&dat1,&dat2)
//
//5 Byte + Stop: init (-) start(adr+1,0) (-) read(&dat,0) (-) read(&dat,0) (-) read(&dat,0) - read(&dat,1) - read(&dat,x)
//...
//n Byte + Stop: init (-) I2C1_read_n(adr+x,daten[],anz)
//
//Master Transmitter:
//*******************
//
//1 Byte + Stop: init (-) start(adr+0,x) (-) send(data,1)
//2 Byte + Stop: init (-) start(adr+0,x) (-) send(data,0) (-) send(data,1)
//3 Byte + Stop: init (-) start(adr+0,x) (-) send(data,0) (-) send(data,0) (-) send(data,1)
//...
//n Byte + Stop (Pause zw. Byteübertragung mögl.): init (-) I2C1_send_n(adr+x,daten[],anz,pause)
//
//Legende:
//********
//
// "(-)": Sofort danach oder nach einer beliebig langen Pause folgt die nächste Operation (Achtung: bei einem Reset kann es zu Error Nr. 0x86 kommen - Die Busleitungen sind noch immer auf 0, da mitten im Datenverkehr abgebrochen wurde)
// " - ": Sofort danach folgt die nächste Operation (Es muss sofort reagiert werden)
//
/*-------------------------------------------------- I2C - Fehlercodes: -----------------------------*/
// Ein Fehlercode beinhaltet zwei Arten von Daten: Wo der Fehler auftrat und was der Fehlergrund ist.
// Die ersten 4bit (MSB) geben an, in welcher Routine sich der Fehler ereignet hat (Fehlerposition), die
// letzten 4bit (LSB) geben die Fehlerart an. Ist kein Fehler aufgetreten, wird 0x00 als Code verwendet,
// die Fehlerposition nicht miteinberechnet.
// Fehlercode-Berechnung: "Fehlercode" = "Fehlerposition" | "Fehlerart";
//
#define info_success 0x00 //Kein Fehler aufgetreten (immer 0x00)
/*------------ Fehlerposition:---------*/
#define err_at_init 0x80 //Fehler in der Initialisierungsroutine
#define err_at_start 0x40 //Fehler in der Start- und Adressierungsroutine
#define err_at_send 0x20 //Fehler in der Senderoutine
#define err_at_read 0x10 //Fehler in der Empfangsroutine
/*----------- Fehlerarten:-------------*/
#define error_I2C1_running 0x01 //Der I2C1-Bus ist bereits in Betrieb und kann nicht mehr initialisiert werden
#define error_I2C1_disabled 0x02 //Es kann keine Startbedingung erzeugt werden, da der Bus außer Betrieb ist (Keine Initialisierung)
#define error_no_master 0x03 //Der I2C1-Bus befindet sich nicht im Mastermode ("start()": Peripherie-Fehler; "send()": Startbedingung erzeugt?)
#define error_no_transmitter 0x04 //Es können keine Daten gesandt werden, da der Slavebaustein zum lesen Adressiert wurde (R/W-bit muss 0 sein)
#define error_not_addressed 0x05 //Die Hardware wurde nicht adressiert, NACK erhalten (Wurde die richtige Adresse eingestellt?)
#define error_timeout_busy 0x06 //Der Bus kann derzeit noch nicht initialisiert werden, da bereits ein Datenverkehr ausgeführt wird
//(Leitung auf "LOW" - PullUp-Widerstände vorhanden?)
#define error_timeout_start 0x07 //Bei der Startbedingung ist es zu einem Time-Out gekommen (Ist der Bus belegt (Multimaster-Mode)?,
//Ist vielleicht noch eine Datenübertragung im gange?)
#define error_timeout_stop 0x08 //Bei der Stopbedingung ist es zu einem Time-Out gekommen (Ist vielleicht noch eine Datenübertragung im gange?)
#define error_timeout_send 0x09 //Die Daten wurden nicht übertragen (Timeout) (Verwendet der Slave Clock-Streching?
//Sind die Busleitungen auf "LOW" gefallen?)
#define error_NACK 0x0A //Der Slave hat auf die Daten mit einem NACK geantwortet (Der Fehler liegt auf der Slave-Seite oder es wurde
//dessen Übertragungsprotokoll verletzt/beendet)
#define error_no_data 0x0B //Bei "read()". Entweder wurde noch kein Baustein adresiert oder nach Beendigung der letzten Übertragung
//sind keine ausstehenden Daten mehr vorhanden (Adressiert? "I2C1_data_available()" verwendet?)
#ifdef ARMV10_SERBUS_MOD
#define EXPORT
#else
#define EXPORT extern
#endif
/* ---------------------------Exported functions ---------------------------- */
/******************************************************************************/
/* U N T E R P R O G R A M M: I2C_error_message */
/* */
/* Aufgabe: Gibt eine I2C Fehleranalyse auf UART aus */
/* Input: I2C Fehlercode */
/* return: I2C Fehlercode */
/* Remark: Der Fehler wird als Rückgabewert weitergegeben um das UPro direkt */
/* in einer Fehlerabfrage verwenden zu können: */
/* "if(I2C_error_message(I2C1_init())!=info_success)" */
/******************************************************************************/
EXPORT char I2C_error_message(char errorcode);
/******************************************************************************/
/* U N T E R P R O G R A M M: I2C1_init */
/* */
/* Aufgabe: Initialisiert den I2C1-Bus im Standard-Modus (100kHz) */
/* SCL=PB6, SDA=PB7 . Es wird die GPIOB und I2C1-Peripherie enabled. */
/* I2C1 kann mit "I2C1_disable()" disabled werden. */
/* Input: - */
/* return: I2C Fehlercode */
/* Remark: Nächster Schritt: "I2C1_start()" */
/* I2C Fehlerposition 0x80 */
/******************************************************************************/
EXPORT char I2C1_init(void);
/******************************************************************************/
/* U N T E R P R O G R A M M: I2C1_disable */
/* */
/* Aufgabe: Schaltet die I2C1-Peripherie ab. Es ist keine Buskommunikation */
/* mehr möglich. Die Ports werden als Output konfiguriert und auf */
/* 1 gesetzt. */
/* Input: - */
/* return: - */
/* Remark: */
/* */
/******************************************************************************/
/* !!!!!!!!!!!!!!!!! Noch nicht getestet: !!!!!!!!!!!!!!!!!!!!!! */
EXPORT void I2C1_disable(void);
/******************************************************************************/
/* U N T E R P R O G R A M M: I2C1_start */
/* */
/* Aufgabe: Erzeugt eine Startbedingung und Adressiert einen Slavebaustein. */
/* Je nach R/W-Bit ist man Master Transmitter (0) oder Master */
/* Receiver(1). */
/* Input: "adresse": 7bit Adresse und Read/!Write - Bit "single": */
/* Wenn das R/W-Bit 1 ist und nur ein Byte empfangen werden soll ist */
/* "single" ungleich 0. */
/* return: Fehlercode */
/* Remark: I2C Fehlerposition 0x40 */
/* Nächster I2C Schritt: Senden oder Empfangen */
/******************************************************************************/
EXPORT char I2C1_start(char adresse, char single);
/******************************************************************************/
/* U N T E R P R O G R A M M: I2C1_get_mode() */
/* */
/* Aufgabe: Übergibt den Status des I2C-Busses (Slave, Master Transmitter */
/* oder Master Receiver). Damit kann im Nachhinein festgestellt */
/* werden was das R/W-Bit war. */
/* Input: - */
/* return: 0x00: Der Bus ist deaktiviert */
/* 0x01: Der Bus wurde als Slave adressiert */
/* 0x02: Master Transmitter */
/* 0x03: Master Receiver */
/* Remark: */
/* */
/******************************************************************************/
// !!!!!!!!!!!!!!!!!!!!!! Noch nicht getestet !!!!!!!!!!!!!!!!!!!!
EXPORT char I2C1_get_mode(void);
/******************************************************************************/
/* U N T E R P R O G R A M M: I2C1_data_available() */
/* */
/* Aufgabe: Überprüft ob im Master-Receiver Modus Daten die Empfangen */
/* wurden zum Abruf bereit stehen. Damit kann im Unterprogramm */
/* "I2C1_read()" eine Endlosschleife vermieden werden. */
/* Input: - */
/* return: 0x00: Keine Daten vorhanden */
/* 0x01: Daten im Datenregister */
/* */
/* Remark: */
/* */
/******************************************************************************/
EXPORT char I2C1_data_available(void);
/******************************************************************************/
/* U N T E R P R O G R A M M: I2C1_read */
/* */
/* Aufgabe: Liest die Daten aus, die vom Slave gesendet wurden. Sind keine */
/* Daten vorhanden wird solange gewartet, bis welche empfangen */
/* wurden */
/* Input: "daten": Variable in die die Daten geschrieben werden. */
/* "last": Wenn dass das vorletzte Byte ist dass empfangen werden */
/* soll, ist "last" ungleich 0 */
/* return: Fehlercode */
/* Remark: I2C Fehlerposition 0x10 */
/* Nächster Schritt: Lesen oder nach Stop "I2C1_data_available()" */
/* bzw. Start oder Disable */
/******************************************************************************/
EXPORT char I2C1_read(char *daten, char last);
/******************************************************************************/
/* U N T E R P R O G R A M M: I2C1_read_1 */
/* */
/* Aufgabe: Erzeugt eine Startbedingung, Übernimmt die Adressierung, empfangt*/
/* ein einzelnes Byte und erzeugt dann wieder eine Stopbedingung */
/* Input: "adresse": Slaveadresse (Das R/W-Bit wird im UPro auf 1 gesetzt) */
/* "daten": Variable in die das empfangene Byte geschrieben wird */
/* return: Fehlercode */
/* Remark: I2C Fehlerposition 0x40 und 0x10 */
/* Nächster Schritt: Start oder Disable */
/******************************************************************************/
EXPORT int I2C1_read_1(char adresse, char *daten);
/******************************************************************************/
/* U N T E R P R O G R A M M: I2C1_read_last2 */
/* */
/* Aufgabe: Empfängt 2 Bytes und erzeugt dann eine Stopbedingung. */
/* Kann bei einem datenempfang ab 2 Bytes immer verwendet werden */
/* */
/* Input: "daten1": Variable für das vorletzte Empfangene Byte */
/* "daten2": Das letzte Empfangsbyte */
/* */
/* return: Fehlercode */
/* Remark: I2C Fehlerposition: 0x10 */
/* Nächster I2CSchritt: Start oder Disable */
/******************************************************************************/
EXPORT char I2C1_read_last2(char *daten1, char *daten2);
/******************************************************************************/
/* U N T E R P R O G R A M M: I2C1_read_n */
/* */
/* Aufgabe: Liest eine bestimmte Anzahl an Daten ein. */
/* Übernimmt auch die Startbedingung, die Adressierung */
/* und die Stopbedingung. Das R/W-Bit wird im UPro gesetzt. */
/* Input: "adresse": Adresse des Slave-Bausteins */
/* "daten[]": Array, in das die Empfangsdaten geschrieben werden */
/* "anzahl": Wie viele Bytes empfangen werden sollen (ab 1 Byte) */
/* return: Fehlercode */
/* Remark: I2C Fehlerposition: 0x40 und 0x20 */
/* */
/******************************************************************************/
EXPORT char I2C1_read_n(char adresse, char daten[],int anzahl);
/******************************************************************************/
/* U N T E R P R O G R A M M: I2C1_send */
/* */
/* Aufgabe: Sendet ein einzelnes Byte an den Slave und kann dann eine */
/* Stopbedingung erzeugen. Das R/W-Bit muss 0 (Master Transmitter) */
/* gewesen sein. */
/* */
/* Input: "daten": Die Sendedaten */
/* "stop": Wenn dies Variable ungleich 0 ist, wird nach der */
/* Übertragung eine Stopbedingung erzeugt */
/* return: */
/* Remark: I2C Fehlerposition: 0x20 */
/* Nächster Schritt: Senden, oder wenn "stop" ungleich 0: */
/* Start oder Disable */
/******************************************************************************/
EXPORT char I2C1_send(char daten,char stop);
/******************************************************************************/
/* U N T E R P R O G R A M M: I2C1_send_n */
/* */
/* Aufgabe: Übernimmt die Startbedingung und die Adressierung. */
/* Sendet danach eine Reihe an Daten an den Slave wobei dazwischen */
/* Pausen eingelegt werden können. Danach kommt es zu einer */
/* Stopcondition */
/* Input: "adresse": Slaveadresse (Das R/W-Bit wird im UPro auf 0 gesetzt) */
/* "daten[]": Array dessen Inhalt an den Slave gesendet wird */
/* "anzahl": Anzahl der Bytes aus dem Array die gesendet werden */
/* "Pause": Pause in Millisekunden die zwischen den Übertragungen */
/* eingelegt wird */
/* return: Fehlercode */
/* Remark: I2C Fehlerposition: 0x40 und 0x20 */
/* Nächster Schritt: Start oder Disable */
/******************************************************************************/
EXPORT char I2C1_send_n(char adresse, char daten[],int anzahl,int pause);
/******************************************************************************/
/* U N T E R P R O G R A M M: SPI1_Init */
/* */
/* Aufgabe: Initialisiert SPI 1 Schnittstelle */
/* Input: */
/* return: */
/* Remark: */
/* */
/******************************************************************************/
EXPORT void SPI1_Init(void);
/******************************************************************************/
/* U N T E R P R O G R A M M: SPI1_Send */
/* */
/* Aufgabe: Sendet 1 Byte via SPI1 Schnittstelle */
/* Input: */
/* return: */
/* Remark: */
/* */
/******************************************************************************/
EXPORT void SPI1_Send(unsigned char send);
/******************************************************************************/
/* U N T E R P R O G R A M M: SPI1_Receive */
/* */
/* Aufgabe: Empfängt 1 Byte von SPI1 Schnittstelle */
/* Input: */
/* return: */
/* Remark: */
/* */
/******************************************************************************/
EXPORT unsigned char SPI1_Receive(void);
#undef EXPORT
#endif /* __ARMV10_SERBUS_H */
/******************* (C) HTL - HOLLABRUNN 2009-2010 *****END OF FILE****/

View file

@ -0,0 +1,396 @@
/******************************************************************************/
/* (C) Copyright HTL - HOLLABRUNN 2009-2010 All rights reserved. AUSTRIA */
/* */
/* File Name: armv10_std.h */
/* Autor: Josef Reisinger */
/* Version: V1.00 */
/* Date: 07/05/2010 */
/* Description: Standard Library für ARM Corttex M3 */
/******************************************************************************/
/* History: V1.00 creation */
/* V1.01 09.06.2010 REJ: */
/* Add Bit banding Adresses for LED/Switsches Board */
/* V2.0 19.02.2011 REJ: */
/* - dil_taster_init, dil_led_init hinzugefügt */
/* - lcd_setcursor auf 4 zelige anzeige erweiterst */
/* - Bitbanding Definitiones von Pointer (Adresse der */
/* Speicherzelle auf Inhalt der Speicherzelle umgestellt */
/* - Fehler bei Portmodi Settings in Init_led Switsches */
/* korrigiert */
/******************************************************************************/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __ARMV10_STD_H
#define __ARMV10_STD_H
/* Includes ------------------------------------------------------------------*/
#include <stm32f10x.h>
#include <stdio.h>
/*----------------------------- Define Pins for LED and Swistches--------------*/
/* Einzel-Portpins im Bitbandbereich festlegen */
#define GPIOA_IDR GPIOA_BASE + 2*sizeof(uint32_t) // Calc peripheral address GPIOA IDR
#define GPIOA_ODR GPIOA_BASE + 3*sizeof(uint32_t)
#define GPIOB_IDR GPIOB_BASE + 2*sizeof(uint32_t)
#define GPIOB_ODR GPIOB_BASE + 3*sizeof(uint32_t) // Calc peripheral address GPIOB ODR
#define GPIOC_IDR GPIOC_BASE + 2*sizeof(uint32_t)
#define GPIOC_ODR GPIOC_BASE + 3*sizeof(uint32_t)
// Calc Bit Band Adress from peripheral address: a = peripheral address b = Bit number
#define BITBAND_PERI(a,b) ((PERIPH_BB_BASE + (a-PERIPH_BASE)*32 + (b*4)))
#define SW0 *((volatile unsigned long *)(BITBAND_PERI(GPIOA_IDR,0))) // PA0
#define SW1 *((volatile unsigned long *)(BITBAND_PERI(GPIOA_IDR,1))) // PA1
#define SW2 *((volatile unsigned long *)(BITBAND_PERI(GPIOA_IDR,2))) // PA2
#define SW3 *((volatile unsigned long *)(BITBAND_PERI(GPIOA_IDR,3))) // PA3
#define SW4 *((volatile unsigned long *)(BITBAND_PERI(GPIOA_IDR,4))) // PA4
#define SW5 *((volatile unsigned long *)(BITBAND_PERI(GPIOA_IDR,5))) // PA5
#define SW6 *((volatile unsigned long *)(BITBAND_PERI(GPIOA_IDR,6))) // PA6
#define SW7 *((volatile unsigned long *)(BITBAND_PERI(GPIOA_IDR,7))) // PA7
#define PIEZO *((volatile unsigned long *)(BITBAND_PERI(GPIOB_ODR,0))) //Portleitung des Piezo-Summers (PB0)
#define LED0 *((volatile unsigned long *)(BITBAND_PERI(GPIOB_ODR,8))) // PB8
#define LED1 *((volatile unsigned long *)(BITBAND_PERI(GPIOB_ODR,9))) // PB9
#define LED2 *((volatile unsigned long *)(BITBAND_PERI(GPIOB_ODR,10))) // PB10
#define LED3 *((volatile unsigned long *)(BITBAND_PERI(GPIOB_ODR,11))) // PB11
#define LED4 *((volatile unsigned long *)(BITBAND_PERI(GPIOB_ODR,12))) // PB12
#define LED5 *((volatile unsigned long *)(BITBAND_PERI(GPIOB_ODR,13))) // PB13
#define LED6 *((volatile unsigned long *)(BITBAND_PERI(GPIOB_ODR,14))) // PB14
#define LED7 *((volatile unsigned long *)(BITBAND_PERI(GPIOB_ODR,15))) // PB15
#define DIL_LED1 *((volatile unsigned long *)(BITBAND_PERI(GPIOD_ODR,2))) //PD2
#define DIL_LED2 *((volatile unsigned long *)(BITBAND_PERI(GPIOC_ODR,13))) //PC13
#define DIL_LED3 *((volatile unsigned long *)(BITBAND_PERI(GPIOA_ODR,8))) //PA8
#define DIL_TASTER1 *((volatile unsigned long *)(BITBAND_PERI(GPIOC_IDR,5))) //PC5
#define DIL_TASTER2 *((volatile unsigned long *)(BITBAND_PERI(GPIOC_IDR,13))) //PC13
#define DIL_TASTER3 *((volatile unsigned long *)(BITBAND_PERI(GPIOA_IDR,8))) //PA8
/*--------------------------------- Definitions LCD --------------------------*/
#define LineLen 16 /* Width of LCD (in characters) */
#define NumLines 2 /* Hight of LCD (in lines) */
/* ---------------------Vordefinierte Frequenzen fuer Tonerzeugung -----------*/
#define ton_C1 262
#define ton_D1 293
#define ton_E1 329
#define ton_F1 349
#define ton_G1 391
#define ton_A1 440
#define ton_H1 493
#define ton_C2 523
#define ton_D2 587
#define ton_E2 659
#define ton_F2 698
#define ton_G2 783
#define ton_A2 880
#define ton_H2 987
#define ton_C3 1046
/* ------------------- Vordefinierte Längen (ms) für Tonerzeugung --------------*/
#define ganze 800
#define halbe 400
#define viertel 200
#define achtel 100
#define sechzehntel 50
#ifdef ARMV10_STD_MOD
#define EXPORT
#else
#define EXPORT extern
#endif
/* ----------------------------Exported functions ---------------------------- */
/* ------------------------- Reset and Clock Control -----------------------*/
/******************************************************************************/
/* U N T E R P R O G R A M M: */
/* */
/* Aufgabe: Set System Clock to 72MHz */
/* Input: none */
/* return: none */
/******************************************************************************/
EXPORT void set_clock_72MHz(void);
/* ------------------------- LED/ Switches Board Funktions -------------------*/
/******************************************************************************/
/* U N T E R P R O G R A M M: init_leds_switches */
/* */
/* Aufgabe: Initialisiert Portleitungen für LED / Schalterplatine */
/* Input: */
/* return: */
/******************************************************************************/
EXPORT void init_leds_switches(void);
/*******************************************************************************/
/* U N T E R P R O G R A M M: set_leds */
/* */
/* Aufgabe: gibt hexadezimalen Wert in auf 8 Leds aus */
/* (an Port 0 angeschlossen) */
/* Input: value = Wert auf den LEDS gesetzt werden sollen */
/* return: */
/******************************************************************************/
EXPORT void set_leds (char value);
/******************************************************************************/
/* U N T E R P R O G R A M M: get_switches */
/* */
/* Aufgabe: liest aktuelle Schalterstellung ein */
/* Input: */
/* return: aktuelle Schalterstellung */
/******************************************************************************/
EXPORT char get_switches(void);
/******************************************************************************/
/* U N T E R P R O G R A M M: dil_taster_init */
/* */
/* Aufgabe: Initialisiert Portleitung für Taster auf DIL */
/* Input: */
/* return: */
/******************************************************************************/
EXPORT void dil_taster_init(void);
/******************************************************************************/
/* U N T E R P R O G R A M M: dil_led _init */
/* */
/* Aufgabe: Initialisiert Portleitung für LEDS auf DIL */
/* Input: */
/* return: */
/******************************************************************************/
EXPORT void dil_led_init(void);
/* ------------------------- Miscellaneous Funktions --------------------------*/
/******************************************************************************/
/* U N T E R P R O G R A M M: WAIT_MS */
/* */
/* Aufgabe: Wartet die angegebene Anzahl an Millisekunden */
/* Input: ms = Anzahl der zu wartenden Millisekunden */
/* return: */
/******************************************************************************/
EXPORT void wait_ms(int ms);
/******************************************************************************/
/* U N T E R P R O G R A M M: wait_10us */
/* */
/* Aufgabe: Wartet 10µs */
/* Input: */
/* return: */
/******************************************************************************/
EXPORT void wait_10us(void);
/******************************************************************************/
/* U N T E R P R O G R A M M: */
/* */
/* Aufgabe: Function converts a Nibble(0-F) to an ASCII ('0'-'F') */
/* Input: nib: Nibble to convert */
/* Output: nib: Converted Nibble */
/* return: - */
/******************************************************************************/
EXPORT void nib2asc(char *nib);
/******************************************************************************/
/* U N T E R P R O G R A M M: */
/* */
/* Aufgabe: Function converts an ASCII('0'-'F') to a Nibble(0-F) */
/* Input: asc: ASCII Code */
/* Output: asc: Hex Value */
/* return: - */
/******************************************************************************/
EXPORT void asc2nib(char *asc);
/******************************************************************************/
/* U N T E R P R O G R A M M: */
/* */
/* Aufgabe: Function converts a Hex-Code (00-FF) to an BCD (0-255) */
/* Input: hex: Hex Value */
/* return: BCD Value */
/******************************************************************************/
EXPORT int hex2bcd(char hex);
/* ------------------------- UART Funktionen ----------------------------------*/
/******************************************************************************/
/* U N T E R P R O G R A M M: */
/* */
/* Aufgabe: Initialisiert UART1 */
/* Input: Baudrate */
/* return: */
/******************************************************************************/
EXPORT void uart_init(unsigned long baudrate);
/******************************************************************************/
/* U N T E R P R O G R A M M: */
/* */
/* Aufgabe: liest ein Zeichen von UART1 ein */
/* Input: */
/* return: eingelesens Zeichen */
/******************************************************************************/
EXPORT char uart_get_char(void);
/******************************************************************************/
/* U N T E R P R O G R A M M: */
/* */
/* Aufgabe: Ausgabe eines Zeichens auf UART1 */
/* Input: ch: Zeichen in ASCII Code */
/* return: */
/******************************************************************************/
EXPORT void uart_put_char(char ch);
/******************************************************************************/
/* U N T E R P R O G R A M M: */
/* */
/* Aufgabe: Ausgabe eines 8 Bit Hex Wertes als ASCII String auf UART1 */
/* Input: */
/* return: */
/******************************************************************************/
EXPORT void uart_put_hex(char c);
/******************************************************************************/
/* U N T E R P R O G R A M M: */
/* */
/* Aufgabe: Ausgabe eines Strings auf UART1 */
/* Input: string: C- String der aud UART1 ausgegeben werden soll */
/* return: */
/******************************************************************************/
EXPORT void uart_put_string(char *string);
/******************************************************************************/
/* U N T E R P R O G R A M M: */
/* */
/* Aufgabe: sendet ein CLEAR Screen String ("ESC[2J") zu einem VT100 Terminal */
/* Input: */
/* return: */
/******************************************************************************/
EXPORT void uart_clear(void);
/******************************************************************************/
/* U N T E R P R O G R A M M: */
/* */
/* Aufgabe: sendet Positionierungsstring auf VT100 Terminal "ESC[y;xH" */
/* Input: */
/* return: */
/******************************************************************************/
EXPORT void uart_setpos(char x,char y);
/* ------------------------- LCD Funktionen ----------------------------------*/
/*******************************************************************************
* Initialize the LCD controller *
* Parameter: *
* Return: *
*******************************************************************************/
EXPORT void lcd_init (void);
/*******************************************************************************
* Write command to LCD controller *
* Parameter: c: command to be written *
* Return: *
*******************************************************************************/
EXPORT void lcd_write_cmd (unsigned char c);
/*******************************************************************************
* Write data to LCD controller *
* Parameter: c: data to be written *
* Return: *
*******************************************************************************/
EXPORT void lcd_write_data (unsigned char c);
/******************************************************************************/
/* U N T E R P R O G R A M M: */
/* */
/* Aufgabe: Print Character to current cursor position */
/* Input: c: character to be printed */
/* return: */
/******************************************************************************/
EXPORT void lcd_put_char (char c);
/******************************************************************************/
/* U N T E R P R O G R A M M: */
/* */
/* Aufgabe: Ausgabe eines 8 Bit Hex Wertes als ASCII String auf LCD */
/* Input: c: Hex Value to be printed */
/* return: */
/******************************************************************************/
EXPORT void lcd_put_hex(char c);
/*******************************************************************************/
/* Set cursor position on LCD display */
/* Parameter: line: line position (0-3) */
/* column: column position (0-15) */
/* Return: */
/*******************************************************************************/
EXPORT void lcd_set_cursor (int line_nr, int column_nr);
/*******************************************************************************
* Clear the LCD display *
* Parameter: *
* Return: *
*******************************************************************************/
EXPORT void lcd_clear (void);
/*******************************************************************************
* Print sting to LCD display *
* Parameter: string: pointer to output string *
* Return: *
*******************************************************************************/
EXPORT void lcd_put_string (char *string);
/*******************************************************************************
* Print a bargraph to LCD display *
* Parameter: val: value 0..100 % *
* size: size of bargraph 1..16 *
* Return: *
*******************************************************************************/
EXPORT void lcd_bargraph (int value, int size);
/*******************************************************************************
* Display bargraph on LCD display *
* Parameter: pos_y: vertical position of bargraph *
* pos_x: horizontal position of bargraph start *
* value: size of bargraph active field (in pixels) *
* Return: *
*******************************************************************************/
EXPORT void lcd_bargraphXY (int pos_y, int pos_x, int value);
/* ------------------------- ADC Funktionen ----------------------------------*/
/******************************************************************************/
/* U N T E R P R O G R A M M: adc1_convert */
/* */
/* Aufgabe: liefert aktuellen Wert von ADC1 für Kanal channel */
/* */
/* Input: channel to convert */
/* return: converted value (12Bit right aligned) */
/******************************************************************************/
EXPORT unsigned short int adc1_convert(unsigned char channel);
/******************************************************************************/
/* U N T E R P R O G R A M M: ton */
/* */
/* Aufgabe: Wiedergabe eines Ton auf Piezo Summer */
/* */
/* Input: frequenz: Frequenz des Tons in Hz */
/* dauer: Dauer des in ms */
/* return: */
/******************************************************************************/
EXPORT void ton(int frequenz,int dauer_ms);
#undef EXPORT
#endif /* __ARMV10_STD_H */
/******************* (C) HTL - HOLLABRUNN 2009-2010 *****END OF FILE****/

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

4
Mieke/Pack/gen_pack.sh Normal file
View file

@ -0,0 +1,4 @@
#!/bin/bash
cd Files
7z a "../HTBL Hollabrunn.STD-Pack.1.0.0.pack" * -tzip
cd ..

View file

@ -196,7 +196,7 @@ Im Register Fenster (\fref{fig:tut-debugging3}) sind alle Register des Microcont
\fig{tut-debugging3}{\uVision{} 5: Register Fenster}{Register Fenster}{0.3\textwidth}{Mieke/Tutorial/Screenshots/debugging3}
Ein weiteres Fenster ist das Disassembly-Fenster, zu sehen in \fref{fig:tut-debugging4}, welches den zur Zeit ausgeführten Binärcode in Form von Assemblerbefehlen zeigt. Dies ist sinnvoll, wenn eine binäre Library analysiert und auf Fehler geprüft werden muss. Des weiteren kann man hier gut sehen bei welchem Teil einer Libraryfunktion das Programm zum Beispiel abstürzt oder hängen bleibt.
Ein weiteres Fenster ist das Disassembly-Fenster, welches den zur Zeit ausgeführten Binärcode in Form von Assemblerbefehlen zeigt, siehe \fref{fig:tut-debugging4}. Dies ist sinnvoll, wenn eine binäre Library analysiert und auf Fehler geprüft werden muss. Des weiteren kann man hier gut sehen bei welchem Teil einer Libraryfunktion das Programm zum Beispiel abstürzt oder hängen bleibt.
\fig{tut-debugging4}{\uVision{} 5: Disassembly Fenster}{Disassembly Fenster}{0.75\textwidth}{Mieke/Tutorial/Screenshots/debugging4}

View file

@ -23,6 +23,8 @@
\newdualentry{Keil}{Keil}{Keil Elektronik GmbH}{war eine deutsche Firma (Anfangs: GbR), gegründet 1982 von Günther und Reinhard Keil. Das Hauptaufgabengebiet lag bei der Entwicklung von Evaluation Boards und der $\mu$Vision \gls{IDE}. Keil wurde 2005 von \gls{ARM} aufgekauft. Siehe: \cite{wiki:Keil} \cite{techdesignforums:ARM}}
\newdualentry{XML}{XML}{Extensible Markup Language}{ist eine Auszeichnungssprache, welche zur Abspeicherung von strukturierten Daten verwendet wird}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Glossary
\newglossaryentry{Debugging}{
name={Debugging},
@ -52,4 +54,9 @@
\newglossaryentry{C++}{
name={C++},
description={ist eine objektorientierte Erweiterung zu \gls{C}. C++ wurde 1979 von Bjarne Stroustrup entwickelt. Siehe: \cite{wiki:C++}}
}
\newglossaryentry{ZIP}{
name={ZIP},
description={ist ein weit verbreitetes Dateiformat, welches zur Archivierung und Kompression von Dateien und Ordnern verwendet wird. Der Name leitet sich aus dem englischen Wort \enquote{zipper} (Reißverschluss) ab}
}

119
htlDT.sty
View file

@ -29,6 +29,7 @@
\RequirePackage{mdframed}
\RequirePackage{pifont}
\RequirePackage[section]{placeins}
\RequirePackage[edges]{forest}
%\RequirePackage[
% inner=2cm,
@ -84,6 +85,27 @@
tocnumwidth=7em
]{subparagraph}
\definecolor{foldercolor}{RGB}{124,166,198}
\tikzset{pics/folder/.style={code={%
\node[inner sep=0pt, minimum size=#1](-foldericon){};
\node[folder style, inner sep=0pt, minimum width=0.3*#1, minimum height=0.6*#1, above right, xshift=0.05*#1] at (-foldericon.west){};
\node[folder style, inner sep=0pt, minimum size=#1] at (-foldericon.center){};}
},
pics/folder/.default={20pt},
folder style/.style={draw=foldercolor!80!black,top color=foldercolor!40,bottom color=foldercolor}
}
\forestset{is file/.style={edge path'/.expanded={%
([xshift=\forestregister{folder indent}]!u.parent anchor) |- (.child anchor)},
inner sep=1pt},
this folder size/.style={edge path'/.expanded={%
([xshift=\forestregister{folder indent}]!u.parent anchor) |- (.child anchor) pic[solid]{folder=#1}}, inner ysep=0.6*#1},
folder tree indent/.style={before computing xy={l=#1}},
folder icons/.style={folder, this folder size=#1, folder tree indent=3*#1},
folder icons/.default={12pt},
}
% \fig{ref}{descshort}{desclong}{width}{path}
\newcommand*{\fig}[5]{
\begin{figure}[!ht]
@ -154,34 +176,63 @@
}%
\newcommand*{\htlheader}[1]{%
\begin{tabularx}{\textwidth}{| c | Y |}
\hline
\multirow{2}{*}{
\begin{minipage}{0.2\textwidth}
\vspace{1mm}
\includegraphics[width=\textwidth]{logos/htl-2}
\vspace{1mm}
\end{minipage}
} & \Large Blubber\\[2ex]
& Bla\\[1.5ex]
\hline
\end{tabularx}
% \centering%
% \fbox{%
% \begin{minipage}{0.2\textwidth}%
% \raggedright%
% \includegraphics[width=\textwidth]{logos/htl-2}%
% \end{minipage}%
% \hfill\hspace{0.3cm}\vline\hfill%
% \begin{minipage}{0.8\textwidth}%
% \centering%
% \begin{tabular}{c}
% Foo\\
% \hline
% bar\\
% \end{tabular}
% \end{minipage}%
% }%
\ifnum\pdf@strcmp{\unexpanded{#1}}{german}=0 %
\expandafter\@firstoftwo%
\else%
\expandafter\@secondoftwo%
\fi%
{%
{%
\setlength\arrayrulewidth{1.5pt}%
\begin{tabularx}{\textwidth}{| p{0.2\textwidth} | X |}%
\hline%
\multirow{ 2}{*}{%
\begin{minipage}[c][1.5cm]{0.2\textwidth}%
\includegraphics[height=1.4cm]{logos/htl-2}%
\end{minipage}%
}%
&%
\begin{minipage}[c][1.5cm]{\textwidth - 0.22\textwidth}%
\centering%
\textsf{\Large Höhere Technische Bundeslehranstalt Hollabrunn}%
\end{minipage}\\%
\cline{2-2}%
&%
\begin{minipage}[c][0.8cm]{\textwidth - 0.22\textwidth}%
\textsf{Fachrichtung: }%
\centering%
\textsf{Elektronik und Technische Informatik}%
\end{minipage}\\%
\hline%
\end{tabularx}%
}%
}%
{%
{%
\setlength\arrayrulewidth{1.5pt}%
\begin{tabularx}{\textwidth}{| p{0.2\textwidth} | X |}%
\hline%
\multirow{ 2}{*}{%
\begin{minipage}[c][1.5cm]{0.2\textwidth}%
\includegraphics[height=1.4cm]{logos/htl-2}%
\end{minipage}%
}%
&%
\begin{minipage}[c][1.5cm]{\textwidth - 0.22\textwidth}%
\centering%
\textsf{\Large Höhere Technische Bundeslehranstalt Hollabrunn\\ College of Engineering}%
\end{minipage}\\%
\cline{2-2}%
&%
\begin{minipage}[c][0.8cm]{\textwidth - 0.22\textwidth}%
\textsf{Department: }%
\centering%
\textsf{Electronics and computer engineering}%
\end{minipage}\\%
\hline%
\end{tabularx}%
}%
}%
}%
% Listing extension for fancyref using the prefix "lst".
@ -520,15 +571,15 @@
\end{minipage}%
}\\%
\hline%
\begin{minipage}[t][3cm]{5cm}%
\begin{minipage}[t][2.5cm]{5cm}%
\textsf{Aprobation\\(Datum/Unterschrift)}%
\end{minipage}%
&%
\begin{minipage}[t][3cm]{5cm}%
\begin{minipage}[t][2.5cm]{5cm}%
\textsf{\scriptsize Prüfer/Prüferin}%
\end{minipage}%
&%
\begin{minipage}[t][3cm]{5cm}%
\begin{minipage}[t][2.5cm]{5cm}%
\textsf{\scriptsize Direktor/Direktorin\\Abteilungsvorstand/Abteilungsvorständin}%
\end{minipage}\\%
\hline%
@ -663,15 +714,15 @@
\end{minipage}%
}\\%
\hline%
\begin{minipage}[t][3cm]{5cm}%
\begin{minipage}[t][2.5cm]{5cm}%
\textsf{Approval\\(Date/Signature)}%
\end{minipage}%
&%
\begin{minipage}[t][3cm]{5cm}%
\begin{minipage}[t][2.5cm]{5cm}%
\textsf{\scriptsize Examiner/s}%
\end{minipage}%
&%
\begin{minipage}[t][3cm]{5cm}%
\begin{minipage}[t][2.5cm]{5cm}%
\textsf{\scriptsize Head of Department/College}%
\end{minipage}\\%
\hline%

View file

@ -92,4 +92,12 @@
year = "2018",
url = "https://de.wikipedia.org/w/index.php?title=C%2B%2B&oldid=174161963",
note = "[Online; Stand 15. März 2018]"
}
@online{ arm:CMSISPack,
author = "{ARM Limited}",
title = "Pack with Software Components",
year = "2018",
url = "https://www.keil.com/pack/doc/CMSIS/Pack/html/cp_SWComponents.html",
note = "[Online; Stand 15. März 2018]"
}