add projects

This commit is contained in:
2022-01-21 14:53:11 -06:00
parent 39ab045662
commit ca7c76e436
111 changed files with 37834 additions and 0 deletions

28
labW4barnestr/Src/delay.c Normal file
View File

@@ -0,0 +1,28 @@
/*
* delay.c
*
* Created on: Dec 10, 2021
* Author: Trevor Barnes
*/
#include <inttypes.h>
#include "delay.h" //include declaration header file
void delay_1ms(uint32_t n){
// 1ms = 16,000 ticks
for (int i = n ; i > 0 ; i--) {
// Clear value register
*STK_VAL = 0x0000;
// Store 16,000 in STK_LOAD
*STK_LOAD = 16000;
// Enable clock, no prescaler, no interrupt
*STK_CTRL |= CLKSOURCE;
*STK_CTRL |= EN;
// Loop n times: Wait for countflag high
int flag;
do {
flag = ((*STK_CTRL & (1<<16))>>16);
} while (flag != 1);
}
}

147
labW4barnestr/Src/led.c Normal file
View File

@@ -0,0 +1,147 @@
/*
* led.c
*
* Created on: Dec 10, 2021
* Author: Trevor Barnes
*/
#include "led.h"
#include "delay.h"
#include <inttypes.h>
#include <stdio.h>
int ledSpeed = 5;
void led_init(){
// Initialize corresponding RCC and GPIO registers
*RCC_AHB1ENR |= (1<<GPIOBEN);
*GPIOB_MODER &= ~(0x3FFF<<10);
*GPIOB_MODER |= (0x555<<10);
*GPIOB_MODER &= ~(0xFF<<24);
*GPIOB_MODER |= (0x55<<24);
}
void led_allOn(){
// Set all LED Bits
*GPIOB_ODR |= ALL_LEDS;
}
void led_allOff(){
// Reset all LED bits
*GPIOB_ODR &= ~(ALL_LEDS);
}
void led_on(uint8_t ledIndex){
// Set individual LED based on passed in index
switch (ledIndex) {
case 0:
*GPIOB_BSRR = (1<<5);
break;
case 1:
*GPIOB_BSRR = (1<<6);
break;
case 2:
*GPIOB_BSRR = (1<<7);
break;
case 3:
*GPIOB_BSRR = (1<<8);
break;
case 4:
*GPIOB_BSRR = (1<<9);
break;
case 5:
*GPIOB_BSRR = (1<<10);
break;
case 6:
*GPIOB_BSRR = (1<<12);
break;
case 7:
*GPIOB_BSRR = (1<<13);
break;
case 8:
*GPIOB_BSRR = (1<<14);
break;
case 9:
*GPIOB_BSRR = (1<<15);
break;
default:
printf("LED index out of range\n\r");
break;
}
}
void led_off(uint8_t ledIndex){
// Reset individual LED based on passed in index
if (ledIndex < 6) {
*GPIOB_BSRR = (1<<(21+ledIndex));
} else if (ledIndex >= 6) {
// Add pin offset to index
*GPIOB_BSRR = (1<<(22+ledIndex));
} else {
printf("LED index out of range\n\r");
}
}
void led_scan(){
led_allOff();
// Right to left each LED
for (int i = 0; i <= 9 ; i++) {
// Scaled Delay
delay_1ms(50+(ledSpeed*50));
if(i != 0){
led_off(i-1);
}
led_on(i);
}
// Left to right each LED
for (int i = 9; i >= 0; i--) {
if(i != 9){
led_off(i+1);
}
led_on(i);
// Scaled Delay
delay_1ms(50+(ledSpeed*50));
}
led_off(0);
}
void led_flash(){
// Flash LED on and off 10 times at a speed between 0-1 seconds
for (int i = 0; i < 10; i++) {
led_allOn();
delay_1ms(100+(ledSpeed*100));
led_allOff();
delay_1ms(100+(ledSpeed*100));
}
}
void led_setSpeed(uint8_t speed){
ledSpeed = speed;
}
void led_incSpeed(){
if (ledSpeed == 0){
printf("Speed too fast\n\r");
} else {
ledSpeed--;
}
}
void led_decSpeed(){
if (ledSpeed == 9){
printf("Speed too slow\n\r");
} else {
ledSpeed++;
}
}
uint8_t getCurrentSpeed()
{
return ledSpeed;
}

122
labW4barnestr/Src/main.c Normal file
View File

@@ -0,0 +1,122 @@
/*
* main.c
* CE2812
* Created on: January 7, 2022
* Author: Trevor Barnes
* Description: This program allows a user to interact with different memory operations through
* a terminal connected to the serial port. Different operations include: reading memory at a
* given address, writing an in value to a given address, and providing a memory dump of a certain
* byte length at a given memory address.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "uart_driver.h"
#include "led.h"
#include "delay.h"
#define F_CPU 16000000UL
/**
* Reads and prints the memory value at address provided: "addr"
*/
void readMem(uint32_t addr) {
// Assign and casts a new int pointer the value of addr
uint32_t * memPtr = (uint32_t *)addr;
// Formatted print with both hex and decimal values
printf("Memory Value at %#08x\n\r"
"Hex: %#08x\n\r"
"Decimal: %d\n\r", addr, *memPtr, *memPtr);
return;
}
/**
* Writes the provided "data" value as an unsigned 32-bit word at the provided address: "addr"
*/
void writeMem(uint32_t addr, uint32_t data) {
// Assign and casts a new int pointer the value of addr
uint32_t * memPtr = (uint32_t *)addr;
// Write data
*memPtr = data;
// Confirmation printout showing the new value and address
printf("Value written at %#08x: %u \n\r", addr, data);
return;
}
/**
* Prints out formatted, hexadecimal memory values in "byte-sized" chunks starting at the provided
* memory address: "addr". The length of the memory dump is provided by "length".
*/
void dumpMem(uint32_t addr, int length) {
// Set length to default value if length is negative
// (No limit or protection for large, overflow values yet)
if(length <= 0) {
length = 16;
printf("Length set to default! (16)\n\r");
}
// Assign and casts a new int pointer the value of addr
uint8_t * memPtr = (uint8_t *)addr;
// Loop that executes each read and print operation
for(int i=0 ; i < length ; i++) {
// Print newline and memory location every 16 bytes
if((i % 16) == 0) {
printf("\n\r%p:", memPtr);
}
// Print each byte
printf(" %02X", *memPtr);
// Iterate pointer to next byte
memPtr++;
}
printf("\n\r");
return;
}
/**
* Prints a help dialog that provides the user the list of available commands
*/
void printHelp() {
printf("*Commands*\n\r");
printf("'rmw {hex address}' - Reads mem at a given address\n\r");
printf("'wmw {hex address} {value}' - Writes the given value as a word to the given address\n\r");
printf("'dm {hex address} {length}' - Dumps the memory at a given address. Defaults to 16 B if no "
"length is given\n\r");
}
/**
* Main function that handles usart/led initialization and command input/parsing from the user
*/
int main(void) {
init_usart2(57600,F_CPU);
led_init();
char line[50];
char command[10];
uint32_t address;
uint32_t data;
int length;
for(;;) {
// Get command from user
fgets(line, 100, stdin);
// Parse only the command for strcmp
sscanf(line, "%s", command);
if (!strcmp(command, "help")) {
printHelp();
} else if (!strcmp(command,"rmw")) {
// Parse line again with expected format and values
sscanf(line, "%s %X", command, &address);
//printf("Command: %s Address: %x\n\r", command, address);
readMem(address);
} else if (!strcmp(command, "wmw")) {
// Parse line again with expected format and values
sscanf(line, "%s %X %u", command, &address, &data);
//printf("Command: %s Address: %x Data: %u\n\r", command, address, data);
writeMem(address, data);
} else if (!strcmp(command, "dm")) {
// Parse line again with expected format and values
sscanf(line, "%s %X %u", command, &address, &length);
//printf("Command: %s Address: %x Length: %d\n\r", command, address, length);
dumpMem(address, length);
} else {
printf("Invalid input, type 'help' for instructions\n\r");
}
}
}

View File

@@ -0,0 +1,92 @@
/*
* uart_driver.c
*
* Created on: Nov 8, 2016
* Author: barnekow
*/
#include "uart_driver.h"
#include <inttypes.h>
#include <stdio.h>
// These will override _read and _write in syscalls.c, which are
// prototyped as weak
int _read(int file, char *ptr, int len)
{
int DataIdx;
// Modified the for loop in order to get the correct behavior for fgets
int byteCnt = 0;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
//*ptr++ = __io_getchar();
byteCnt++;
//*ptr++ = usart2_getch();
*ptr = usart2_getch();
if(*ptr == '\n') break;
ptr++;
}
//return len;
return byteCnt; // Return byte count
}
int _write(int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
usart2_putch(*ptr++);
}
return len;
}
char usart2_getch(){
char c;
while((*(USART_SR)&(1<<RXNE)) != (1<<RXNE));
c = ((char) *USART_DR); // Read character from usart
usart2_putch(c); // Echo back
if (c == '\r'){ // If character is CR
usart2_putch('\n'); // send it
c = '\n'; // Return LF. fgets is terminated by LF
}
return c;
}
void usart2_putch(char c){
while((*(USART_SR)&(1<<TXE)) != (1<<TXE));
*(USART_DR) = c;
}
void init_usart2(uint32_t baud, uint32_t sysclk){
// Enable clocks for GPIOA and USART2
*(RCC_AHB1ENR) |= (1<<GPIOAEN);
*(RCC_APB1ENR) |= (1<<USART2EN);
// Function 7 of PORTA pins is USART
*(GPIOA_AFRL) &= (0xFFFF00FF); // Clear the bits associated with PA3 and PA2
*(GPIOA_AFRL) |= (0b01110111<<8); // Choose function 7 for both PA3 and PA2
*(GPIOA_MODER) &= (0xFFFFFF0F); // Clear mode bits for PA3 and PA2
*(GPIOA_MODER) |= (0b1010<<4); // Both PA3 and PA2 in alt function mode
// Set up USART2
//USART2_init(); //8n1 no flow control
// over8 = 0..oversample by 16
// M = 0..1 start bit, data size is 8, 1 stop bit
// PCE= 0..Parity check not enabled
// no interrupts... using polling
*(USART_CR1) = (1<<UE)|(1<<TE)|(1<<RE); // Enable UART, Tx and Rx
*(USART_CR2) = 0; // This is the default, but do it anyway
*(USART_CR3) = 0; // This is the default, but do it anyway
*(USART_BRR) = sysclk/baud;
/* I'm not sure if this is needed for standard IO*/
//setvbuf(stderr, NULL, _IONBF, 0);
//setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
}