Merge branch 'main' into dev
This commit is contained in:
commit
71e58c6ea9
|
@ -0,0 +1,47 @@
|
|||
#include "motor.h"
|
||||
#include "pwm.h"
|
||||
|
||||
#include "inc/msp432p401r.h"
|
||||
|
||||
// Initialize GPIO pins for output, which will be
|
||||
// used to control the direction of the motors and
|
||||
// to enable or disable the drivers.
|
||||
// The motors are initially stopped, the drivers
|
||||
// are initially powered down, and the PWM speed
|
||||
// control is uninitialized.
|
||||
void MotorInit(void) {
|
||||
// write this code
|
||||
}
|
||||
|
||||
// Stop the motors, power down the drivers, and
|
||||
// set the PWM speed control to 0% duty cycle.
|
||||
void MotorStop(void) {
|
||||
P2->OUT &= ~0xC0; // off
|
||||
P3->OUT &= ~0xC0; // low current sleep mode
|
||||
SetPWMDutyLeftMotor(0);
|
||||
SetPWMDutyRightMotor(0);
|
||||
}
|
||||
|
||||
// Left and right wheels forward with the given duty cycles.
|
||||
// Duty cycle is 0 to 14,998.
|
||||
void MotorForward(uint16_t left_duty, uint16_t right_duty) {
|
||||
// write this code
|
||||
}
|
||||
|
||||
// Left and right wheels backward with the given duty cycles.
|
||||
// Duty cycle is 0 to 14,998.
|
||||
void MotorBackward(uint16_t left_duty, uint16_t right_duty) {
|
||||
// write this code
|
||||
}
|
||||
|
||||
// Left wheel backward, right wheel forward with the given duty cycles.
|
||||
// Duty cycle is 0 to 14,998.
|
||||
void MotorLeft(uint16_t left_duty, uint16_t right_duty) {
|
||||
// write this code
|
||||
}
|
||||
|
||||
// Left wheel forward, right wheel backward with the given duty cycles.
|
||||
// Duty cycle is 0 to 14,998.
|
||||
void MotorRight(uint16_t left_duty, uint16_t right_duty) {
|
||||
// write this code
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
#ifndef MOTOR_H
|
||||
#define MOTOR_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
void MotorInit(void);
|
||||
void MotorStop(void);
|
||||
void MotorForward(uint16_t left_duty, uint16_t right_duty);
|
||||
void MotorBackward(uint16_t left_duty, uint16_t right_duty);
|
||||
void MotorLeft(uint16_t left_duty, uint16_t right_duty);
|
||||
void MotorRight(uint16_t left_duty, uint16_t right_duty);
|
||||
|
||||
#endif /* MOTOR_H */
|
|
@ -0,0 +1,50 @@
|
|||
#include "pwm.h"
|
||||
|
||||
#include "inc/msp432p401r.h"
|
||||
|
||||
// PWM on P2.4/.5 using TimerA0 TA0.CCR1/2
|
||||
// period is 1.333us (1.333us = 2 * 666.7ns because of up/down)
|
||||
// SMCLK = 48MHz/4 = 12 MHz, 83.33ns
|
||||
// Let Timerclock period T = 8/12MHz = 666.7ns
|
||||
// P2.4/.5 = 1 when timer equals TA0CCR1/2 on way down,
|
||||
// P2.4/.5 = 0 when timer equals TA0CCR1/2 on way up
|
||||
void PWMInitP2_4_P2_5(uint16_t period) {
|
||||
P2->DIR |= 0x30;
|
||||
P2->SEL0 |= 0x30; // Timer0A functions
|
||||
P2->SEL1 &= ~0x30;
|
||||
TIMER_A0->CCR[0] = period;
|
||||
TIMER_A0->EX0 = 0; // Divide by 1
|
||||
TIMER_A0->CCTL[1] = 0x40; // Toggle/reset
|
||||
TIMER_A0->CCTL[2] = 0x40;
|
||||
TIMER_A0->CCR[1] = 0; // Initial duty cycle to 0
|
||||
TIMER_A0->CCR[2] = 0;
|
||||
TIMER_A0->CTL = 0x2F0; // SMCLK = 12MHz, divide by 8, up-down mode
|
||||
}
|
||||
|
||||
void SetPWMDutyP2_4(uint16_t duty) {
|
||||
if (duty >= TIMER_A0->CCR[0]) return;
|
||||
TIMER_A0->CCR[1] = duty;
|
||||
}
|
||||
|
||||
void SetPWMDutyP2_5(uint16_t duty) {
|
||||
if (duty >= TIMER_A0->CCR[0]) return;
|
||||
TIMER_A0->CCR[2] = duty;
|
||||
}
|
||||
|
||||
// PWM on P2.6/.7 using TimerA0 TA0.CCR3/4
|
||||
// SMCLK = 48MHz/4 = 12 MHz, 83.33ns
|
||||
// period is 1.333us
|
||||
// Let Timerclock period T = 8/12MHz = 666.7ns
|
||||
// P2.6/.7 = 1 when timer equals TA0CCR3/4 on way down,
|
||||
// P2.6/.7 = 0 when timer equals TA0CCR3/4 on way up
|
||||
void PWMInitMotor(uint16_t period) {
|
||||
// write this code
|
||||
}
|
||||
|
||||
void SetPWMDutyRightMotor(uint16_t duty) {
|
||||
// write this code
|
||||
}
|
||||
|
||||
void SetPWMDutyLeftMotor(uint16_t duty) {
|
||||
// write this code
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
#ifndef PWM_H
|
||||
#define PWM_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
void PWMInitMotor(uint16_t period);
|
||||
void SetPWMDutyRightMotor(uint16_t duty);
|
||||
void SetPWMDutyLeftMotor(uint16_t duty);
|
||||
|
||||
#endif /* PWM_H */
|
|
@ -0,0 +1,15 @@
|
|||
#include "timer_a1.h"
|
||||
|
||||
#include "inc/msp432p401r.h"
|
||||
|
||||
void (*timer_a1_task)(void); // user function
|
||||
|
||||
// Activate Timer A1 interrupts to run user task periodically
|
||||
// 16 bits period in units (24/SMCLK, with SMCLK 12 MHz -> 2us)
|
||||
void TimerA1Init(void (*task)(void), uint16_t period) {
|
||||
// write this code
|
||||
}
|
||||
|
||||
void TA1_0_IRQHandler(void) {
|
||||
// write this code
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
#ifndef TIMER_A1_H
|
||||
#define TIMER_A1_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
void TimerA1Init(void (*task)(void), uint16_t period);
|
||||
void TimerA1Stop(void);
|
||||
|
||||
#endif /* TIMER_A1_H */
|
|
@ -0,0 +1,77 @@
|
|||
CC = arm-none-eabi-gcc
|
||||
|
||||
# The location of the C compiler
|
||||
# ARMGCC_ROOT is used by some makefiles that need to know where the compiler
|
||||
# is installed.
|
||||
ARMGCC_BIN := ${shell which ${CC}}
|
||||
ifeq (${shell test -h ${ARMGCC_BIN} && echo "true" || echo "false"}, true)
|
||||
ARMGCC_ROOT := ${shell dirname ${shell readlink ${ARMGCC_BIN}}}/..
|
||||
else
|
||||
ARMGCC_ROOT := ${shell dirname ${ARMGCC_BIN}}/..
|
||||
endif
|
||||
|
||||
# Search for source files that are not in this directory
|
||||
VPATH = ../common/
|
||||
|
||||
OBJECTS = main.o timer_a1.o delay.o motor.o pwm.o bump.o cpu.o clock.o system.o startup.o syscalls.o
|
||||
|
||||
NAME = lab
|
||||
|
||||
CFLAGS = -I.. -I../inc -I../common \
|
||||
-D__MSP432P401R__ \
|
||||
-DDeviceFamily_MSP432P401x \
|
||||
-mcpu=cortex-m4 \
|
||||
-march=armv7e-m \
|
||||
-mthumb \
|
||||
-std=c99 \
|
||||
-mfloat-abi=hard \
|
||||
-mfpu=fpv4-sp-d16 \
|
||||
-ffunction-sections \
|
||||
-fdata-sections \
|
||||
-gstrict-dwarf \
|
||||
-Wall \
|
||||
-I$(ARMGCC_ROOT)/arm-none-eabi/include/newlib-nano \
|
||||
-I$(ARMGCC_ROOT)/arm-none-eabi/include
|
||||
|
||||
LFLAGS = -Wl,-T,../config.lds \
|
||||
-Wl,-Map,$(NAME).map \
|
||||
-march=armv7e-m \
|
||||
-mthumb \
|
||||
-mfloat-abi=hard \
|
||||
-mfpu=fpv4-sp-d16 \
|
||||
-static \
|
||||
-Wl,--gc-sections \
|
||||
-lgcc \
|
||||
-lc \
|
||||
-lm \
|
||||
-lnosys \
|
||||
--specs=nano.specs
|
||||
|
||||
all: $(NAME).out
|
||||
@echo "SUCCESS: Compilation completed successfully."
|
||||
|
||||
%.o: %.c
|
||||
@$(CC) $(CFLAGS) -g $< -c -o $@
|
||||
|
||||
cpu.o: ../common/cpu.c
|
||||
@$(CC) $(CFLAGS) $< -c -o $@
|
||||
|
||||
clock.o: ../common/clock.c
|
||||
@$(CC) $(CFLAGS) $< -c -o $@
|
||||
|
||||
system.o: ../system.c
|
||||
@$(CC) $(CFLAGS) $< -c -o $@
|
||||
|
||||
startup.o: ../startup.c
|
||||
@$(CC) $(CFLAGS) $< -c -o $@
|
||||
|
||||
syscalls.o: ../syscalls.c
|
||||
@$(CC) $(CFLAGS) $< -c -o $@
|
||||
|
||||
$(NAME).out: $(OBJECTS)
|
||||
@$(CC) $(OBJECTS) $(LFLAGS) -o $(NAME).out
|
||||
|
||||
clean: # Redirecting both the stderr and stdout to /dev/null
|
||||
@rm -f $(OBJECTS) > /dev/null 2>&1
|
||||
@rm -f $(NAME).out > /dev/null 2>&1
|
||||
@rm -f $(NAME).map > /dev/null 2>&1
|
|
@ -0,0 +1,83 @@
|
|||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "timer_a1.h"
|
||||
#include "pwm.h"
|
||||
#include "motor.h"
|
||||
#include "clock.h"
|
||||
#include "cpu.h"
|
||||
#include "bump.h"
|
||||
#include "delay.h"
|
||||
|
||||
#include "inc/msp432p401r.h"
|
||||
|
||||
// bit-banded addresses, positive logic
|
||||
#define SW2IN ((*((volatile uint8_t *)(0x42098010)))^1)
|
||||
#define SW1IN ((*((volatile uint8_t *)(0x42098004)))^1)
|
||||
|
||||
#define REDLED (*((volatile uint8_t *)(0x42098040)))
|
||||
|
||||
void TimedWaitTouchRelease(uint32_t time) {
|
||||
Delay1ms(time); // run for a while and then stop
|
||||
MotorStop();
|
||||
while (!(SW1IN || SW2IN)) {} // wait for touch
|
||||
while (SW1IN || SW2IN) {} // wait for release
|
||||
}
|
||||
|
||||
void RedLEDInit(void) {
|
||||
P1->SEL0 &= ~0x01;
|
||||
P1->SEL1 &= ~0x01; // 1) configure P1.0 as GPIO
|
||||
P1->DIR |= 0x01; // 2) make P1.0 out
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
void Task(void) {
|
||||
static uint32_t time;
|
||||
++time;
|
||||
REDLED ^= 1;
|
||||
}
|
||||
|
||||
int main_periodic_test(void) {
|
||||
ClockInit48MHz();
|
||||
RedLEDInit();
|
||||
TimerA1Init(&Task, 500); // 1000 Hz
|
||||
CPU_cpsie(); // Enable interrupts
|
||||
while (true) {}
|
||||
}
|
||||
|
||||
int main_motor_test(void) {
|
||||
ClockInit48MHz();
|
||||
SwitchInit();
|
||||
PWMInitMotor(7502); // your function
|
||||
MotorInit(); // your function
|
||||
while (true) {
|
||||
TimedWaitTouchRelease(1000);
|
||||
MotorForward(1500, 1500); // your function
|
||||
TimedWaitTouchRelease(2000);
|
||||
MotorBackward(1500, 1500); // your function
|
||||
TimedWaitTouchRelease(2000);
|
||||
MotorLeft(1200, 1200); // your function
|
||||
TimedWaitTouchRelease(1000);
|
||||
MotorRight(1200, 1200); // your function
|
||||
}
|
||||
}
|
||||
|
||||
// Write a program that uses PWM to move the robot
|
||||
// but uses TimerA1 to periodically check the bump switches,
|
||||
// stopping the robot on collision
|
||||
int main(void) {
|
||||
ClockInit48MHz();
|
||||
// write code here
|
||||
CPU_cpsie(); // Enable interrupts
|
||||
while (true) {
|
||||
// write code here
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue