initial
This commit is contained in:
commit
000f1cf5c5
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
*.uvoptx
|
||||
*.uvprojx
|
||||
*.uvguix.andy_
|
||||
*.scvd
|
100
7Seg Practice/7Seg.c
Executable file
100
7Seg Practice/7Seg.c
Executable file
@ -0,0 +1,100 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
void DelayMs(int s);
|
||||
void initGPIO(void);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
initGPIO();
|
||||
|
||||
int numbers[16] = {
|
||||
0x3F,
|
||||
0x06,
|
||||
0x5B,
|
||||
0x4F,
|
||||
0x66,
|
||||
0x6D,
|
||||
0x7D,
|
||||
0x07,
|
||||
0x7F,
|
||||
0x6F,
|
||||
0x77,
|
||||
0x7C,
|
||||
0x39,
|
||||
0x5E,
|
||||
0x79,
|
||||
0x71
|
||||
};
|
||||
|
||||
int a = 0;
|
||||
GPIOA -> DATA = (numbers[a] << 2) & 0x1C;
|
||||
GPIOC -> DATA = (numbers[a] << 1) & 0xF0;
|
||||
|
||||
bool currSW2state;
|
||||
bool prevSW2state = 0;
|
||||
|
||||
for(;;){
|
||||
|
||||
currSW2state = !(GPIOF -> DATA & 0x01);
|
||||
|
||||
if(currSW2state && !prevSW2state){
|
||||
a++;
|
||||
if(a == 16) a = 0;
|
||||
GPIOA -> DATA = (numbers[a] << 2) & 0x1C;
|
||||
GPIOC -> DATA = (numbers[a] << 1) & 0xF0;
|
||||
}
|
||||
|
||||
if(!(GPIOF -> DATA & 0x10)){
|
||||
a = 0;
|
||||
GPIOA -> DATA = (numbers[a] << 2) & 0x1C;
|
||||
GPIOC -> DATA = (numbers[a] << 1) & 0xF0;
|
||||
}
|
||||
|
||||
prevSW2state = currSW2state;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void initGPIO(){
|
||||
// GPIO Configuration
|
||||
// 1. Enable Clock on Port F (SYSCTL_RCGCGPIO)
|
||||
SYSCTL->RCGCGPIO = 0x2D;
|
||||
// allow time for clock to stabilize (SYSCTL_PRGPIO)
|
||||
while((SYSCTL->PRGPIO & 0x2D) != 0x2D){};
|
||||
// 2. Unlock GIOD[7] and GPIOF[0] on TM4C123G (GPIOn->LOCK and GPIOn->CR)
|
||||
GPIOF->LOCK = 0x4C4F434B;
|
||||
GPIOD->LOCK = 0x4C4F434B;
|
||||
GPIOF->CR |= 0x01;
|
||||
GPIOD->CR |= 0x80;
|
||||
// 3. Clear AMSEL to disable analog
|
||||
//GPIOF->AMSEL = 0x00;
|
||||
//GPIOC->AMSEL = 0x00;
|
||||
//GPIOA->AMSEL = 0x00;
|
||||
//GPIOD->AMSEL = 0x00;
|
||||
// 4. Config PCTL to select GPIO
|
||||
//GPIOF->PCTL = 0x00;
|
||||
//GPIOA->PCTL = 0x00;
|
||||
//GPIOC->PCTL = 0x00;
|
||||
//GPIOD->PCTL = 0x00;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOA->DIR |= 0x1C;
|
||||
GPIOC->DIR |= 0xF0;
|
||||
GPIOD->DIR |= 0x80;
|
||||
GPIOF->DIR = 0x0E; // PF3,PF2,PF1 for Output
|
||||
// 6. Clear AFSEL bits to 0 to select regular I/O
|
||||
//GPIOF->AFSEL = 0x00;
|
||||
//GPIOA->AFSEL = 0x00;
|
||||
//GPIOC->AFSEL = 0x00;
|
||||
//GPIOD->AFSEL = 0x00;
|
||||
// 7. Set PUR bits to 1 to enable internal pull-up resistor
|
||||
GPIOF->PUR = 0x11;
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOA->DEN = 0x1C;
|
||||
GPIOC->DEN |= 0xF0;
|
||||
GPIOD->DEN = 0x80;
|
||||
GPIOF->DEN = 0x1F; // Enable all digital pins on PortF (PF3,PF2,PF1,PF0)
|
||||
}
|
65
FINAL/MyDefines.h
Executable file
65
FINAL/MyDefines.h
Executable file
@ -0,0 +1,65 @@
|
||||
#ifndef __MYDEFINES_H
|
||||
#define __MYDEFINES_H
|
||||
|
||||
#define _PIN0 0x01
|
||||
#define _PIN1 0x02
|
||||
#define _PIN2 0x04
|
||||
#define _PIN3 0x08
|
||||
#define _PIN4 0x10
|
||||
#define _PIN5 0x20
|
||||
#define _PIN6 0x40
|
||||
#define _PIN7 0x80
|
||||
|
||||
#define _PORTA 0x0001
|
||||
#define _PORTB 0x0002
|
||||
#define _PORTC 0x0004
|
||||
#define _PORTD 0x0008
|
||||
#define _PORTE 0x0010
|
||||
#define _PORTF 0x0020
|
||||
|
||||
|
||||
#define _PWM_MODULE0 0x01
|
||||
#define _PWM_MODULE1 0x02
|
||||
|
||||
#define _PWM0 0x01
|
||||
#define _PWM1 0x02
|
||||
#define _PWM2 0x04
|
||||
#define _PWM3 0x08
|
||||
#define _PWM4 0x10
|
||||
#define _PWM5 0x20
|
||||
#define _PWM6 0x40
|
||||
#define _PWM7 0x80
|
||||
|
||||
#define _PWMDIV_2 0x0
|
||||
#define _PWMDIV_4 0x1
|
||||
#define _PWMDIV_8 0x2
|
||||
#define _PWMDIV_16 0x3
|
||||
#define _PWMDIV_32 0x4
|
||||
#define _PWMDIV_64 0x5
|
||||
|
||||
#define _PWM_LEFT_ALIG_CMPAD ((0x02 << 6) | (0x03 << 2))
|
||||
#define _PWM_LEFT_ALIG_CMPBD ((0x02 << 10) | (0x03 << 2))
|
||||
|
||||
#define _PWM_RIGHT_ALIG_CMPAD ((0x03 << 6) | (0x02 << 2))
|
||||
#define _PWM_RIGHT_ALIG_CMPBD ((0x03 << 10) | (0x02 << 2))
|
||||
|
||||
#define _TIMER0 0x01
|
||||
#define _TIMER1 0x02
|
||||
#define _TIMER2 0x04
|
||||
#define _TIMER3 0x08
|
||||
#define _TIMER4 0x10
|
||||
#define _TIMER5 0x20
|
||||
#define _TIMER6 0x40
|
||||
#define _TIMER7 0x80
|
||||
|
||||
#define _TIMERA_ENABLE (1 << 0)
|
||||
#define _TIMERB_ENABLE (1 << 8)
|
||||
#define _TIMERA_COUNTUP (1 << 4)
|
||||
#define _TIMERA_COUNTDOWN (0 << 4)
|
||||
#define _TIMERA_CAPTURE 0x03
|
||||
#define _TIMERA_EDGE_TIME (1 << 2)
|
||||
#define _TIMERA_POSITIVE_EDGE 0
|
||||
#define _TIMERA_NEGATIVE_EDGE (1 << 2)
|
||||
#define _TIMERA_BOTH_EDGES (3 << 2)
|
||||
|
||||
#endif
|
112
FINAL/main.c
Executable file
112
FINAL/main.c
Executable file
@ -0,0 +1,112 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <TM4C123GH6PM.h>
|
||||
//#include <TM4C1294NCPDT.h"
|
||||
#include "MyDefines.h" // Your Definitions Header File
|
||||
#include "ez123G.h"
|
||||
//#include "ez1294.h"
|
||||
|
||||
void Setup_PWM(void);
|
||||
void Setup_GPIO(void);
|
||||
|
||||
typedef enum STATES{
|
||||
S_IDLE,
|
||||
S_0,
|
||||
S_1,
|
||||
S_2,
|
||||
S_3,
|
||||
} STATES;
|
||||
|
||||
|
||||
// Golbal Variables
|
||||
uint32_t *pSw1 = (uint32_t *)(((char*)GPIOD) +(_PIN6 << 2)); // GPIO pin for SW1
|
||||
uint32_t *pSw2 = (uint32_t *)(((char*)GPIOF) +(_PIN0 << 2)); // GPIO pin for SW2
|
||||
uint32_t *pLed1 = (uint32_t *)(((char*)GPIOF) +(_PIN1 << 2)); // GPIO pin for LED1
|
||||
uint32_t *pLed2 = (uint32_t *)(((char*)GPIOF) +(_PIN3 << 2)); // GPIO pin for LED2
|
||||
|
||||
int main()
|
||||
{
|
||||
// Local Variables
|
||||
uint16_t cmp_1_0m = _____; // CMP value for Pulse Width 1 ms
|
||||
uint16_t cmp_1_5m = _____; // CMP value for Pulse Width 1.5 ms
|
||||
uint16_t cmp_2_0m = _____; // CMP value for Pulse Width 2 ms
|
||||
uint16_t i = 0;
|
||||
bool currSw1, preSw1 = _____;
|
||||
bool currSw2, preSw2 = _____;
|
||||
bool SW1, SW2;
|
||||
STATES state = S_IDLE;
|
||||
|
||||
Setup_123G_40MHz();
|
||||
//Setup_1294_60MHz();
|
||||
|
||||
Setup_PWM();
|
||||
Setup_GPIO();
|
||||
|
||||
while (1) {
|
||||
SW1 = SW2 = false;
|
||||
// Read current switches
|
||||
|
||||
|
||||
|
||||
if ( && ){ // Detect the edge for Sw1
|
||||
SW1 = true;
|
||||
}
|
||||
|
||||
if ( && ){ // Detect the edge for Sw2
|
||||
SW2 = true;
|
||||
}
|
||||
preSw1 = currSw1; // Update current state to previous state
|
||||
preSw2 = currSw2; // Update current state to previous state
|
||||
|
||||
switch (state){ // Changed the state based on SW1 and SW2
|
||||
case S_IDLE:
|
||||
|
||||
|
||||
break;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
i++;
|
||||
timer_waitMillis(100); // This is the only delay function in the code.
|
||||
}
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
void Setup_PWM(void)
|
||||
{
|
||||
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
void Setup_GPIO(void)
|
||||
{
|
||||
// Config for GPIO
|
||||
// 1. Enable Clock on GPIOF
|
||||
SYSCTL->RCGCGPIO = _PORTC|_PORTD|_PORTF;
|
||||
// allow time for clock to stabilize
|
||||
while((SYSCTL->PRGPIO & (_PORTC|_PORTD|_PORTF)) != (_PORTC|_PORTD|_PORTF)){};
|
||||
|
||||
// 2. Unlock GPIO
|
||||
GPIOF->LOCK = 0x4C4F434B;
|
||||
GPIOF->CR |= 0x01;
|
||||
// 3. Clear AMSEL to disable analog
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOC->PCTL= 0x000000;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOC -> DIR |= _PIN5;
|
||||
GPIOD -> DIR = 0x0;
|
||||
GPIOF -> DIR = _PIN0|_PIN1|_PIN3;
|
||||
// 6. Enable AFSEL bits to 1
|
||||
GPIOC -> AFSEL |= _PIN5;
|
||||
// 7. Set PUE bits to 1 to enable internal pull-up
|
||||
GPIOD -> PDR= _PIN6;
|
||||
GPIOF -> PUR= _PIN0;
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOF->DEN= _PIN1 | _PIN4 | _PIN2;
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
65
FINALFINAL/MyDefines.h
Executable file
65
FINALFINAL/MyDefines.h
Executable file
@ -0,0 +1,65 @@
|
||||
#ifndef __MYDEFINES_H
|
||||
#define __MYDEFINES_H
|
||||
|
||||
#define _PIN0 0x01
|
||||
#define _PIN1 0x02
|
||||
#define _PIN2 0x04
|
||||
#define _PIN3 0x08
|
||||
#define _PIN4 0x10
|
||||
#define _PIN5 0x20
|
||||
#define _PIN6 0x40
|
||||
#define _PIN7 0x80
|
||||
|
||||
#define _PORTA 0x0001
|
||||
#define _PORTB 0x0002
|
||||
#define _PORTC 0x0004
|
||||
#define _PORTD 0x0008
|
||||
#define _PORTE 0x0010
|
||||
#define _PORTF 0x0020
|
||||
|
||||
|
||||
#define _PWM_MODULE0 0x01
|
||||
#define _PWM_MODULE1 0x02
|
||||
|
||||
#define _PWM0 0x01
|
||||
#define _PWM1 0x02
|
||||
#define _PWM2 0x04
|
||||
#define _PWM3 0x08
|
||||
#define _PWM4 0x10
|
||||
#define _PWM5 0x20
|
||||
#define _PWM6 0x40
|
||||
#define _PWM7 0x80
|
||||
|
||||
#define _PWMDIV_2 0x0
|
||||
#define _PWMDIV_4 0x1
|
||||
#define _PWMDIV_8 0x2
|
||||
#define _PWMDIV_16 0x3
|
||||
#define _PWMDIV_32 0x4
|
||||
#define _PWMDIV_64 0x5
|
||||
|
||||
#define _PWM_LEFT_ALIG_CMPAD ((0x02 << 6) | (0x03 << 2))
|
||||
#define _PWM_LEFT_ALIG_CMPBD ((0x02 << 10) | (0x03 << 2))
|
||||
|
||||
#define _PWM_RIGHT_ALIG_CMPAD ((0x03 << 6) | (0x02 << 2))
|
||||
#define _PWM_RIGHT_ALIG_CMPBD ((0x03 << 10) | (0x02 << 2))
|
||||
|
||||
#define _TIMER0 0x01
|
||||
#define _TIMER1 0x02
|
||||
#define _TIMER2 0x04
|
||||
#define _TIMER3 0x08
|
||||
#define _TIMER4 0x10
|
||||
#define _TIMER5 0x20
|
||||
#define _TIMER6 0x40
|
||||
#define _TIMER7 0x80
|
||||
|
||||
#define _TIMERA_ENABLE (1 << 0)
|
||||
#define _TIMERB_ENABLE (1 << 8)
|
||||
#define _TIMERA_COUNTUP (1 << 4)
|
||||
#define _TIMERA_COUNTDOWN (0 << 4)
|
||||
#define _TIMERA_CAPTURE 0x03
|
||||
#define _TIMERA_EDGE_TIME (1 << 2)
|
||||
#define _TIMERA_POSITIVE_EDGE 0
|
||||
#define _TIMERA_NEGATIVE_EDGE (1 << 2)
|
||||
#define _TIMERA_BOTH_EDGES (3 << 2)
|
||||
|
||||
#endif
|
172
FINALFINAL/main.c
Executable file
172
FINALFINAL/main.c
Executable file
@ -0,0 +1,172 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <TM4C123GH6PM.h>
|
||||
//#include <TM4C1294NCPDT.h"
|
||||
#include "MyDefines.h" // Your Definitions Header File
|
||||
#include "ez123G.h"
|
||||
//#include "ez1294.h"
|
||||
|
||||
void Setup_PWM(void);
|
||||
void Setup_GPIO(void);
|
||||
|
||||
typedef enum STATES{
|
||||
S_IDLE,
|
||||
S_0,
|
||||
S_1,
|
||||
S_2,
|
||||
} STATES;
|
||||
|
||||
|
||||
// Golbal Variables
|
||||
uint32_t *pSw1 = (uint32_t *)(((char*)GPIOD) +(_PIN6 << 2)); // GPIO pin for SW1
|
||||
uint32_t *pSw2 = (uint32_t *)(((char*)GPIOF) +(_PIN0 << 2)); // GPIO pin for SW2
|
||||
uint32_t *pLed1 = (uint32_t *)(((char*)GPIOF) +(_PIN1 << 2)); // GPIO pin for LED1
|
||||
uint32_t *pLed2 = (uint32_t *)(((char*)GPIOF) +(_PIN3 << 2)); // GPIO pin for LED2
|
||||
|
||||
int main()
|
||||
{
|
||||
// Local Variables
|
||||
uint16_t cmp_1_0m = 23750; // CMP value for Pulse Width 1 ms
|
||||
uint16_t cmp_1_5m = 23125; // CMP value for Pulse Width 1.5 ms
|
||||
uint16_t cmp_2_0m = 22500; // CMP value for Pulse Width 2 ms
|
||||
uint16_t i = 0;
|
||||
bool currSw1, preSw1 = 0;
|
||||
bool currSw2, preSw2 = 1;
|
||||
bool SW1, SW2;
|
||||
STATES state = S_IDLE;
|
||||
|
||||
Setup_123G_40MHz();
|
||||
//Setup_1294_60MHz();
|
||||
|
||||
Setup_PWM();
|
||||
Setup_GPIO();
|
||||
|
||||
while (1) {
|
||||
SW1 = SW2 = false;
|
||||
// Read current switches
|
||||
if(*pSw1) currSw1 = 1;
|
||||
else currSw1 = 0;
|
||||
if(!(*pSw2)) currSw2 = 1;
|
||||
else currSw2 = 0;
|
||||
|
||||
|
||||
if (currSw1 && !preSw1){ // Detect the edge for Sw1
|
||||
SW1 = true;
|
||||
}
|
||||
|
||||
if (currSw2 && !preSw2){ // Detect the edge for Sw2
|
||||
SW2 = true;
|
||||
}
|
||||
preSw1 = currSw1; // Update current state to previous state
|
||||
preSw2 = currSw2; // Update current state to previous state
|
||||
|
||||
switch (state){ // Changed the state based on SW1 and SW2
|
||||
case S_IDLE:
|
||||
PWM0->_3_CMPB = cmp_1_0m;
|
||||
if(SW1) state = S_0;
|
||||
if(SW2) state = S_IDLE;
|
||||
|
||||
*pLed1 = 0x0;
|
||||
*pLed2 = 0x0;
|
||||
|
||||
break;
|
||||
case S_0:
|
||||
PWM0->_3_CMPB = cmp_1_0m;
|
||||
if(SW1) state = S_1;
|
||||
if(SW2) state = S_2;
|
||||
*pLed2 = 0x0;
|
||||
|
||||
if(i%2 == 0){ //200ms delay
|
||||
//blink led1
|
||||
if(!(*pLed1 & _PIN1)) *pLed1 = 0xFF;
|
||||
else *pLed1 = 0x00;
|
||||
}
|
||||
|
||||
break;
|
||||
case S_1:
|
||||
PWM0->_3_CMPB = cmp_1_5m;
|
||||
if(SW1) state = S_2;
|
||||
if(SW2) state = S_IDLE;
|
||||
|
||||
if(i%2 == 0){ //200ms delay
|
||||
//blink led1 and led2
|
||||
if(!(*pLed1 & _PIN1)) *pLed1 = 0xFF;
|
||||
else *pLed1 = 0x00;
|
||||
if(!(*pLed2 & _PIN3)) *pLed2 = 0xFF;
|
||||
else *pLed2 = 0x00;
|
||||
}
|
||||
|
||||
break;
|
||||
case S_2:
|
||||
PWM0->_3_CMPB = cmp_2_0m;
|
||||
if(SW1) state = S_IDLE;
|
||||
if(SW2) state = S_0;
|
||||
*pLed1 = 0x0;
|
||||
|
||||
if(i%2 == 0){ //200ms delay
|
||||
//blink led2
|
||||
if(!(*pLed2 & _PIN3)) *pLed2 = 0xFF;
|
||||
else *pLed2 = 0x00;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
timer_waitMillis(100); // This is the only delay function in the code.
|
||||
}
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
void Setup_PWM(void)
|
||||
{
|
||||
// 1. Enable Clock for PWM Module 1
|
||||
SYSCTL->RCGCPWM |= _PWM_MODULE0;
|
||||
while((SYSCTL->PRPWM & _PWM_MODULE0)==0){};
|
||||
// 2. Enable and Setup Clock Divider for PWM
|
||||
SYSCTL->RCC |= (1 << 20); // RCC[20]=1:USEPWMDIV
|
||||
SYSCTL->RCC &= ~0x000E0000; // RCC[19:17]=000 PWMDIV
|
||||
SYSCTL->RCC |= (_PWMDIV_32 << 17); // RCC[19:17]=0x04 divider=/32
|
||||
// 3. Disable PWM Generator 2
|
||||
PWM0->_3_CTL &= ~0x01; // Disable PWM Generator 2
|
||||
// 4. Config LOAD, CMPn, GENn values
|
||||
PWM0->_3_LOAD = 25000; // GEN 3 B PWM 7 PF3 MOTOR
|
||||
PWM0->_3_CMPB = 23750;
|
||||
PWM0->_3_GENB = _PWM_LEFT_ALIG_CMPBD;//0x080C
|
||||
// 5. Enable PWM Generator 3
|
||||
PWM0->_3_CTL |= 0x01;
|
||||
// 6. Enable PWM7 Output
|
||||
PWM0 -> ENABLE |= _PWM7;
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
void Setup_GPIO(void)
|
||||
{
|
||||
// Config for GPIO
|
||||
// 1. Enable Clock on GPIOF
|
||||
SYSCTL->RCGCGPIO = _PORTC|_PORTD|_PORTF;
|
||||
// allow time for clock to stabilize
|
||||
while((SYSCTL->PRGPIO & (_PORTC|_PORTD|_PORTF)) != (_PORTC|_PORTD|_PORTF)){};
|
||||
// 2. Unlock GPIO
|
||||
GPIOF->LOCK = 0x4C4F434B;
|
||||
GPIOF->CR |= 0x01;
|
||||
// 3. Clear AMSEL to disable analog
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOC->PCTL |= 0x400000; //M0PWM7 GEN3
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOC -> DIR |= _PIN5;
|
||||
GPIOD -> DIR = 0x0;
|
||||
GPIOF -> DIR |= _PIN1|_PIN3;
|
||||
// 6. Enable AFSEL bits to 1
|
||||
GPIOC -> AFSEL |= _PIN5;
|
||||
GPIOD -> AFSEL = 0x0;
|
||||
GPIOF -> AFSEL = 0x0;
|
||||
// 7. Set PUE bits to 1 to enable internal pull-up
|
||||
GPIOD -> PDR |= _PIN6;
|
||||
GPIOF -> PUR |= _PIN0;
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOC->DEN |= _PIN5;
|
||||
GPIOD->DEN |= _PIN6;
|
||||
GPIOF->DEN |= _PIN0 | _PIN1 | _PIN3;
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
39
HelloWorld/apples.c
Executable file
39
HelloWorld/apples.c
Executable file
@ -0,0 +1,39 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
void DelayMs(int s);
|
||||
void Delay(int t);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
|
||||
// GPIO Configuration
|
||||
// 1. Enable Clock on GPIOF[3:1] (SYSCTL_RCGCGPIO)
|
||||
SYSCTL->RCGCGPIO = 0x20;
|
||||
// allow time for clock to stabilize (SYSCTL_PRGPIO)
|
||||
while((SYSCTL->PRGPIO & 0x20) != 0x20){};
|
||||
// 2. Unlock GPIOC[3:0], GIOD[7] and GPIOF[0] on TM4C123G (GPIOn->LOCK and GPIOn->CR) NOT USING
|
||||
// 3. Clear AMSEL to disable analog
|
||||
GPIOF->AMSEL = 0x00;
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOF->PCTL = 0x0000;
|
||||
//or
|
||||
//GPIOF->PCTL &= 0xFFF00FFF;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOF->DIR = 0x08; // PF3,PF2,PF1 for Output
|
||||
// 6. Enable AFSEL bits to 1
|
||||
GPIOF->AFSEL = 0x00;
|
||||
// 7. Set PUR bits to 1 to enable internal pull-up
|
||||
GPIOF->PUR = 0x10;
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOF->DEN = 0x0E; // Enable digital pin on PF3,PF2,PF1
|
||||
|
||||
int sample = GPIOF -> DATA;
|
||||
sample |= 0x0E;
|
||||
//sample |= 0x08;
|
||||
GPIOF->DATA = sample;
|
||||
|
||||
}
|
43
ISR/MyDefines.h
Executable file
43
ISR/MyDefines.h
Executable file
@ -0,0 +1,43 @@
|
||||
#ifndef __MYDEFINES_H
|
||||
#define __MYDEFINES_H
|
||||
|
||||
#define _PIN0 0x01
|
||||
#define _PIN1 0x02
|
||||
#define _PIN2 0x04
|
||||
#define _PIN3 0x08
|
||||
#define _PIN4 0x10
|
||||
#define _PIN5 0x20
|
||||
#define _PIN6 0x40
|
||||
#define _PIN7 0x80
|
||||
|
||||
#define _PORTA 0x0001
|
||||
#define _PORTB 0x0002
|
||||
#define _PORTC 0x0004
|
||||
#define _PORTD 0x0008
|
||||
#define _PORTE 0x0010
|
||||
#define _PORTF 0x0020
|
||||
|
||||
|
||||
#define _PWM_MODULE0 0x01
|
||||
#define _PWM_MODULE1 0x02
|
||||
|
||||
#define _PWM0 0x01
|
||||
#define _PWM1 0x02
|
||||
#define _PWM2 0x04
|
||||
#define _PWM3 0x08
|
||||
#define _PWM4 0x10
|
||||
#define _PWM5 0x20
|
||||
#define _PWM6 0x40
|
||||
#define _PWM7 0x80
|
||||
|
||||
#define _PWMDIV_2 0x0
|
||||
#define _PWMDIV_4 0x1
|
||||
#define _PWMDIV_8 0x2
|
||||
#define _PWMDIV_16 0x3
|
||||
#define _PWMDIV_32 0x4
|
||||
#define _PWMDIV_64 0x5
|
||||
|
||||
#define _PWM_LEFT_ALIG_CMPAD ((0x02 << 6) | (0x03 << 2))
|
||||
#define _PWM_LEFT_ALIG_CMPBD ((0x02 << 10) | (0x03 << 2))
|
||||
|
||||
#endif
|
74
ISR/main.c
Executable file
74
ISR/main.c
Executable file
@ -0,0 +1,74 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "MyDefines.h"
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
|
||||
void SetupGPIO(void);
|
||||
void SetupGPIOIRQ(void);
|
||||
void GPIOF_Handler(void);
|
||||
|
||||
int main()
|
||||
{
|
||||
SetupGPIO();
|
||||
SetupGPIOIRQ();
|
||||
|
||||
while(1){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void SetupGPIO(void){
|
||||
|
||||
// Config for GPIO
|
||||
// 1. Enable Clock on GPIOF
|
||||
SYSCTL->RCGCGPIO = _PORTF;
|
||||
// allow time for clock to stabilize
|
||||
while((SYSCTL->PRGPIO & _PORTF) != _PORTF){};
|
||||
// 2. Unlock GPIO
|
||||
// 3. Clear AMSEL to disable analog
|
||||
GPIOF -> AMSEL = 0x0;
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOF -> PCTL = 0x0;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOF -> DIR = _PIN1;
|
||||
// 6. Enable AFSEL bits to 1
|
||||
GPIOF -> AFSEL = 0x0;
|
||||
// 7. Set PUE bits to 1 to enable internal pull-up
|
||||
GPIOF -> PUR = _PIN4;
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOF -> DEN = _PIN4|_PIN1;
|
||||
}
|
||||
|
||||
void SetupGPIOIRQ()
|
||||
{
|
||||
uint32_t n, r, m, r2;
|
||||
// 1. Disable IRQ in GPIOIM register
|
||||
GPIOF->IM &= ~(_PIN4);
|
||||
// 2. Configure IRQ Type (0=edge, 1=level) in the GPIOIS register
|
||||
GPIOF->IS &= ~(_PIN4);
|
||||
// 3. Configure GPIOIBE (0=single edge, 1=both edge),
|
||||
// GPIOIEV (0=low level or falling edge, 1=high level or rising edge)
|
||||
GPIOF->IBE &= ~(_PIN4);
|
||||
GPIOF->IEV &= ~(_PIN4);
|
||||
// 4. Clear the GPIORIS register
|
||||
GPIOF->ICR |= _PIN4;
|
||||
// 5. Enable IRQ in the GPIOIM register
|
||||
GPIOF->IM |= _PIN4;
|
||||
// 6. Set priority in the NVIC
|
||||
n = 30 / 4;
|
||||
r = 21; // remainder:0 -> r = 5, :1-> r=13, :2-> r=21, :3-> r=29
|
||||
m = 30 / 32; r2 = 30 % 32;
|
||||
NVIC->IP[n] |= (3 << r);
|
||||
// 7. Enable IRQ in the NVIC
|
||||
NVIC->ISER[m] |= (1 << r2);
|
||||
}
|
||||
|
||||
uint32_t* pn1 = (uint32_t*)(((char*)GPIOF) + (_PIN1 << 2));
|
||||
void GPIOF_Handler(){
|
||||
GPIOF->ICR |= _PIN4; //clear interrupt flag
|
||||
*pn1 ^= _PIN1;
|
||||
|
||||
}
|
188
KeyPadSave.txt
Executable file
188
KeyPadSave.txt
Executable file
@ -0,0 +1,188 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
#include "ez123G.h"
|
||||
#include "MyDefines.h"
|
||||
|
||||
char str[100];
|
||||
char ReadKeyPad2();
|
||||
char ReadKeyPad1();
|
||||
char ReadKeyPad();
|
||||
|
||||
int main(void)
|
||||
{
|
||||
PEZOBJ_LCD lcd;
|
||||
uint16_t i = 0;
|
||||
|
||||
// GPIO Initialization and Configuration
|
||||
// 1. Enable Clock on GPIOs
|
||||
SYSCTL->RCGCGPIO |= 0x1B;
|
||||
// allow time for clock to stabilize
|
||||
while ((SYSCTL->PRGPIO & 0x1B) != 0x1B) {};
|
||||
// 2. Unlock PD7 and/or PF0 for TM4C 123G
|
||||
// 3. Config AMSEL to disable analog function
|
||||
// 4. Config PCTL to select 0-GPIO
|
||||
// 5. Set AFSEL bits to 0
|
||||
// 6. Set DIR to 0 for input, 1 for output
|
||||
|
||||
GPIOA -> DIR = 0x00;
|
||||
GPIOB -> DIR = 0x03;
|
||||
GPIOD -> DIR = 0x0F;
|
||||
GPIOE -> DIR = 0x3E;
|
||||
|
||||
// 7. Set PUR/PDR/ODR bits to 1 to enable internal pull-up/-down resistir and/or open-drain
|
||||
GPIOB -> ODR = 0x03;
|
||||
GPIOE -> ODR = 0x30;
|
||||
GPIOA -> PUR = 0xE0;
|
||||
GPIOB -> PUR = 0x10;
|
||||
|
||||
// 8. Set DEN bits to 1 to enable all
|
||||
GPIOA -> DEN = 0xE0;
|
||||
GPIOB -> DEN = 0x13;
|
||||
GPIOD -> DEN = 0x0F;
|
||||
GPIOE -> DEN = 0x3E;
|
||||
|
||||
|
||||
lcd = ezLCD_Create();
|
||||
ezLCD_Connect_DataPort(lcd, GPIOD, PIN_3_0);
|
||||
ezLCD_Connect_ENPin(lcd, GPIOE, PIN1);
|
||||
ezLCD_Connect_RSPin(lcd, GPIOE, PIN2);
|
||||
ezLCD_Connect_RWPin(lcd, GPIOE, PIN3);
|
||||
|
||||
ezLCD_Start(lcd);
|
||||
ezLCD_ClearDisplay(lcd);
|
||||
|
||||
char ch;
|
||||
while(1){
|
||||
ch = ReadKeyPad();
|
||||
|
||||
if (ch == '*'){
|
||||
i *= 100;
|
||||
ezLCD_ClearDisplay(lcd);
|
||||
}
|
||||
if (ch == '#') i = 0;
|
||||
if (ch >='0' && ch <= '9') i = i*10 + ch - '0';
|
||||
|
||||
sprintf(str, "%c ", ch);
|
||||
ezLCD_Position(lcd, 0, 0);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
|
||||
timer_waitMillis(100);
|
||||
}
|
||||
}
|
||||
//--------------------------------------------------------------
|
||||
char KeyPad[4][4]={
|
||||
{'1','2','3','A'},
|
||||
{'4','5','6','B'},
|
||||
{'7','8','9','C'},
|
||||
{'*','0','#','D'}};
|
||||
|
||||
char ReadKeyPad1()
|
||||
{
|
||||
|
||||
GPIOB -> DATA |= 0x03;
|
||||
GPIOE -> DATA |= 0x30;
|
||||
//GPIOB -> DATA |= 0x01;
|
||||
GPIOB -> DATA &= ~0x02;
|
||||
//GPIOE -> DATA |= 0x10;
|
||||
//GPIOE -> DATA &= ~0x20;
|
||||
|
||||
timer_waitMillis(10);
|
||||
|
||||
if(!(GPIOB -> DATA & 0x10)) return KeyPad[1][0];
|
||||
if(!(GPIOA -> DATA & 0x20)) return KeyPad[1][1];
|
||||
if(!(GPIOA -> DATA & 0x40)) return KeyPad[1][2];
|
||||
if(!(GPIOA -> DATA & 0x80)) return KeyPad[1][3];
|
||||
|
||||
return 0x0;
|
||||
}
|
||||
|
||||
char ReadKeyPad2()
|
||||
{
|
||||
int row;
|
||||
GPIOB -> DATA |= 0x03;
|
||||
GPIOE -> DATA |= 0x30;
|
||||
for(row = 0; row < 4; row++){
|
||||
switch(row){
|
||||
case 0:
|
||||
GPIOB -> DATA &= ~0x01;
|
||||
timer_waitMillis(10);
|
||||
if(!(GPIOB -> DATA & 0x10)) return KeyPad[0][0];
|
||||
if(!(GPIOA -> DATA & 0x20)) return KeyPad[0][1];
|
||||
if(!(GPIOA -> DATA & 0x40)) return KeyPad[0][2];
|
||||
if(!(GPIOA -> DATA & 0x80)) return KeyPad[0][3];
|
||||
break;
|
||||
case 1:
|
||||
GPIOB -> DATA |= 0x01;
|
||||
GPIOB -> DATA &= ~0x02;
|
||||
timer_waitMillis(10);
|
||||
if(!(GPIOB -> DATA & 0x10)) return KeyPad[1][0];
|
||||
if(!(GPIOA -> DATA & 0x20)) return KeyPad[1][1];
|
||||
if(!(GPIOA -> DATA & 0x40)) return KeyPad[1][2];
|
||||
if(!(GPIOA -> DATA & 0x80)) return KeyPad[1][3];
|
||||
break;
|
||||
case 2:
|
||||
GPIOB -> DATA |= 0x02;
|
||||
GPIOE -> DATA &= ~0x10;
|
||||
timer_waitMillis(10);
|
||||
if(!(GPIOB -> DATA & 0x10)) return KeyPad[2][0];
|
||||
if(!(GPIOA -> DATA & 0x20)) return KeyPad[2][1];
|
||||
if(!(GPIOA -> DATA & 0x40)) return KeyPad[2][2];
|
||||
if(!(GPIOA -> DATA & 0x80)) return KeyPad[2][3];
|
||||
break;
|
||||
case 3:
|
||||
GPIOE -> DATA |= 0x10;
|
||||
GPIOE -> DATA &= ~0x20;
|
||||
timer_waitMillis(10);
|
||||
if(!(GPIOB -> DATA & 0x10)) return KeyPad[3][0];
|
||||
if(!(GPIOA -> DATA & 0x20)) return KeyPad[3][1];
|
||||
if(!(GPIOA -> DATA & 0x40)) return KeyPad[3][2];
|
||||
if(!(GPIOA -> DATA & 0x80)) return KeyPad[3][3];
|
||||
break;
|
||||
}
|
||||
|
||||
row++;
|
||||
}
|
||||
|
||||
return 0x0;
|
||||
}
|
||||
|
||||
char ReadKeyPad()
|
||||
{
|
||||
int row;
|
||||
GPIOB -> DATA |= 0x03;
|
||||
GPIOE -> DATA |= 0x30;
|
||||
for(row = 0; row < 4; row++){
|
||||
switch(row){
|
||||
case 0:
|
||||
GPIOB -> DATA &= ~0x01;
|
||||
break;
|
||||
case 1:
|
||||
GPIOB -> DATA |= 0x01;
|
||||
GPIOB -> DATA &= ~0x02;
|
||||
break;
|
||||
case 2:
|
||||
GPIOB -> DATA |= 0x02;
|
||||
GPIOE -> DATA &= ~0x10;
|
||||
break;
|
||||
case 3:
|
||||
GPIOE -> DATA |= 0x10;
|
||||
GPIOE -> DATA &= ~0x20;
|
||||
break;
|
||||
}
|
||||
|
||||
timer_waitMillis(10);
|
||||
|
||||
if(!(GPIOB -> DATA & 0x10)) return KeyPad[row][0];
|
||||
if(!(GPIOA -> DATA & 0x20)) return KeyPad[row][1];
|
||||
if(!(GPIOA -> DATA & 0x40)) return KeyPad[row][2];
|
||||
if(!(GPIOA -> DATA & 0x80)) return KeyPad[row][3];
|
||||
|
||||
row++;
|
||||
}
|
||||
|
||||
return 0x0;
|
||||
}
|
82
LCD Display/LCDLab.c
Executable file
82
LCD Display/LCDLab.c
Executable file
@ -0,0 +1,82 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
#include "ez123G.h"
|
||||
|
||||
char str[100];
|
||||
|
||||
int main(void)
|
||||
{
|
||||
PEZOBJ_LCD lcd;
|
||||
uint16_t i = 0;
|
||||
int array[]= {10, 35, 65, 43, 32, 86, 44, 9, 18};
|
||||
|
||||
// Enable GPIOD[3:0] and GPIOE[3:1]
|
||||
// Config for GPIOD and GPIOE
|
||||
// 1. Enable Clock on GPIOs
|
||||
SYSCTL->RCGCGPIO |= 0x18;
|
||||
// allow time for clock to stabilize
|
||||
while ((SYSCTL->PRGPIO & 0x18) != 0x18) {};
|
||||
// 2. Unlock PD7
|
||||
GPIOD->LOCK = 0x4C4F434B;
|
||||
GPIOD->CR |= 0x80;
|
||||
|
||||
// 3. Config AMSEL to disable analog function
|
||||
GPIOD -> AMSEL = 0x00;
|
||||
GPIOE -> AMSEL = 0x00;
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOD -> PCTL = 0x00;
|
||||
GPIOE -> PCTL = 0x00;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOD -> DIR |= 0x0F;
|
||||
GPIOE -> DIR |= 0x0E;
|
||||
|
||||
// 6. Set AFSEL bits to 0
|
||||
GPIOD -> AFSEL = 0x00;
|
||||
GPIOE -> AFSEL = 0x00;
|
||||
// 7. Set PUE bits to 1 to enable internal pull-up (Skipped)
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOD -> DEN |= 0x0F;
|
||||
GPIOE -> DEN |= 0x0E;
|
||||
|
||||
|
||||
lcd = ezLCD_Create();
|
||||
ezLCD_Connect_DataPort(lcd, GPIOD, PIN_3_0);
|
||||
ezLCD_Connect_ENPin(lcd, GPIOE, PIN1);
|
||||
ezLCD_Connect_RSPin(lcd, GPIOE, PIN2);
|
||||
ezLCD_Connect_RWPin(lcd, GPIOE, PIN3);
|
||||
|
||||
ezLCD_Start(lcd);
|
||||
ezLCD_LoadVerticalBargraphFonts(lcd);
|
||||
|
||||
ezLCD_ClearDisplay(lcd);
|
||||
|
||||
int j = 0;
|
||||
float a;
|
||||
int s = 0, M = array[0], m = array[0];
|
||||
int total = 0;
|
||||
while(j <= 8){
|
||||
ezLCD_ClearDisplay(lcd);
|
||||
s += array[j];
|
||||
if(array[j] > M) M = array[j];
|
||||
if(array[j] < m) m = array[j];
|
||||
a = s / (j + 1);
|
||||
ezLCD_Position(lcd, 0, 0);
|
||||
sprintf(str, "S=%d", s);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
ezLCD_Position(lcd, 0, 8);
|
||||
sprintf(str, "M=%d", M);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
ezLCD_Position(lcd, 1, 0);
|
||||
sprintf(str, "A=%.2f", a);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
ezLCD_Position(lcd, 1, 8);
|
||||
sprintf(str, "m=%d", m);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
timer_waitMillis(500);
|
||||
j++;
|
||||
}
|
||||
}
|
68
LEDButton/ledbutton.c
Executable file
68
LEDButton/ledbutton.c
Executable file
@ -0,0 +1,68 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
void initGPIO(void);
|
||||
void Delay(int t);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
initGPIO();
|
||||
int sample = 0x00;
|
||||
|
||||
for(;;){
|
||||
|
||||
sample = GPIOF -> DATA;
|
||||
|
||||
//SWITCH ONE ON
|
||||
if(!(sample & 0x10)){
|
||||
GPIOF -> DATA |= 0x02;
|
||||
Delay(2000);
|
||||
GPIOF -> DATA &= 0xFD;
|
||||
}
|
||||
|
||||
//SWITCH TWO ON
|
||||
if(!(sample & 0x01)){
|
||||
GPIOF -> DATA |= 0x08;
|
||||
Delay(2000);
|
||||
GPIOF -> DATA &= 0xF7;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void initGPIO(void){
|
||||
|
||||
// GPIO Configuration
|
||||
// 1. Enable Clock on GPIOF[3:1] (SYSCTL_RCGCGPIO)
|
||||
SYSCTL->RCGCGPIO = 0x20;
|
||||
// allow time for clock to stabilize (SYSCTL_PRGPIO)
|
||||
while((SYSCTL->PRGPIO & 0x20) != 0x20){};
|
||||
// 2. Unlock GPIOC[3:0], GIOD[7] and GPIOF[0] on TM4C123G (GPIOn->LOCK and GPIOn->CR) NOT USING
|
||||
GPIOF->LOCK = 0x4C4F434B;
|
||||
GPIOF->CR |= 0x01;
|
||||
// 3. Clear AMSEL to disable analog
|
||||
GPIOF->AMSEL = 0x00;
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOF->PCTL = 0x0000;
|
||||
//or
|
||||
//GPIOF->PCTL &= 0xFFF00FFF;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOF->DIR = 0x0E; // PF3,PF2,PF1 for Output
|
||||
// 6. Enable AFSEL bits to 1
|
||||
GPIOF->AFSEL = 0x00;
|
||||
// 7. Set PUR bits to 1 to enable internal pull-up
|
||||
GPIOF->PUR = 0x11;
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOF->DEN = 0x1F; // Enable digital pin on PF3,PF2,PF1
|
||||
}
|
||||
|
||||
void Delay(int t)
|
||||
{
|
||||
volatile int i, j;
|
||||
for (i = 0; i < t; i++)
|
||||
for (j = 0; j < 3180; j++)
|
||||
{};
|
||||
}
|
79
LEDButton/ledfinal.txt
Executable file
79
LEDButton/ledfinal.txt
Executable file
@ -0,0 +1,79 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
void DelayMs(int s);
|
||||
void Delay(int t);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
|
||||
// GPIO Configuration
|
||||
// 1. Enable Clock on GPIOF[3:1] (SYSCTL_RCGCGPIO)
|
||||
SYSCTL->RCGCGPIO = 0x20;
|
||||
// allow time for clock to stabilize (SYSCTL_PRGPIO)
|
||||
while((SYSCTL->PRGPIO & 0x20) != 0x20){};
|
||||
// 2. Unlock GPIOC[3:0], GIOD[7] and GPIOF[0] on TM4C123G (GPIOn->LOCK and GPIOn->CR) NOT USING
|
||||
GPIOF->LOCK = 0x4C4F434B;
|
||||
GPIOF->CR |= 0x01;
|
||||
// 3. Clear AMSEL to disable analog
|
||||
GPIOF->AMSEL = 0x00;
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOF->PCTL = 0x0000;
|
||||
//or
|
||||
//GPIOF->PCTL &= 0xFFF00FFF;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOF->DIR = 0x0E; // PF3,PF2,PF1 for Output
|
||||
// 6. Enable AFSEL bits to 1
|
||||
GPIOF->AFSEL = 0x00;
|
||||
// 7. Set PUR bits to 1 to enable internal pull-up
|
||||
GPIOF->PUR = 0x11;
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOF->DEN = 0x1F; // Enable digital pin on PF3,PF2,PF1
|
||||
|
||||
|
||||
|
||||
int sample = 0x00;
|
||||
int led = 0x00;
|
||||
|
||||
for(;;){
|
||||
|
||||
sample = GPIOF -> DATA;
|
||||
|
||||
//SWITCH ONE ON
|
||||
if(!(sample & 0x10)){
|
||||
led = GPIOF -> DATA;
|
||||
led |= 0x02;
|
||||
GPIOF -> DATA = led;
|
||||
Delay(60);
|
||||
led = GPIOF -> DATA;
|
||||
led &= 0xFD;
|
||||
GPIOF -> DATA = led;
|
||||
}
|
||||
|
||||
|
||||
//SWITCH TWO ON
|
||||
if(!(sample & 0x01)){
|
||||
led = GPIOF -> DATA;
|
||||
led |= 0x08;
|
||||
GPIOF -> DATA = led;
|
||||
Delay(60);
|
||||
led = GPIOF -> DATA;
|
||||
led &= 0xF7;
|
||||
GPIOF -> DATA = led;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Delay(int t)
|
||||
{
|
||||
volatile long time;
|
||||
int i;
|
||||
for (i = 0; i < t; ++i){
|
||||
time = 145000;
|
||||
while(time)
|
||||
time--;
|
||||
}
|
||||
}
|
43
Linked List/MyDefines.h
Executable file
43
Linked List/MyDefines.h
Executable file
@ -0,0 +1,43 @@
|
||||
#ifndef __MYDEFINES_H
|
||||
#define __MYDEFINES_H
|
||||
|
||||
#define _PIN0 0x01
|
||||
#define _PIN1 0x02
|
||||
#define _PIN2 0x04
|
||||
#define _PIN3 0x08
|
||||
#define _PIN4 0x10
|
||||
#define _PIN5 0x20
|
||||
#define _PIN6 0x40
|
||||
#define _PIN7 0x80
|
||||
|
||||
#define _PORTA 0x0001
|
||||
#define _PORTB 0x0002
|
||||
#define _PORTC 0x0004
|
||||
#define _PORTD 0x0008
|
||||
#define _PORTE 0x0010
|
||||
#define _PORTF 0x0020
|
||||
|
||||
|
||||
#define _PWM_MODULE0 0x01
|
||||
#define _PWM_MODULE1 0x02
|
||||
|
||||
#define _PWM0 0x01
|
||||
#define _PWM1 0x02
|
||||
#define _PWM2 0x04
|
||||
#define _PWM3 0x08
|
||||
#define _PWM4 0x10
|
||||
#define _PWM5 0x20
|
||||
#define _PWM6 0x40
|
||||
#define _PWM7 0x80
|
||||
|
||||
#define _PWMDIV_2 0x0
|
||||
#define _PWMDIV_4 0x1
|
||||
#define _PWMDIV_8 0x2
|
||||
#define _PWMDIV_16 0x3
|
||||
#define _PWMDIV_32 0x4
|
||||
#define _PWMDIV_64 0x5
|
||||
|
||||
#define _PWM_LEFT_ALIG_CMPAD ((0x02 << 6) | (0x03 << 2))
|
||||
#define _PWM_LEFT_ALIG_CMPBD ((0x02 << 10) | (0x03 << 2))
|
||||
|
||||
#endif
|
98
Linked List/main.c
Executable file
98
Linked List/main.c
Executable file
@ -0,0 +1,98 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "MyDefines.h"
|
||||
#include <TM4C123GH6PM.h>
|
||||
|
||||
void Delay(int s)
|
||||
{
|
||||
volatile int i, j;
|
||||
for (i = 0; i < s; i++)
|
||||
for (j = 0; j < 3180; j++){}
|
||||
}
|
||||
|
||||
void SetupGPIO(void);
|
||||
|
||||
typedef struct STEPS{
|
||||
struct STEPS* prev;
|
||||
uint8_t pinout1;
|
||||
uint8_t pinout2;
|
||||
struct STEPS* next;
|
||||
} STEPS;
|
||||
|
||||
#define CW 0
|
||||
#define CCW 1
|
||||
void Stepper(int s, bool direction);
|
||||
|
||||
STEPS step[]={
|
||||
{&step[3], _PIN0, _PIN1, &step[1]},
|
||||
{&step[2], _PIN1, _PIN2, &step[2]},
|
||||
{&step[1], _PIN2, _PIN3, &step[3]},
|
||||
{&step[0], _PIN3, _PIN0, &step[0]},
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
SetupGPIO();
|
||||
|
||||
while(1){
|
||||
|
||||
for ( i = 0; i < 10; i++){
|
||||
Stepper(10, CW);
|
||||
Delay(10);
|
||||
}
|
||||
/*
|
||||
for (i = 0; i < 10; i++){
|
||||
Stepper(10, CCW);
|
||||
Delay(10);
|
||||
}*/
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SetupGPIO(void)
|
||||
{
|
||||
// GPIO Initialization and Configuration
|
||||
// 1. Enable Clock on GPIOs
|
||||
SYSCTL->RCGCGPIO |= _PORTD;
|
||||
// allow time for clock to stabilize
|
||||
while ((SYSCTL->PRGPIO & _PORTD) != _PORTD) {};
|
||||
// 2. Unlock PD7 and/or PF0 for TM4C 123G
|
||||
// 3. Config AMSEL to disable analog function
|
||||
// 4. Config PCTL to select 0-GPIO
|
||||
// 5. Set AFSEL bits to 0
|
||||
// 6. Set DIR to 0 for input, 1 for output
|
||||
GPIOD -> DIR = _PIN0|_PIN1|_PIN2|_PIN3;
|
||||
// 7. Set PUR/PDR/ODR bits to 1 to enable internal pull-up/-down resistir and/or open-drain
|
||||
// 8. Set DEN bits to 1 to enable all
|
||||
GPIOD -> DEN = _PIN0|_PIN1|_PIN2|_PIN3;
|
||||
|
||||
}
|
||||
void Stepper(int s, bool direction)
|
||||
{
|
||||
int i;
|
||||
STEPS* p = step;
|
||||
|
||||
for (i = 0; i< s; i++){
|
||||
if (direction == CW){
|
||||
// p pointed to next element of step array
|
||||
GPIOD -> DATA |= ((p->pinout1)|(p->pinout2));
|
||||
Delay(10);
|
||||
GPIOD -> DATA &= ~((p->pinout1)|(p->pinout2));
|
||||
p = p->next;
|
||||
} else {
|
||||
GPIOD -> DATA |= ((p->pinout1)|(p->pinout2));
|
||||
Delay(10);
|
||||
GPIOD -> DATA &= ~((p->pinout1)|(p->pinout2));
|
||||
p = p->prev;
|
||||
|
||||
}
|
||||
// Port = p->pinout;
|
||||
|
||||
}
|
||||
}
|
||||
|
65
MyDefines.h
Executable file
65
MyDefines.h
Executable file
@ -0,0 +1,65 @@
|
||||
#ifndef __MYDEFINES_H
|
||||
#define __MYDEFINES_H
|
||||
|
||||
#define _PIN0 0x01
|
||||
#define _PIN1 0x02
|
||||
#define _PIN2 0x04
|
||||
#define _PIN3 0x08
|
||||
#define _PIN4 0x10
|
||||
#define _PIN5 0x20
|
||||
#define _PIN6 0x40
|
||||
#define _PIN7 0x80
|
||||
|
||||
#define _PORTA 0x0001
|
||||
#define _PORTB 0x0002
|
||||
#define _PORTC 0x0004
|
||||
#define _PORTD 0x0008
|
||||
#define _PORTE 0x0010
|
||||
#define _PORTF 0x0020
|
||||
|
||||
|
||||
#define _PWM_MODULE0 0x01
|
||||
#define _PWM_MODULE1 0x02
|
||||
|
||||
#define _PWM0 0x01
|
||||
#define _PWM1 0x02
|
||||
#define _PWM2 0x04
|
||||
#define _PWM3 0x08
|
||||
#define _PWM4 0x10
|
||||
#define _PWM5 0x20
|
||||
#define _PWM6 0x40
|
||||
#define _PWM7 0x80
|
||||
|
||||
#define _PWMDIV_2 0x0
|
||||
#define _PWMDIV_4 0x1
|
||||
#define _PWMDIV_8 0x2
|
||||
#define _PWMDIV_16 0x3
|
||||
#define _PWMDIV_32 0x4
|
||||
#define _PWMDIV_64 0x5
|
||||
|
||||
#define _PWM_LEFT_ALIG_CMPAD ((0x02 << 6) | (0x03 << 2))
|
||||
#define _PWM_LEFT_ALIG_CMPBD ((0x02 << 10) | (0x03 << 2))
|
||||
|
||||
#define _PWM_RIGHT_ALIG_CMPAD ((0x03 << 6) | (0x02 << 2))
|
||||
#define _PWM_RIGHT_ALIG_CMPBD ((0x03 << 10) | (0x02 << 2))
|
||||
|
||||
#define _TIMER0 0x01
|
||||
#define _TIMER1 0x02
|
||||
#define _TIMER2 0x04
|
||||
#define _TIMER3 0x08
|
||||
#define _TIMER4 0x10
|
||||
#define _TIMER5 0x20
|
||||
#define _TIMER6 0x40
|
||||
#define _TIMER7 0x80
|
||||
|
||||
#define _TIMERA_ENABLE (1 << 0)
|
||||
#define _TIMERB_ENABLE (1 << 8)
|
||||
#define _TIMERA_COUNTUP (1 << 4)
|
||||
#define _TIMERA_COUNTDOWN (0 << 4)
|
||||
#define _TIMERA_CAPTURE 0x03
|
||||
#define _TIMERA_EDGE_TIME (1 << 2)
|
||||
#define _TIMERA_POSITIVE_EDGE 0
|
||||
#define _TIMERA_NEGATIVE_EDGE (1 << 2)
|
||||
#define _TIMERA_BOTH_EDGES (3 << 2)
|
||||
|
||||
#endif
|
43
PWM DC Motor/MyDefines.h
Executable file
43
PWM DC Motor/MyDefines.h
Executable file
@ -0,0 +1,43 @@
|
||||
#ifndef __MYDEFINES_H
|
||||
#define __MYDEFINES_H
|
||||
|
||||
#define _PIN0 0x01
|
||||
#define _PIN1 0x02
|
||||
#define _PIN2 0x04
|
||||
#define _PIN3 0x08
|
||||
#define _PIN4 0x10
|
||||
#define _PIN5 0x20
|
||||
#define _PIN6 0x40
|
||||
#define _PIN7 0x80
|
||||
|
||||
#define _PORTA 0x0001
|
||||
#define _PORTB 0x0002
|
||||
#define _PORTC 0x0004
|
||||
#define _PORTD 0x0008
|
||||
#define _PORTE 0x0010
|
||||
#define _PORTF 0x0020
|
||||
|
||||
|
||||
#define _PWM_MODULE0 0x01
|
||||
#define _PWM_MODULE1 0x02
|
||||
|
||||
#define _PWM0 0x01
|
||||
#define _PWM1 0x02
|
||||
#define _PWM2 0x04
|
||||
#define _PWM3 0x08
|
||||
#define _PWM4 0x10
|
||||
#define _PWM5 0x20
|
||||
#define _PWM6 0x40
|
||||
#define _PWM7 0x80
|
||||
|
||||
#define _PWMDIV_2 0x0
|
||||
#define _PWMDIV_4 0x1
|
||||
#define _PWMDIV_8 0x2
|
||||
#define _PWMDIV_16 0x3
|
||||
#define _PWMDIV_32 0x4
|
||||
#define _PWMDIV_64 0x5
|
||||
|
||||
#define _PWM_LEFT_ALIG_CMPAD ((0x02 << 6) | (0x03 << 2))
|
||||
#define _PWM_LEFT_ALIG_CMPBD ((0x02 << 10) | (0x03 << 2))
|
||||
|
||||
#endif
|
0
PWM DC Motor/MyDevice.h
Executable file
0
PWM DC Motor/MyDevice.h
Executable file
162
PWM DC Motor/main.c
Executable file
162
PWM DC Motor/main.c
Executable file
@ -0,0 +1,162 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "MyDefines.h"
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
|
||||
void SetupPWM(void);
|
||||
void SetupGPIO(void);
|
||||
void SetupPWMDEFINE(void);
|
||||
void SetupGPIODEFINE(void);
|
||||
|
||||
int main()
|
||||
{
|
||||
SetupPWM();
|
||||
SetupGPIO();
|
||||
|
||||
int cmp = 0;
|
||||
volatile int i;
|
||||
|
||||
while(1){
|
||||
// Your Code Here
|
||||
//GPIOF -> DATA = 0x01;
|
||||
|
||||
PWM1 -> _3_CMPB = cmp;
|
||||
PWM1 -> _2_CMPA = cmp++;
|
||||
|
||||
if(cmp > 9999) cmp = 0;
|
||||
|
||||
for(i = 0; i < 500; i++){}
|
||||
}
|
||||
}
|
||||
|
||||
int mainDEFINE(){
|
||||
|
||||
uint32_t *sw1 = (uint32_t *)(((char*)GPIOF) + (_PIN4 << 2));
|
||||
uint32_t *led = (uint32_t *)(((char*)GPIOF) + (_PIN2 << 2));
|
||||
|
||||
SetupPWMDEFINE();
|
||||
SetupGPIODEFINE();
|
||||
|
||||
while(1){
|
||||
if(!(*sw1)){
|
||||
*led = 0xFF;
|
||||
}else{
|
||||
*led = 0x00;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SetupGPIODEFINE(void){
|
||||
|
||||
// Config for GPIO
|
||||
// 1. Enable Clock on GPIOF
|
||||
SYSCTL->RCGCGPIO = _PORTF;
|
||||
// allow time for clock to stabilize
|
||||
while((SYSCTL->PRGPIO & _PORTF) != _PORTF){};
|
||||
|
||||
// 2. Unlock GPIO
|
||||
GPIOF -> LOCK = 0x4C4F434B;
|
||||
GPIOF -> CR |= 0x01;
|
||||
// 3. Clear AMSEL to disable analog
|
||||
GPIOF -> AMSEL = 0x0;
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOF -> PCTL = 0x5000;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOF -> DIR = _PIN2 | _PIN3;
|
||||
// 6. Enable AFSEL bits to 1
|
||||
GPIOF -> AFSEL = _PIN3;
|
||||
// 7. Set PUE bits to 1 to enable internal pull-up
|
||||
GPIOF -> DATA = _PIN4;
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOF -> DEN = _PIN2 | _PIN3;
|
||||
|
||||
}
|
||||
|
||||
void SetupGPIO(void){
|
||||
|
||||
// Config for GPIO
|
||||
// 1. Enable Clock on GPIOF
|
||||
SYSCTL->RCGCGPIO = 0x20;
|
||||
// allow time for clock to stabilize
|
||||
while((SYSCTL->PRGPIO & 0x20) != 0x20){};
|
||||
|
||||
// 2. Unlock GPIO
|
||||
GPIOF -> LOCK = 0x4C4F434B;
|
||||
GPIOF -> CR |= 0x01;
|
||||
// 3. Clear AMSEL to disable analog
|
||||
GPIOF -> AMSEL = 0x0;
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOF -> PCTL = 0x00005005;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOF -> DIR = 0x09;
|
||||
// 6. Enable AFSEL bits to 1
|
||||
GPIOF -> AFSEL = 0x09;
|
||||
// 7. Set PUE bits to 1 to enable internal pull-up
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOF -> DEN = 0x09;
|
||||
}
|
||||
|
||||
void SetupPWMDEFINE(void)
|
||||
{
|
||||
int load = 40000;
|
||||
// 1. Enable Clock for PWM Module 1
|
||||
SYSCTL->RCGCPWM |= _PWM_MODULE1;
|
||||
while((SYSCTL->PRPWM & _PWM_MODULE1)!= _PWM_MODULE1){};
|
||||
// 2. Enable and Setup Clock Divider for PWM
|
||||
SYSCTL->RCC |= (1 << 20); // RCC[20]=1:USEPWMDIV
|
||||
SYSCTL->RCC &= ~0x000E0000; // RCC[19:17]=000 PWMDIV
|
||||
SYSCTL->RCC |= (_PWMDIV_2 << 17); // RCC[19:17]=0x04 divider=/32
|
||||
// 3. Disable PWM Generator 2
|
||||
PWM1->_2_CTL &= ~0x01; // Disable PWM Generator 2
|
||||
PWM1->_3_CTL &= ~0x01; // Disable PWM Generator 3
|
||||
// 4. Config LOAD, CMPn, GENn values
|
||||
|
||||
PWM1->_2_LOAD = load; // GEN 2 A PWM 4 PF0 MOTOR
|
||||
PWM1->_2_CMPA = load/2;
|
||||
PWM1->_2_GENA = _PWM_LEFT_ALIG_CMPBD;//0x080C
|
||||
|
||||
PWM1->_3_LOAD = load; // GEN 3 B PWM 7 PF3 LED
|
||||
PWM1->_3_CMPB = load/2;
|
||||
PWM1->_3_GENB = (0x02 << 10 ) | (0x03 <<2);//0x080C
|
||||
// 5. Enable PWM Generator 2
|
||||
PWM1->_2_CTL |= 0x01;
|
||||
PWM1->_3_CTL |= 0x01;
|
||||
// 6. Enable PWM5 Output
|
||||
//PWM1->ENABLE |= 1 << 4; // Enable PWM4
|
||||
//PWM1->ENABLE |= 1 << 7; // Enable PWM7
|
||||
PWM1 -> ENABLE |= 0x90;
|
||||
}
|
||||
|
||||
void SetupPWM(void)
|
||||
{
|
||||
int load = 10000;
|
||||
// 1. Enable Clock for PWM Module 1
|
||||
SYSCTL->RCGCPWM |= 0x02;
|
||||
while((SYSCTL->PRPWM & 0x02)==0){};
|
||||
// 2. Enable and Setup Clock Divider for PWM
|
||||
SYSCTL->RCC |= (1 << 20); // RCC[20]=1:USEPWMDIV
|
||||
SYSCTL->RCC &= ~0x000E0000; // RCC[19:17]=000 PWMDIV
|
||||
SYSCTL->RCC |= (0x03 << 17); // RCC[19:17]=0x04 divider=/32
|
||||
// 3. Disable PWM Generator 2
|
||||
PWM1->_2_CTL &= ~0x01; // Disable PWM Generator 2
|
||||
PWM1->_3_CTL &= ~0x01; // Disable PWM Generator 3
|
||||
// 4. Config LOAD, CMPn, GENn values
|
||||
|
||||
PWM1->_2_LOAD = load; // GEN 2 A PWM 4 PF0 MOTOR
|
||||
PWM1->_2_CMPA = load/2;
|
||||
PWM1->_2_GENA = (0x02 << 6 ) | (0x03 <<2);//0x080C
|
||||
|
||||
PWM1->_3_LOAD = load; // GEN 3 B PWM 7 PF3 LED
|
||||
PWM1->_3_CMPB = load/2;
|
||||
PWM1->_3_GENB = (0x02 << 10 ) | (0x03 <<2);//0x080C
|
||||
// 5. Enable PWM Generator 2
|
||||
PWM1->_2_CTL |= 0x01;
|
||||
PWM1->_3_CTL |= 0x01;
|
||||
// 6. Enable PWM5 Output
|
||||
//PWM1->ENABLE |= 1 << 4; // Enable PWM4
|
||||
//PWM1->ENABLE |= 1 << 7; // Enable PWM7
|
||||
PWM1 -> ENABLE |= 0x90;
|
||||
}
|
43
PinPad/MyDefines.h
Executable file
43
PinPad/MyDefines.h
Executable file
@ -0,0 +1,43 @@
|
||||
#ifndef __MYDEFINES_H
|
||||
#define __MYDEFINES_H
|
||||
|
||||
#define _PIN0 0x01
|
||||
#define _PIN1 0x02
|
||||
#define _PIN2 0x04
|
||||
#define _PIN3 0x08
|
||||
#define _PIN4 0x10
|
||||
#define _PIN5 0x20
|
||||
#define _PIN6 0x40
|
||||
#define _PIN7 0x80
|
||||
|
||||
#define _PORTA 0x01
|
||||
#define _PORTB 0x02
|
||||
#define _PORTC 0x04
|
||||
#define _PORTD 0x08
|
||||
#define _PORTE 0x10
|
||||
#define _PORTF 0x20
|
||||
|
||||
|
||||
#define _PWM_MODULE0 0x01
|
||||
#define _PWM_MODULE1 0x02
|
||||
|
||||
#define _PWM0 0x01
|
||||
#define _PWM1 0x02
|
||||
#define _PWM2 0x04
|
||||
#define _PWM3 0x08
|
||||
#define _PWM4 0x10
|
||||
#define _PWM5 0x20
|
||||
#define _PWM6 0x40
|
||||
#define _PWM7 0x80
|
||||
|
||||
#define _PWMDIV_2 0x0
|
||||
#define _PWMDIV_4 0x1
|
||||
#define _PWMDIV_8 0x2
|
||||
#define _PWMDIV_16 0x3
|
||||
#define _PWMDIV_32 0x4
|
||||
#define _PWMDIV_64 0x5
|
||||
|
||||
#define _PWM_LEFT_ALIG_CMPAD ((0x02 << 6) | (0x03 << 2))
|
||||
#define _PWM_LEFT_ALIG_CMPBD ((0x02 << 10) | (0x03 << 2))
|
||||
|
||||
#endif
|
134
PinPad/pinpad.c
Executable file
134
PinPad/pinpad.c
Executable file
@ -0,0 +1,134 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
#include "ez123G.h"
|
||||
#include "MyDefines.h"
|
||||
|
||||
char str[100];
|
||||
char ReadKeyPad();
|
||||
|
||||
int main(void)
|
||||
{
|
||||
PEZOBJ_LCD lcd;
|
||||
uint16_t i = 0;
|
||||
|
||||
// GPIO Initialization and Configuration
|
||||
// 1. Enable Clock on GPIOs
|
||||
SYSCTL->RCGCGPIO |= 0x1B;
|
||||
// allow time for clock to stabilize
|
||||
while ((SYSCTL->PRGPIO & 0x1B) != 0x1B) {};
|
||||
// 2. Unlock PD7 and/or PF0 for TM4C 123G
|
||||
// 3. Config AMSEL to disable analog function
|
||||
// 4. Config PCTL to select 0-GPIO
|
||||
// 5. Set AFSEL bits to 0
|
||||
// 6. Set DIR to 0 for input, 1 for output
|
||||
|
||||
GPIOA -> DIR = 0x00;
|
||||
GPIOB -> DIR = 0x03;
|
||||
GPIOD -> DIR = 0x0F;
|
||||
GPIOE -> DIR = 0x3E;
|
||||
|
||||
// 7. Set PUR/PDR/ODR bits to 1 to enable internal pull-up/-down resistir and/or open-drain
|
||||
GPIOB -> ODR = 0x03;
|
||||
GPIOE -> ODR = 0x30;
|
||||
GPIOA -> PUR = 0xE0;
|
||||
GPIOB -> PUR = 0x10;
|
||||
|
||||
// 8. Set DEN bits to 1 to enable all
|
||||
GPIOA -> DEN = 0xE0;
|
||||
GPIOB -> DEN = 0x13;
|
||||
GPIOD -> DEN = 0x0F;
|
||||
GPIOE -> DEN = 0x3E;
|
||||
|
||||
|
||||
lcd = ezLCD_Create();
|
||||
ezLCD_Connect_DataPort(lcd, GPIOD, PIN_3_0);
|
||||
ezLCD_Connect_ENPin(lcd, GPIOE, PIN1);
|
||||
ezLCD_Connect_RSPin(lcd, GPIOE, PIN2);
|
||||
ezLCD_Connect_RWPin(lcd, GPIOE, PIN3);
|
||||
|
||||
ezLCD_Start(lcd);
|
||||
ezLCD_ClearDisplay(lcd);
|
||||
ezLCD_Position(lcd, 1, 0);
|
||||
ezLCD_PrintString(lcd, "HELLO");
|
||||
|
||||
char ch;
|
||||
while(1){
|
||||
ch = ReadKeyPad();
|
||||
|
||||
if (ch == '*'){
|
||||
i *= 100;
|
||||
ezLCD_ClearDisplay(lcd);
|
||||
}
|
||||
if (ch == '#') i = 0;
|
||||
if (ch >='0' && ch <= '9') i = i*10 + ch - '0';
|
||||
|
||||
sprintf(str, "%d ", i);
|
||||
ezLCD_Position(lcd, 0, 0);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
|
||||
timer_waitMillis(100);
|
||||
}
|
||||
}
|
||||
//--------------------------------------------------------------
|
||||
char KeyPad[4][4]={
|
||||
{'1','2','3','A'},
|
||||
{'4','5','6','B'},
|
||||
{'7','8','9','C'},
|
||||
{'*','0','#','D'}};
|
||||
|
||||
char ReadKeyPad()
|
||||
{
|
||||
int row;
|
||||
GPIOB -> DATA |= 0x03;
|
||||
GPIOE -> DATA |= 0x30;
|
||||
for(row = 0; row < 4; row++){
|
||||
switch(row){
|
||||
case 0:
|
||||
GPIOB -> DATA &= ~0x01;
|
||||
break;
|
||||
case 1:
|
||||
GPIOB -> DATA |= 0x01;
|
||||
GPIOB -> DATA &= ~0x02;
|
||||
break;
|
||||
case 2:
|
||||
GPIOB -> DATA |= 0x02;
|
||||
GPIOE -> DATA &= ~0x10;
|
||||
break;
|
||||
case 3:
|
||||
GPIOE -> DATA |= 0x10;
|
||||
GPIOE -> DATA &= ~0x20;
|
||||
break;
|
||||
}
|
||||
|
||||
timer_waitMillis(10);
|
||||
|
||||
if(!(GPIOB -> DATA & 0x10))
|
||||
{
|
||||
while(!(GPIOB -> DATA & 0x10)){}
|
||||
return KeyPad[row][0];
|
||||
}
|
||||
if(!(GPIOA -> DATA & 0x20))
|
||||
{
|
||||
while(!(GPIOA -> DATA & 0x20)){}
|
||||
return KeyPad[row][1];
|
||||
}
|
||||
if(!(GPIOA -> DATA & 0x40))
|
||||
{
|
||||
while(!(GPIOA -> DATA & 0x40)){}
|
||||
return KeyPad[row][2];
|
||||
}
|
||||
if(!(GPIOA -> DATA & 0x80))
|
||||
{
|
||||
while(!(GPIOA -> DATA & 0x80)){}
|
||||
return KeyPad[row][3];
|
||||
}
|
||||
|
||||
row++;
|
||||
}
|
||||
|
||||
return 0x0;
|
||||
}
|
43
Report Motor Speed/MyDefines.h
Executable file
43
Report Motor Speed/MyDefines.h
Executable file
@ -0,0 +1,43 @@
|
||||
#ifndef __MYDEFINES_H
|
||||
#define __MYDEFINES_H
|
||||
|
||||
#define _PIN0 0x01
|
||||
#define _PIN1 0x02
|
||||
#define _PIN2 0x04
|
||||
#define _PIN3 0x08
|
||||
#define _PIN4 0x10
|
||||
#define _PIN5 0x20
|
||||
#define _PIN6 0x40
|
||||
#define _PIN7 0x80
|
||||
|
||||
#define _PORTA 0x0001
|
||||
#define _PORTB 0x0002
|
||||
#define _PORTC 0x0004
|
||||
#define _PORTD 0x0008
|
||||
#define _PORTE 0x0010
|
||||
#define _PORTF 0x0020
|
||||
|
||||
|
||||
#define _PWM_MODULE0 0x01
|
||||
#define _PWM_MODULE1 0x02
|
||||
|
||||
#define _PWM0 0x01
|
||||
#define _PWM1 0x02
|
||||
#define _PWM2 0x04
|
||||
#define _PWM3 0x08
|
||||
#define _PWM4 0x10
|
||||
#define _PWM5 0x20
|
||||
#define _PWM6 0x40
|
||||
#define _PWM7 0x80
|
||||
|
||||
#define _PWMDIV_2 0x0
|
||||
#define _PWMDIV_4 0x1
|
||||
#define _PWMDIV_8 0x2
|
||||
#define _PWMDIV_16 0x3
|
||||
#define _PWMDIV_32 0x4
|
||||
#define _PWMDIV_64 0x5
|
||||
|
||||
#define _PWM_LEFT_ALIG_CMPAD ((0x02 << 6) | (0x03 << 2))
|
||||
#define _PWM_LEFT_ALIG_CMPBD ((0x02 << 10) | (0x03 << 2))
|
||||
|
||||
#endif
|
167
Report Motor Speed/main.c
Executable file
167
Report Motor Speed/main.c
Executable file
@ -0,0 +1,167 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "MyDefines.h"
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
|
||||
void SetupPWM(void);
|
||||
void SetupGPIO(void);
|
||||
void Delay(int t);
|
||||
|
||||
int main()
|
||||
{
|
||||
SetupPWM();
|
||||
SetupGPIO();
|
||||
|
||||
uint32_t *sw1 = (uint32_t *)(((char*)GPIOF) + (_PIN4 << 2));
|
||||
uint32_t *sw2 = (uint32_t *)(((char*)GPIOF) + (_PIN0 << 2));
|
||||
|
||||
uint32_t *cwturn = (uint32_t *)(((char*)GPIOA) + (_PIN3 << 2));
|
||||
uint32_t *acwturn = (uint32_t *)(((char*)GPIOA) + (_PIN2 << 2));
|
||||
*cwturn = 0xFF;
|
||||
*acwturn = 0x00;
|
||||
|
||||
bool countup = true;
|
||||
bool turn_clockwise = true;
|
||||
|
||||
*cwturn = 0xFF;
|
||||
*acwturn = 0x00;
|
||||
PWM0 -> ENABLE |= _PWM3;
|
||||
PWM1 -> ENABLE |= _PWM7;
|
||||
double cmp_percent = 0.9; //Start at 10% Duty Cycle
|
||||
|
||||
bool sw1currstate;
|
||||
bool sw1prevstate = false;
|
||||
|
||||
bool sw2currstate;
|
||||
bool sw2prevstate = false;
|
||||
|
||||
while(1){
|
||||
|
||||
if(!(*sw1)) sw1currstate = true;
|
||||
else sw1currstate = false;
|
||||
if(!(*sw2)) sw2currstate = true;
|
||||
else sw2currstate = false;
|
||||
|
||||
//DUTY CYCLE CHANGE
|
||||
if(!sw1currstate && sw1prevstate){ //Falling Edge Triggered
|
||||
if(cmp_percent == 1){ //count down at 100% duty cycle
|
||||
countup = false;
|
||||
}
|
||||
if(cmp_percent == 0){ //count up at 0% duty cycle
|
||||
countup = true;
|
||||
}
|
||||
if(countup == true){ //add 10% duty cycle
|
||||
cmp_percent -= 0.1;
|
||||
}else{ //remove 10% duty cycle
|
||||
cmp_percent += 0.1;
|
||||
}
|
||||
PWM1->_3_CMPB = 20000 - 20000*cmp_percent;
|
||||
PWM0->_1_CMPB = 20000 - 20000*cmp_percent;
|
||||
}
|
||||
|
||||
//MOTOR DIRECTION CHANGE
|
||||
if(!sw2currstate && sw2prevstate){ //Falling Edge Triggered
|
||||
|
||||
PWM0->_1_CMPB = 20000; //Set Duty Cycle 0%
|
||||
PWM1->_3_CMPB = 20000;
|
||||
|
||||
Delay(2000); //Wait 2 Seconds
|
||||
|
||||
if(turn_clockwise){
|
||||
*cwturn = 0x00;
|
||||
*acwturn = 0xFF;
|
||||
turn_clockwise = false;
|
||||
}else{
|
||||
*cwturn = 0xFF;
|
||||
*acwturn = 0x00;
|
||||
turn_clockwise = true;
|
||||
}
|
||||
PWM1->_3_CMPB = 20000*cmp_percent;
|
||||
PWM0->_1_CMPB = 20000*cmp_percent;
|
||||
}
|
||||
sw1prevstate = sw1currstate;
|
||||
sw2prevstate = sw2currstate;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SetupGPIO(void){
|
||||
|
||||
// Config for GPIO
|
||||
// 1. Enable Clock on GPIOF
|
||||
SYSCTL->RCGCGPIO = (_PORTA|_PORTB|_PORTF);
|
||||
// allow time for clock to stabilize
|
||||
while((SYSCTL->PRGPIO & (_PORTA|_PORTB|_PORTF)) != (_PORTA|_PORTB|_PORTF)){};
|
||||
|
||||
// 2. Unlock GPIO
|
||||
GPIOF -> LOCK = 0x4C4F434B;
|
||||
GPIOF -> CR |= _PIN0;
|
||||
// 3. Clear AMSEL to disable analog
|
||||
//GPIOA -> AMSEL = 0x0;
|
||||
//GPIOB -> AMSEL = 0x0;
|
||||
//GPIOF -> AMSEL = 0x0;
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOA -> PCTL = 0x0;
|
||||
GPIOB -> PCTL = 0x00400000;
|
||||
GPIOF -> PCTL = 0x00005000;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOA -> DIR |= _PIN2|_PIN3;
|
||||
GPIOB -> DIR |= _PIN5;
|
||||
GPIOF -> DIR |= _PIN3;
|
||||
// 6. Enable AFSEL bits to 1
|
||||
GPIOA -> AFSEL = 0x0;
|
||||
GPIOB -> AFSEL = _PIN5;
|
||||
GPIOF -> AFSEL = _PIN3;
|
||||
// 7. Set PUE bits to 1 to enable internal pull-up
|
||||
GPIOF -> PUR = _PIN0|_PIN4;
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOA -> DEN |= _PIN2|_PIN3;
|
||||
GPIOB -> DEN |= _PIN5;
|
||||
GPIOF -> DEN |= _PIN0|_PIN3|_PIN4;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SetupPWM(void)
|
||||
{
|
||||
int load = 20000;
|
||||
// 1. Enable Clock for PWM Module 1
|
||||
SYSCTL->RCGCPWM |= (_PWM_MODULE0|_PWM_MODULE1);
|
||||
while((SYSCTL->PRPWM & (_PWM_MODULE0|_PWM_MODULE1))==0){};
|
||||
|
||||
// 2. Enable and Setup Clock Divider for PWM
|
||||
SYSCTL->RCC |= (1 << 20); // RCC[20]=1:USEPWMDIV
|
||||
SYSCTL->RCC &= ~0x000E0000; // RCC[19:17]=000 PWMDIV
|
||||
SYSCTL->RCC |= (_PWMDIV_4 << 17); // RCC[19:17]=0x04 divider=/32
|
||||
|
||||
// 3. Disable PWM Generator 2
|
||||
PWM0->_1_CTL &= ~0x01; // Disable PWM Generator 2
|
||||
PWM1->_3_CTL &= ~0x01; // Disable PWM Generator 2
|
||||
|
||||
// 4. Config LOAD, CMPn, GENn values
|
||||
PWM0->_1_LOAD = load; // M0 GEN 1 B PWM 3 PB5 MOTOR
|
||||
PWM0->_1_CMPB = (load - load*0.1);
|
||||
PWM0->_1_GENB = (0x02 << 10 ) | (0x03 <<2);//0x080C
|
||||
|
||||
PWM1->_3_LOAD = load; // M1 GEN 3 B PWM 7 PF3 LED
|
||||
PWM1->_3_CMPB = (load - load*0.1);
|
||||
PWM1->_3_GENB = (0x02 << 10 ) | (0x03 <<2);//0x080C
|
||||
|
||||
// 5. Enable PWM Generator 2
|
||||
PWM0->_1_CTL |= 0x01;
|
||||
PWM1->_3_CTL |= 0x01;
|
||||
|
||||
// 6. Enable PWM5 Output
|
||||
|
||||
}
|
||||
|
||||
void Delay(int t)
|
||||
{
|
||||
volatile int i, j;
|
||||
for (i = 0; i < t; i++)
|
||||
for (j = 0; j < 3180; j++)
|
||||
{};
|
||||
}
|
43
State Machine/MyDefines.h
Executable file
43
State Machine/MyDefines.h
Executable file
@ -0,0 +1,43 @@
|
||||
#ifndef __MYDEFINES_H
|
||||
#define __MYDEFINES_H
|
||||
|
||||
#define _PIN0 0x01
|
||||
#define _PIN1 0x02
|
||||
#define _PIN2 0x04
|
||||
#define _PIN3 0x08
|
||||
#define _PIN4 0x10
|
||||
#define _PIN5 0x20
|
||||
#define _PIN6 0x40
|
||||
#define _PIN7 0x80
|
||||
|
||||
#define _PORTA 0x0001
|
||||
#define _PORTB 0x0002
|
||||
#define _PORTC 0x0004
|
||||
#define _PORTD 0x0008
|
||||
#define _PORTE 0x0010
|
||||
#define _PORTF 0x0020
|
||||
|
||||
|
||||
#define _PWM_MODULE0 0x01
|
||||
#define _PWM_MODULE1 0x02
|
||||
|
||||
#define _PWM0 0x01
|
||||
#define _PWM1 0x02
|
||||
#define _PWM2 0x04
|
||||
#define _PWM3 0x08
|
||||
#define _PWM4 0x10
|
||||
#define _PWM5 0x20
|
||||
#define _PWM6 0x40
|
||||
#define _PWM7 0x80
|
||||
|
||||
#define _PWMDIV_2 0x0
|
||||
#define _PWMDIV_4 0x1
|
||||
#define _PWMDIV_8 0x2
|
||||
#define _PWMDIV_16 0x3
|
||||
#define _PWMDIV_32 0x4
|
||||
#define _PWMDIV_64 0x5
|
||||
|
||||
#define _PWM_LEFT_ALIG_CMPAD ((0x02 << 6) | (0x03 << 2))
|
||||
#define _PWM_LEFT_ALIG_CMPBD ((0x02 << 10) | (0x03 << 2))
|
||||
|
||||
#endif
|
188
State Machine/main.c
Executable file
188
State Machine/main.c
Executable file
@ -0,0 +1,188 @@
|
||||
#include "MyDefines.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
|
||||
typedef enum STATES {
|
||||
S_0,
|
||||
S_1,
|
||||
S_2,
|
||||
S_3,
|
||||
}STATES;
|
||||
|
||||
void SetGPIO(void);
|
||||
void GPIOF_Handler (void);
|
||||
void Setup_GPIOIRQ(void);
|
||||
|
||||
volatile bool sw1;
|
||||
|
||||
uint32_t *led1 =(uint32_t *) (((char*)GPIOF) +(_PIN1 << 2));
|
||||
uint32_t *led2 =(uint32_t *) (((char*)GPIOF) +(_PIN3 << 2));
|
||||
|
||||
typedef struct STATELIST{
|
||||
int led1;
|
||||
int led2;
|
||||
struct STATELIST *next;
|
||||
|
||||
}STATELIST;
|
||||
|
||||
int main()
|
||||
{
|
||||
STATES currState = S_0;
|
||||
|
||||
STATELIST state[] = {
|
||||
{0, 0, &state[1]}, //s0
|
||||
{0xFF, 0, &state[2]}, //s1
|
||||
{0xFF, 0xFF, &state[3]}, //s2
|
||||
{0, 0xFF, &state[0]}, //s3
|
||||
};
|
||||
|
||||
SetGPIO();
|
||||
Setup_GPIOIRQ ();
|
||||
|
||||
//Moore State Machine
|
||||
while(1){
|
||||
switch (currState){
|
||||
case S_0:
|
||||
*led1 = 0x00;
|
||||
*led2 = 0x00;
|
||||
if(sw1){
|
||||
sw1=false;
|
||||
currState = S_1;
|
||||
}
|
||||
break;
|
||||
case S_1:
|
||||
*led1 = 0x01;
|
||||
*led2 = 0x00;
|
||||
if(sw1){
|
||||
sw1=false;
|
||||
currState = S_2;
|
||||
}
|
||||
break;
|
||||
case S_2:
|
||||
*led1 = 0x01;
|
||||
*led2 = 0x01;
|
||||
if(sw1){
|
||||
sw1=false;
|
||||
currState = S_3;
|
||||
}
|
||||
break;
|
||||
case S_3:
|
||||
*led1 = 0x00;
|
||||
*led2 = 0x01;
|
||||
if(sw1){
|
||||
sw1=false;
|
||||
currState = S_0;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//Mealy State Machine
|
||||
while(1){
|
||||
switch (currState){
|
||||
case S_0:
|
||||
if(sw1){
|
||||
sw1=false;
|
||||
currState = S_1;
|
||||
*led1 = 0x00;
|
||||
*led2 = 0x00;
|
||||
}
|
||||
break;
|
||||
case S_1:
|
||||
if(sw1){
|
||||
sw1=false;
|
||||
currState = S_2;
|
||||
*led1 = 0x01;
|
||||
*led2 = 0x00;
|
||||
}
|
||||
break;
|
||||
case S_2:
|
||||
if(sw1){
|
||||
sw1=false;
|
||||
currState = S_3;
|
||||
*led1 = 0x01;
|
||||
*led2 = 0x01;
|
||||
}
|
||||
break;
|
||||
case S_3:
|
||||
if(sw1){
|
||||
sw1=false;
|
||||
currState = S_0;
|
||||
*led1 = 0x00;
|
||||
*led2 = 0x01;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//MOORE STATE WITH LINKED LIST
|
||||
STATELIST *pState = &state[0];
|
||||
while(1){
|
||||
*led1 = pState->led1;
|
||||
*led2 = pState->led2;
|
||||
if(sw1){
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
void SetGPIO(void)
|
||||
{
|
||||
// Config for GPIO
|
||||
// 1. Enable Clock on GPIOF
|
||||
SYSCTL->RCGCGPIO = _PORTF;
|
||||
// allow time for clock to stabilize
|
||||
while((SYSCTL->PRGPIO & _PORTF) != _PORTF){};
|
||||
|
||||
// 2. Unlock GPIO
|
||||
|
||||
// 3. Clear AMSEL to disable analog
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOF->PCTL= 0x00;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOF->DIR= _PIN1 | _PIN2;
|
||||
// 6. Enable AFSEL bits to 1
|
||||
|
||||
// 7. Set PUE bits to 1 to enable internal pull-up
|
||||
GPIOF->PUR= _PIN4;
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOF->DEN= _PIN1 | _PIN4 | _PIN2;
|
||||
}
|
||||
|
||||
void Setup_GPIOIRQ()
|
||||
{
|
||||
uint16_t n,m,r,r2;
|
||||
// 1. Disable IRQ in GPIOIM register
|
||||
GPIOF->IM &= ~(_PIN4);
|
||||
// 2. Configure IRQ Type (0=edge, 1=level) in the GPIOIS register
|
||||
GPIOF->IS &= ~(_PIN4);
|
||||
// 3. Configure GPIOIBE (0=single edge, 1=both edge),
|
||||
// GPIOIEV (0=low level or falling edge, 1=high level or rising edge)
|
||||
GPIOF->IBE &= ~(_PIN4);
|
||||
GPIOF->IEV &= ~(_PIN4);
|
||||
// 4. Clear the GPIORIS register
|
||||
GPIOF->ICR |= _PIN4;
|
||||
// 5. Enable IRQ in the GPIOIM register
|
||||
GPIOF->IM |= _PIN4;
|
||||
// 6. Set priority in the NVIC
|
||||
n = 30/4;
|
||||
r = 21;
|
||||
m = 30/32; r2 = 30 % 32;
|
||||
NVIC->IP[n] |= (3 << r);
|
||||
// 7. Enable IRQ in the NVIC
|
||||
NVIC->ISER[m] |= (1 << r2);
|
||||
}
|
||||
uint32_t *pn1 =(uint32_t *) (((char*)GPIOF) +(_PIN4 << 2));
|
||||
|
||||
void GPIOF_Handler()//Interrupt service
|
||||
{
|
||||
GPIOF ->ICR |= _PIN4; // Clear Interrupt flag
|
||||
sw1=true;
|
||||
//*pn1 ^= _PIN1;
|
||||
|
||||
}
|
90
TemplateCode_01.c
Executable file
90
TemplateCode_01.c
Executable file
@ -0,0 +1,90 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <TM4C123GH6PM.h>
|
||||
#include <TM4C1294NCPDT.h"
|
||||
#include "MyDefines.h" // Your Definitions Header File
|
||||
#include "ez123G.h"
|
||||
#include "ez1294.h"
|
||||
|
||||
void Setup_PWM(void);
|
||||
void Setup_GPIO(void);
|
||||
|
||||
typedef enum STATES{
|
||||
S_IDLE,
|
||||
S_0,
|
||||
S_1,
|
||||
S_2,
|
||||
S_3,
|
||||
} STATES;
|
||||
|
||||
|
||||
// Golbal Variables
|
||||
uint32_t *pSw1 = _______; // GPIO pin for SW1
|
||||
uint32_t *pSw2 = _______; // GPIO pin for SW2
|
||||
uint32_t *pLed1 = _______; // GPIO pin for LED1
|
||||
uint32_t *pLed2 = _______; // GPIO pin for LED2
|
||||
|
||||
int main()
|
||||
{
|
||||
// Local Variables
|
||||
uint16_t cmp_1_0m = _____; // CMP value for Pulse Width 1 ms
|
||||
uint16_t cmp_1_5m = _____; // CMP value for Pulse Width 1.5 ms
|
||||
uint16_t cmp_2_0m = _____; // CMP value for Pulse Width 2 ms
|
||||
uint16_t i = 0;
|
||||
bool currSw1, preSw1 = _____;
|
||||
bool currSw2, preSw2 = _____;
|
||||
bool SW1, SW2;
|
||||
STATES state = S_IDLE;
|
||||
|
||||
Setup_123G_40MHz();
|
||||
Setup_1294_60MHz();
|
||||
|
||||
Setup_PWM();
|
||||
Setup_GPIO();
|
||||
|
||||
while (1) {
|
||||
SW1 = SW2 = false;
|
||||
// Read current switches
|
||||
|
||||
|
||||
|
||||
if ( && ){ // Detect the edge for Sw1
|
||||
SW1 = true;
|
||||
}
|
||||
|
||||
if ( && ){ // Detect the edge for Sw2
|
||||
SW2 = true;
|
||||
}
|
||||
preSw1 = currSw1; // Update current state to previous state
|
||||
preSw2 = currSw2; // Update current state to previous state
|
||||
|
||||
switch (state){ // Changed the state based on SW1 and SW2
|
||||
case S_IDLE:
|
||||
|
||||
|
||||
break;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
i++;
|
||||
timer_waitMillis(100); // This is the only delay function in the code.
|
||||
}
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
void Setup_PWM(void)
|
||||
{
|
||||
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
void Setup_GPIO(void)
|
||||
{
|
||||
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
62
Timer/MyDefines.h
Executable file
62
Timer/MyDefines.h
Executable file
@ -0,0 +1,62 @@
|
||||
#ifndef __MYDEFINES_H
|
||||
#define __MYDEFINES_H
|
||||
|
||||
#define _PIN0 0x01
|
||||
#define _PIN1 0x02
|
||||
#define _PIN2 0x04
|
||||
#define _PIN3 0x08
|
||||
#define _PIN4 0x10
|
||||
#define _PIN5 0x20
|
||||
#define _PIN6 0x40
|
||||
#define _PIN7 0x80
|
||||
|
||||
#define _PORTA 0x0001
|
||||
#define _PORTB 0x0002
|
||||
#define _PORTC 0x0004
|
||||
#define _PORTD 0x0008
|
||||
#define _PORTE 0x0010
|
||||
#define _PORTF 0x0020
|
||||
|
||||
|
||||
#define _PWM_MODULE0 0x01
|
||||
#define _PWM_MODULE1 0x02
|
||||
|
||||
#define _PWM0 0x01
|
||||
#define _PWM1 0x02
|
||||
#define _PWM2 0x04
|
||||
#define _PWM3 0x08
|
||||
#define _PWM4 0x10
|
||||
#define _PWM5 0x20
|
||||
#define _PWM6 0x40
|
||||
#define _PWM7 0x80
|
||||
|
||||
#define _PWMDIV_2 0x0
|
||||
#define _PWMDIV_4 0x1
|
||||
#define _PWMDIV_8 0x2
|
||||
#define _PWMDIV_16 0x3
|
||||
#define _PWMDIV_32 0x4
|
||||
#define _PWMDIV_64 0x5
|
||||
|
||||
#define _PWM_LEFT_ALIG_CMPAD ((0x02 << 6) | (0x03 << 2))
|
||||
#define _PWM_LEFT_ALIG_CMPBD ((0x02 << 10) | (0x03 << 2))
|
||||
|
||||
#define _TIMER0 0x01
|
||||
#define _TIMER1 0x02
|
||||
#define _TIMER2 0x04
|
||||
#define _TIMER3 0x08
|
||||
#define _TIMER4 0x10
|
||||
#define _TIMER5 0x20
|
||||
#define _TIMER6 0x40
|
||||
#define _TIMER7 0x80
|
||||
|
||||
#define _TIMERA_ENABLE (1 << 0)
|
||||
#define _TIMERB_ENABLE (1 << 8)
|
||||
#define _TIMERA_COUNTUP (1 << 4)
|
||||
#define _TIMERA_COUNTDOWN (0 << 4)
|
||||
#define _TIMERA_CAPTURE 0x03
|
||||
#define _TIMERA_EDGE_TIME (1 << 2)
|
||||
#define _TIMERA_POSITIVE_EDGE 0
|
||||
#define _TIMERA_NEGATIVE_EDGE (1 << 2)
|
||||
#define _TIMERA_BOTH_EDGES (3 << 2)
|
||||
|
||||
#endif
|
118
Timer/main.c
Executable file
118
Timer/main.c
Executable file
@ -0,0 +1,118 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
#include "MyDefines.h"
|
||||
#include "ez123G.h"
|
||||
void initGPIO(void);
|
||||
void initTimer(void);
|
||||
|
||||
uint32_t deltaT;
|
||||
|
||||
void UltraSonic();
|
||||
uint32_t MeasureD();
|
||||
|
||||
int main(void)
|
||||
{
|
||||
Setup_123G_80MHz(); //Setup System Clock to 80MHz
|
||||
initTimer();
|
||||
initGPIO();
|
||||
|
||||
for(;;){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// trig->pf3 for 123G
|
||||
uint32_t *pf3;
|
||||
void UltraSonic(){
|
||||
uint32_t pulseWidth;
|
||||
//Set "Trig" pin to low for 500ms
|
||||
*pf3 = 00;
|
||||
timer_waitMillis(500); //Waiting for 500 ms
|
||||
//Set "trig" pin to high for 10 us
|
||||
*pf3 = _PIN3; //*pf3 = 0xFF
|
||||
timer_waitMicros(10);
|
||||
//Call MeasureD()
|
||||
pulseWidth = MeasureD();
|
||||
//Calculate deltaT
|
||||
|
||||
//Calculate distance in cm
|
||||
}
|
||||
|
||||
uint32_t MeasureD(){
|
||||
uint32_t highEdge, lowEdge;
|
||||
uint32_t pulseCounter;
|
||||
|
||||
//Capture first edge -- rising edge
|
||||
|
||||
//Clear TimerA Capture mode event by clearing bit on ICR register
|
||||
TIMER1->ICR |= (1 << 2); //CAECINT
|
||||
//Waiting for capture signal by check RIS register
|
||||
while ((TIMER1->RIS & (1<<2)) != (1<<2)){}
|
||||
//read the high Edge from the TAR register
|
||||
highEdge = (TIMER1->TAR) | (TIMER1->TAPS << 16);
|
||||
|
||||
//capture second edge -- falling edge
|
||||
//Clear TimerA Capture mode event by clearing bit on ICR register
|
||||
TIMER1->ICR |= (1 << 2); //CAECINT
|
||||
//Waiting for capture signal by check RIS register
|
||||
while ((TIMER1->RIS & (1<<2)) != (1<<2)){}
|
||||
//read the lowEdge from the TAR register
|
||||
lowEdge = (TIMER1->TAR) | (TIMER1->TAPS << 16);
|
||||
if(highEdge > lowEdge)
|
||||
deltaT = highEdge - lowEdge;
|
||||
else
|
||||
deltaT = highEdge + (0xFFFFFF)- lowEdge;
|
||||
|
||||
return pulseCounter;
|
||||
}
|
||||
|
||||
void initTimer(void){
|
||||
//Enable Clock On Timer Module
|
||||
SYSCTL->RCGCTIMER |= _TIMER1;
|
||||
while((SYSCTL->PRTIMER & (_TIMER1)) != (_TIMER1)){}
|
||||
//Disable Timer A/B
|
||||
TIMER1->CTL &= ~_TIMERA_ENABLE;
|
||||
//Configure Timer
|
||||
TIMER1->CFG = 0x04; //Split into two 16-bit timer
|
||||
//Configure Timer A Mode
|
||||
TIMER1->TAMR = _TIMERA_COUNTDOWN | _TIMERA_CAPTURE | _TIMERA_EDGE_TIME;
|
||||
//Configure Timer Event Mode
|
||||
TIMER1->CTL &= ~(0x03 << 2);
|
||||
TIMER1->CTL |= _TIMERA_BOTH_EDGES;
|
||||
//Config Load
|
||||
TIMER1->TAILR = 0xffff;
|
||||
//Set the prescaler to 15
|
||||
TIMER1->TAPR = 0xff;
|
||||
TIMER1->IMR = 0; // IMR = interrupt mask = 0, disabled all timer IRQ
|
||||
//Enable TImer A
|
||||
TIMER1->CTL |= _TIMERA_ENABLE;
|
||||
}
|
||||
void initGPIO(void){
|
||||
|
||||
// GPIO Configuration
|
||||
// 1. Enable Clock on GPIOF[3:1] (SYSCTL_RCGCGPIO)
|
||||
SYSCTL->RCGCGPIO = 0x20;
|
||||
// allow time for clock to stabilize (SYSCTL_PRGPIO)
|
||||
while((SYSCTL->PRGPIO & 0x20) != 0x20){};
|
||||
// 2. Unlock GPIOC[3:0], GIOD[7] and GPIOF[0] on TM4C123G (GPIOn->LOCK and GPIOn->CR) NOT USING
|
||||
GPIOF->LOCK = 0x4C4F434B;
|
||||
GPIOF->CR |= 0x01;
|
||||
// 3. Clear AMSEL to disable analog
|
||||
GPIOF->AMSEL = 0x00;
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOF->PCTL = 0x0000;
|
||||
//or
|
||||
//GPIOF->PCTL &= 0xFFF00FFF;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOF->DIR = 0x0E; // PF3,PF2,PF1 for Output
|
||||
// 6. Enable AFSEL bits to 1
|
||||
GPIOF->AFSEL = 0x00;
|
||||
// 7. Set PUR bits to 1 to enable internal pull-up
|
||||
GPIOF->PUR = 0x11;
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOF->DEN = 0x1F; // Enable digital pin on PF3,PF2,PF1
|
||||
}
|
62
Ultrasonic/MyDefines.h
Executable file
62
Ultrasonic/MyDefines.h
Executable file
@ -0,0 +1,62 @@
|
||||
#ifndef __MYDEFINES_H
|
||||
#define __MYDEFINES_H
|
||||
|
||||
#define _PIN0 0x01
|
||||
#define _PIN1 0x02
|
||||
#define _PIN2 0x04
|
||||
#define _PIN3 0x08
|
||||
#define _PIN4 0x10
|
||||
#define _PIN5 0x20
|
||||
#define _PIN6 0x40
|
||||
#define _PIN7 0x80
|
||||
|
||||
#define _PORTA 0x0001
|
||||
#define _PORTB 0x0002
|
||||
#define _PORTC 0x0004
|
||||
#define _PORTD 0x0008
|
||||
#define _PORTE 0x0010
|
||||
#define _PORTF 0x0020
|
||||
|
||||
|
||||
#define _PWM_MODULE0 0x01
|
||||
#define _PWM_MODULE1 0x02
|
||||
|
||||
#define _PWM0 0x01
|
||||
#define _PWM1 0x02
|
||||
#define _PWM2 0x04
|
||||
#define _PWM3 0x08
|
||||
#define _PWM4 0x10
|
||||
#define _PWM5 0x20
|
||||
#define _PWM6 0x40
|
||||
#define _PWM7 0x80
|
||||
|
||||
#define _PWMDIV_2 0x0
|
||||
#define _PWMDIV_4 0x1
|
||||
#define _PWMDIV_8 0x2
|
||||
#define _PWMDIV_16 0x3
|
||||
#define _PWMDIV_32 0x4
|
||||
#define _PWMDIV_64 0x5
|
||||
|
||||
#define _PWM_LEFT_ALIG_CMPAD ((0x02 << 6) | (0x03 << 2))
|
||||
#define _PWM_LEFT_ALIG_CMPBD ((0x02 << 10) | (0x03 << 2))
|
||||
|
||||
#define _TIMER0 0x01
|
||||
#define _TIMER1 0x02
|
||||
#define _TIMER2 0x04
|
||||
#define _TIMER3 0x08
|
||||
#define _TIMER4 0x10
|
||||
#define _TIMER5 0x20
|
||||
#define _TIMER6 0x40
|
||||
#define _TIMER7 0x80
|
||||
|
||||
#define _TIMERA_ENABLE (1 << 0)
|
||||
#define _TIMERB_ENABLE (1 << 8)
|
||||
#define _TIMERA_COUNTUP (1 << 4)
|
||||
#define _TIMERA_COUNTDOWN (0 << 4)
|
||||
#define _TIMERA_CAPTURE 0x03
|
||||
#define _TIMERA_EDGE_TIME (1 << 2)
|
||||
#define _TIMERA_POSITIVE_EDGE 0
|
||||
#define _TIMERA_NEGATIVE_EDGE (1 << 2)
|
||||
#define _TIMERA_BOTH_EDGES (3 << 2)
|
||||
|
||||
#endif
|
165
Ultrasonic/main.c
Executable file
165
Ultrasonic/main.c
Executable file
@ -0,0 +1,165 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
#include "ez123G.h"
|
||||
#include "MyDefines.h"
|
||||
|
||||
char str[100];
|
||||
|
||||
void Setup_GPIO(void);
|
||||
uint32_t getWidth();
|
||||
uint32_t measureD(void);
|
||||
void Setup_Timer(void);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
uint16_t i = 0;
|
||||
|
||||
Setup_123G_80MHz();
|
||||
Setup_Timer();
|
||||
Setup_GPIO();
|
||||
|
||||
PEZOBJ_LCD lcd;
|
||||
lcd = ezLCD_Create();
|
||||
ezLCD_Connect_DataPort(lcd, GPIOD, PIN_3_0);
|
||||
ezLCD_Connect_ENPin(lcd, GPIOE, PIN1);
|
||||
ezLCD_Connect_RSPin(lcd, GPIOE, PIN2);
|
||||
ezLCD_Connect_RWPin(lcd, GPIOE, PIN3);
|
||||
|
||||
double time;
|
||||
double distance;
|
||||
uint32_t widthArray[3];
|
||||
uint32_t avgWidth;
|
||||
ezLCD_Start(lcd);
|
||||
ezLCD_LoadVerticalBargraphFonts(lcd);
|
||||
while(1){
|
||||
|
||||
widthArray[0] = getWidth();
|
||||
//widthArray[1] = getWidth();
|
||||
//widthArray[2] = getWidth();
|
||||
//avgWidth = (widthArray[0]+widthArray[1]+widthArray[2])/3;
|
||||
time = widthArray[0] * (1.25E-8);
|
||||
distance = time * (34000/2);
|
||||
|
||||
ezLCD_Position(lcd, 0, 0);
|
||||
sprintf(str,"%d: width: %2d", ++i, widthArray[0]);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
ezLCD_Position(lcd, 1, 0);
|
||||
sprintf(str,"dist(cm): %6.2lf cm \n\r", distance);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
//timer_waitMillis(100);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uint32_t getWidth()
|
||||
{
|
||||
uint32_t pulseWidth = 0;
|
||||
uint32_t *trig = (uint32_t *)(((char*)GPIOF) + (_PIN3 << 2));
|
||||
// Set "Trig" pin to Low
|
||||
*trig = 0x00;
|
||||
timer_waitMillis(500); // Waiting for 500ms
|
||||
// Set "Trig" pin to High for 10ns
|
||||
*trig = 0xFF;
|
||||
timer_waitMicros(10); // Waiting for 10ns
|
||||
// Set "Trig" pin to Low
|
||||
*trig = 0x00;
|
||||
pulseWidth = measureD(); // Call measureD() to get the delta t on the "echo" pin
|
||||
// Calculate distance
|
||||
|
||||
return pulseWidth;
|
||||
}
|
||||
|
||||
uint32_t measureD(void)
|
||||
{
|
||||
uint32_t highEdge,lowEdge;
|
||||
uint32_t deltaT;
|
||||
|
||||
/*Capture firstEgde i.e. rising edge*/
|
||||
//1. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register
|
||||
TIMER1 -> ICR = 1 << 2;
|
||||
//2. Waiting for capture rising edge event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while((TIMER1 -> RIS & (1 << 2)) != (1 << 2)){}
|
||||
//3. Read the highEdge from GPTMTAR (TIMER1->TAR) registers
|
||||
highEdge = TIMER1 -> TAR;
|
||||
/*Capture secondEgde i.e. falling edge*/
|
||||
//4. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register
|
||||
TIMER1 -> ICR = 1 << 2;
|
||||
//5. Waiting for capture falling edge event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while((TIMER1 -> RIS & (1 << 2)) != (1 << 2)){}
|
||||
//6. Read the lowEdge from GPTMTAR (TIMERa->TAR) registers
|
||||
lowEdge = TIMER1 -> TAR;
|
||||
//7. Calculate deltaT = highEdge - lowEdge
|
||||
// Note: the deltaT must large than zero, cannot be negative value
|
||||
if(highEdge > lowEdge){
|
||||
deltaT = highEdge - lowEdge;
|
||||
}else{
|
||||
deltaT = 0xFFFFFFFF - (lowEdge - highEdge);
|
||||
}
|
||||
return deltaT;
|
||||
}
|
||||
|
||||
void Setup_Timer(void)
|
||||
{
|
||||
//* PF2: T1CCP0 (PCTL=07) both edge (edge-time mode)
|
||||
|
||||
// 1 . Enable Clock for TIMER Module
|
||||
SYSCTL->RCGCTIMER |= (_TIMER1);
|
||||
while ((SYSCTL->PRTIMER & (_TIMER1)) != (_TIMER1)) {}
|
||||
// 2. Disable TIMER
|
||||
TIMER1->CTL &= ~(_TIMERA_ENABLE); // Disable TimerA & TimerB
|
||||
// 3. Configure TIMER
|
||||
TIMER1->CFG = 0x04; // Split into two 16-bit timers
|
||||
// 4. Configure Timer n Mode: GPTMTAMR
|
||||
TIMER1->TAMR = (_TIMERA_COUNTDOWN|_TIMERA_EDGE_TIME|_TIMERA_CAPTURE);
|
||||
// 5. Configure Timer Event Mode: rising-, falling-, or both-edges
|
||||
TIMER1->CTL &= ~(0x03 << 2);
|
||||
TIMER1->CTL |= (_TIMERA_BOTH_EDGES); // Both edges
|
||||
// 6. Configure Load
|
||||
TIMER1->TAILR = 0xFFFF;
|
||||
//Set the prescaler to 0xFF
|
||||
TIMER1->TAPR = 0xFF;
|
||||
TIMER1->IMR = 0;
|
||||
// 7. Enable GPTM Timer
|
||||
TIMER1->CTL |= _TIMERA_ENABLE; // Enable TimerB
|
||||
}
|
||||
|
||||
void Setup_GPIO(void)
|
||||
{
|
||||
|
||||
// GPIO Initialization and Configuration
|
||||
// 1. Enable Clock to the GPIO Modules (SYSCTL->RCGCGPIO)
|
||||
SYSCTL->RCGCGPIO |= _PORTD|_PORTE|_PORTF;
|
||||
// allow time for clock to stabilize (SYSCTL->PRGPIO)
|
||||
while((SYSCTL->PRGPIO & (_PORTD|_PORTE|_PORTF)) != (_PORTD|_PORTE|_PORTF)){};
|
||||
// 2. Unlock PD7 and PF0 on TM4C123G; or PD7 on TM4C1294 (GPIO->LOCK and GPIO->CR)
|
||||
// 3. GPIO Analog Mode Select (GPIOAMSEL)
|
||||
GPIOD -> AMSEL = 0x0;
|
||||
GPIOE -> AMSEL = 0x0;
|
||||
GPIOF -> AMSEL = 0x0;
|
||||
// 4. GPIO Port COntrol (GPIOPCTL)
|
||||
GPIOD -> PCTL = 0x0;
|
||||
GPIOE -> PCTL = 0x0;
|
||||
GPIOF -> PCTL = 0x00000700;
|
||||
// 5. Clear AFSEL bits to 0 to select regular I/O
|
||||
GPIOD -> AFSEL = 0x0;
|
||||
GPIOE -> AFSEL = 0x0;
|
||||
GPIOF -> AFSEL |= _PIN2;
|
||||
// 6. GPIO Pin Direction (GPIODIR) 0 for input, 1 for output
|
||||
GPIOD -> DIR |= _PIN0|_PIN1|_PIN2|_PIN3;
|
||||
GPIOE -> DIR |= _PIN1|_PIN2|_PIN3;
|
||||
GPIOF -> DIR |= _PIN3;
|
||||
// 7. Set PUR bits to 1 to enable internal pull-up resistor
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOD -> DEN |= _PIN0|_PIN1|_PIN2|_PIN3;
|
||||
GPIOE -> DEN |= _PIN1|_PIN2|_PIN3;
|
||||
GPIOF -> DEN |= _PIN2|_PIN3;
|
||||
|
||||
}
|
68
addserieslcd.txt
Executable file
68
addserieslcd.txt
Executable file
@ -0,0 +1,68 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
#include "ez123G.h"
|
||||
|
||||
char str[100];
|
||||
|
||||
int main(void)
|
||||
{
|
||||
PEZOBJ_LCD lcd;
|
||||
uint16_t i = 0;
|
||||
|
||||
// Enable GPIOD[3:0] and GPIOE[3:1]
|
||||
// Config for GPIOD and GPIOE
|
||||
// 1. Enable Clock on GPIOs
|
||||
SYSCTL->RCGCGPIO |= 0x18;
|
||||
// allow time for clock to stabilize
|
||||
while ((SYSCTL->PRGPIO & 0x18) != 0x18) {};
|
||||
// 2. Unlock PD7
|
||||
GPIOD->LOCK = 0x4C4F434B;
|
||||
GPIOD->CR |= 0x80;
|
||||
|
||||
// 3. Config AMSEL to disable analog function
|
||||
GPIOD -> AMSEL = 0x00;
|
||||
GPIOE -> AMSEL = 0x00;
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOD -> PCTL = 0x00;
|
||||
GPIOE -> PCTL = 0x00;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOD -> DIR |= 0x0F;
|
||||
GPIOE -> DIR |= 0x0E;
|
||||
|
||||
// 6. Set AFSEL bits to 0
|
||||
GPIOD -> AFSEL = 0x00;
|
||||
GPIOE -> AFSEL = 0x00;
|
||||
// 7. Set PUE bits to 1 to enable internal pull-up (Skipped)
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOD -> DEN |= 0x0F;
|
||||
GPIOE -> DEN |= 0x0E;
|
||||
|
||||
|
||||
lcd = ezLCD_Create();
|
||||
ezLCD_Connect_DataPort(lcd, GPIOD, PIN_3_0);
|
||||
ezLCD_Connect_ENPin(lcd, GPIOE, PIN1);
|
||||
ezLCD_Connect_RSPin(lcd, GPIOE, PIN2);
|
||||
ezLCD_Connect_RWPin(lcd, GPIOE, PIN3);
|
||||
|
||||
ezLCD_Start(lcd);
|
||||
ezLCD_LoadVerticalBargraphFonts(lcd);
|
||||
|
||||
ezLCD_ClearDisplay(lcd);
|
||||
int a = 4;
|
||||
int total = 0;
|
||||
while(a <= 120){
|
||||
ezLCD_Position(lcd, 0, 0);
|
||||
sprintf(str, "+ %d", a);
|
||||
total += a;
|
||||
ezLCD_PrintString(lcd, str);
|
||||
ezLCD_Position(lcd, 1, 0);
|
||||
sprintf(str, "=%d", total);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
a += 2;
|
||||
timer_waitMillis(50);
|
||||
}
|
||||
}
|
81
average.txt
Executable file
81
average.txt
Executable file
@ -0,0 +1,81 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
#include "ez123G.h"
|
||||
|
||||
char str[100];
|
||||
|
||||
int main(void)
|
||||
{
|
||||
PEZOBJ_LCD lcd;
|
||||
uint16_t i = 0;
|
||||
int array[]= {10, 35, 65, 43, 32, 86, 44, 9, 18};
|
||||
|
||||
// Enable GPIOD[3:0] and GPIOE[3:1]
|
||||
// Config for GPIOD and GPIOE
|
||||
// 1. Enable Clock on GPIOs
|
||||
SYSCTL->RCGCGPIO |= 0x18;
|
||||
// allow time for clock to stabilize
|
||||
while ((SYSCTL->PRGPIO & 0x18) != 0x18) {};
|
||||
// 2. Unlock PD7
|
||||
GPIOD->LOCK = 0x4C4F434B;
|
||||
GPIOD->CR |= 0x80;
|
||||
|
||||
// 3. Config AMSEL to disable analog function
|
||||
GPIOD -> AMSEL = 0x00;
|
||||
GPIOE -> AMSEL = 0x00;
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOD -> PCTL = 0x00;
|
||||
GPIOE -> PCTL = 0x00;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOD -> DIR |= 0x0F;
|
||||
GPIOE -> DIR |= 0x0E;
|
||||
|
||||
// 6. Set AFSEL bits to 0
|
||||
GPIOD -> AFSEL = 0x00;
|
||||
GPIOE -> AFSEL = 0x00;
|
||||
// 7. Set PUE bits to 1 to enable internal pull-up (Skipped)
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOD -> DEN |= 0x0F;
|
||||
GPIOE -> DEN |= 0x0E;
|
||||
|
||||
|
||||
lcd = ezLCD_Create();
|
||||
ezLCD_Connect_DataPort(lcd, GPIOD, PIN_3_0);
|
||||
ezLCD_Connect_ENPin(lcd, GPIOE, PIN1);
|
||||
ezLCD_Connect_RSPin(lcd, GPIOE, PIN2);
|
||||
ezLCD_Connect_RWPin(lcd, GPIOE, PIN3);
|
||||
|
||||
ezLCD_Start(lcd);
|
||||
ezLCD_LoadVerticalBargraphFonts(lcd);
|
||||
|
||||
ezLCD_ClearDisplay(lcd);
|
||||
|
||||
int j = 0;
|
||||
int a = 0, s = 0, M = array[0], m = array[0];
|
||||
int total = 0;
|
||||
while(j <= 8){
|
||||
ezLCD_ClearDisplay(lcd);
|
||||
s += array[j];
|
||||
if(array[j] > M) M = array[j];
|
||||
if(array[j] < m) m = array[j];
|
||||
a = s / (j + 1);
|
||||
ezLCD_Position(lcd, 0, 0);
|
||||
sprintf(str, "S=%d", s);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
ezLCD_Position(lcd, 0, 8);
|
||||
sprintf(str, "M=%d", M);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
ezLCD_Position(lcd, 1, 0);
|
||||
sprintf(str, "A=%d", a);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
ezLCD_Position(lcd, 1, 8);
|
||||
sprintf(str, "m=%d", m);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
timer_waitMillis(500);
|
||||
j++;
|
||||
}
|
||||
}
|
39
ezTivaLib/Defines.h
Executable file
39
ezTivaLib/Defines.h
Executable file
@ -0,0 +1,39 @@
|
||||
|
||||
#ifndef __DEFINES_H
|
||||
#define __DEFINES_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/*
|
||||
#if defined(TM4C123GH6PM)
|
||||
#include "TM4C123GH6PM.h"
|
||||
#elif defined(TM4C1294NCPDT)
|
||||
#include "TM4C1294NCPDT.h"
|
||||
#endif
|
||||
*/
|
||||
|
||||
|
||||
#define PIN0 0x01
|
||||
#define PIN1 0x02
|
||||
#define PIN2 0x04
|
||||
#define PIN3 0x08
|
||||
#define PIN4 0x10
|
||||
#define PIN5 0x20
|
||||
#define PIN6 0x40
|
||||
#define PIN7 0x80
|
||||
|
||||
#define BIT0 0x01
|
||||
#define BIT1 0x02
|
||||
#define BIT2 0x04
|
||||
#define BIT3 0x08
|
||||
#define BIT4 0x10
|
||||
#define BIT5 0x20
|
||||
#define BIT6 0x40
|
||||
#define BIT7 0x80
|
||||
|
||||
|
||||
|
||||
#endif
|
14
ezTivaLib/ez123G.h
Executable file
14
ezTivaLib/ez123G.h
Executable file
@ -0,0 +1,14 @@
|
||||
#ifndef __EZ123G_LIB__H
|
||||
#define __EZ123G_LIB__H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "Defines.h"
|
||||
#include "ezTimer.h"
|
||||
#include "ezLCD.h"
|
||||
|
||||
#endif
|
||||
|
||||
|
BIN
ezTivaLib/ez123GLIB.lib
Executable file
BIN
ezTivaLib/ez123GLIB.lib
Executable file
Binary file not shown.
72
ezTivaLib/ezLCD.h
Executable file
72
ezTivaLib/ezLCD.h
Executable file
@ -0,0 +1,72 @@
|
||||
#ifndef __EZLCD_LIB__H
|
||||
#define __EZLCD_LIB__H
|
||||
|
||||
#if defined(TM4C123GH6PM)
|
||||
#include "TM4C123GH6PM.H"
|
||||
typedef GPIOA_Type GPIO_Port;
|
||||
typedef GPIOA_Type* PGPIO_Port;
|
||||
#
|
||||
#elif defined(TM4C1294NCPDT)
|
||||
#include "TM4C1294NCPDT.h"
|
||||
typedef GPIOA_AHB_Type GPIO_Port;
|
||||
typedef GPIOA_AHB_Type* PGPIO_Port;
|
||||
#else
|
||||
#error "The Device NOT specified"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <string.h> // memset
|
||||
#include "ezTimer.h"
|
||||
|
||||
//typedef GPIOA_AHB_Type GPIO_Port;
|
||||
//typedef GPIOA_AHB_Type* PGPIO_Port;
|
||||
|
||||
|
||||
typedef enum {
|
||||
PIN_3_0,
|
||||
PIN_7_4
|
||||
} EZLCD_DATAPORT_PIN;
|
||||
|
||||
typedef struct EZOBJ_LCD{
|
||||
void* PrivateData;
|
||||
} EZOBJ_LCD;
|
||||
typedef EZOBJ_LCD * PEZOBJ_LCD;
|
||||
|
||||
PEZOBJ_LCD ezLCD_Create(void);
|
||||
|
||||
void ezLCD_Connect_DataPort(PEZOBJ_LCD lcd, PGPIO_Port port, EZLCD_DATAPORT_PIN mode);
|
||||
void ezLCD_Connect_ENPin(PEZOBJ_LCD lcd, PGPIO_Port port, uint8_t enpin);
|
||||
void ezLCD_Connect_RSPin(PEZOBJ_LCD lcd, PGPIO_Port port, uint8_t rspin);
|
||||
void ezLCD_Connect_RWPin(PEZOBJ_LCD lcd, PGPIO_Port port, uint8_t rwpin);
|
||||
|
||||
bool ezLCD_Start(PEZOBJ_LCD lcd);
|
||||
void ezLCD_Enable(PEZOBJ_LCD lcd);
|
||||
void ezLCD_DisplayOff(PEZOBJ_LCD lcd);
|
||||
void ezLCD_DisplayOn(PEZOBJ_LCD lcd);
|
||||
|
||||
void ezLCD_ClearDisplay(PEZOBJ_LCD lcd);
|
||||
void ezLCD_Position(PEZOBJ_LCD lcd, uint8_t row, uint8_t column);
|
||||
void ezLCD_LoadVerticalBargraphFonts(PEZOBJ_LCD lcd);
|
||||
void ezLCD_LoadHorizontalBargraphFonts(PEZOBJ_LCD lcd);
|
||||
|
||||
void ezLCD_LoadCustomFonts(PEZOBJ_LCD lcd, uint8_t const customData[]);
|
||||
|
||||
void ezLCD_DrawHorizontalBG(PEZOBJ_LCD lcd, uint8_t row, uint8_t column, uint8_t maxCharacters, uint8_t value);
|
||||
void ezLCD_DrawVerticalBG(PEZOBJ_LCD lcd, uint8_t row, uint8_t column, uint8_t maxCharacters, uint8_t value);
|
||||
|
||||
void ezLCD_PrintString(PEZOBJ_LCD lcd, char const str[]);
|
||||
void ezLCD_PrintInt8(PEZOBJ_LCD lcd, uint8_t value);
|
||||
void ezLCD_PrintInt16(PEZOBJ_LCD lcd, uint16_t value);
|
||||
void ezLCD_PrintInt32(PEZOBJ_LCD lcd, uint32_t value);
|
||||
void ezLCD_PrintNumber(PEZOBJ_LCD lcd, uint16_t value);
|
||||
void ezLCD_Print32Number(PEZOBJ_LCD lcd, uint32_t value);
|
||||
|
||||
#define ezLCD_PrintDecUint16(lcd,x) ezLCD_PrintNumber(lcd,x)
|
||||
#define ezLCD_PrintHexUint8(lcd,x) ezLCD_PrintInt8(lcd,x)
|
||||
#define ezLCD_PrintHexUint16(lcd,x) ezLCD_PrintInt16(lcd,x)
|
||||
|
||||
#endif
|
33
ezTivaLib/ezTimer.h
Executable file
33
ezTivaLib/ezTimer.h
Executable file
@ -0,0 +1,33 @@
|
||||
#ifndef __EZ_1294_LIB_H
|
||||
#define __EZ_1294_LIB_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "Defines.h"
|
||||
|
||||
|
||||
|
||||
#if defined(TM4C123GH6PM)
|
||||
#include "TM4C123GH6PM.h"
|
||||
#elif defined(TM4C1294NCPDT)
|
||||
#include "TM4C1294NCPDT.h"
|
||||
#endif
|
||||
|
||||
|
||||
typedef uint32_t clock_t;
|
||||
|
||||
#if defined(TM4C123GH6PM)
|
||||
void Setup_123G_80MHz(void);
|
||||
#elif defined(TM4C1294NCPDT)
|
||||
void Setup_1294_80MHz(void);
|
||||
#endif
|
||||
|
||||
|
||||
void timer_waitMillis(uint32_t millis);
|
||||
void timer_waitMicros(uint16_t micros);
|
||||
|
||||
|
||||
|
||||
#endif
|
183
firstdraft.txt
Executable file
183
firstdraft.txt
Executable file
@ -0,0 +1,183 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
#include "ez123G.h"
|
||||
#include "MyDefines.h"
|
||||
|
||||
char str[100];
|
||||
|
||||
void Setup_GPIO(void);
|
||||
uint32_t getWidth();
|
||||
uint32_t measureD(void);
|
||||
void Setup_Timer(void);
|
||||
void Setup_PWM(void);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
uint16_t i = 0;
|
||||
|
||||
Setup_123G_80MHz();
|
||||
Setup_Timer();
|
||||
Setup_PWM();
|
||||
Setup_GPIO();
|
||||
|
||||
PEZOBJ_LCD lcd;
|
||||
lcd = ezLCD_Create();
|
||||
ezLCD_Connect_DataPort(lcd, GPIOD, PIN_3_0);
|
||||
ezLCD_Connect_ENPin(lcd, GPIOE, PIN1);
|
||||
ezLCD_Connect_RSPin(lcd, GPIOE, PIN2);
|
||||
ezLCD_Connect_RWPin(lcd, GPIOE, PIN3);
|
||||
|
||||
double time;
|
||||
double distance;
|
||||
uint32_t widthArray[3];
|
||||
uint32_t avgWidth;
|
||||
ezLCD_Start(lcd);
|
||||
ezLCD_LoadVerticalBargraphFonts(lcd);
|
||||
|
||||
|
||||
}
|
||||
|
||||
uint32_t getWidth()
|
||||
{
|
||||
uint32_t pulseWidth = 0;
|
||||
uint32_t *trig = (uint32_t *)(((char*)GPIOF) + (_PIN3 << 2));
|
||||
// Set "Trig" pin to Low
|
||||
*trig = 0x00;
|
||||
timer_waitMillis(500); // Waiting for 500ms
|
||||
// Set "Trig" pin to High for 10ns
|
||||
*trig = 0xFF;
|
||||
timer_waitMicros(10); // Waiting for 10ns
|
||||
// Set "Trig" pin to Low
|
||||
*trig = 0x00;
|
||||
pulseWidth = measureD(); // Call measureD() to get the delta t on the "echo" pin
|
||||
// Calculate distance
|
||||
|
||||
return pulseWidth;
|
||||
}
|
||||
|
||||
uint32_t measureD(void)
|
||||
{
|
||||
uint32_t highEdge,lowEdge;
|
||||
uint32_t deltaT;
|
||||
|
||||
/*Capture firstEgde i.e. rising edge*/
|
||||
//1. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register
|
||||
TIMER1 -> ICR = 1 << 2;
|
||||
//2. Waiting for capture rising edge event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while((TIMER1 -> RIS & (1 << 2)) != (1 << 2)){}
|
||||
//3. Read the highEdge from GPTMTAR (TIMER1->TAR) registers
|
||||
highEdge = TIMER1 -> TAR;
|
||||
/*Capture secondEgde i.e. falling edge*/
|
||||
//4. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register
|
||||
TIMER1 -> ICR = 1 << 2;
|
||||
//5. Waiting for capture falling edge event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while((TIMER1 -> RIS & (1 << 2)) != (1 << 2)){}
|
||||
//6. Read the lowEdge from GPTMTAR (TIMERa->TAR) registers
|
||||
lowEdge = TIMER1 -> TAR;
|
||||
//7. Calculate deltaT = highEdge - lowEdge
|
||||
// Note: the deltaT must large than zero, cannot be negative value
|
||||
if(highEdge > lowEdge){
|
||||
deltaT = highEdge - lowEdge;
|
||||
}else{
|
||||
deltaT = 0xFFFFFFFF - (lowEdge - highEdge);
|
||||
}
|
||||
return deltaT;
|
||||
}
|
||||
|
||||
void Setup_Timer(void)
|
||||
{
|
||||
//* PF2: T1CCP0 (PCTL=07) both edge (edge-time mode)
|
||||
|
||||
// 1 . Enable Clock for TIMER Module
|
||||
SYSCTL->RCGCTIMER |= (_TIMER1);
|
||||
while ((SYSCTL->PRTIMER & (_TIMER1)) != (_TIMER1)) {}
|
||||
// 2. Disable TIMER
|
||||
TIMER1->CTL &= ~(_TIMERA_ENABLE); // Disable TimerA & TimerB
|
||||
// 3. Configure TIMER
|
||||
TIMER1->CFG = 0x04; // Split into two 16-bit timers
|
||||
// 4. Configure Timer n Mode: GPTMTAMR
|
||||
TIMER1->TAMR = (_TIMERA_COUNTDOWN|_TIMERA_EDGE_TIME|_TIMERA_CAPTURE);
|
||||
// 5. Configure Timer Event Mode: rising-, falling-, or both-edges
|
||||
TIMER1->CTL &= ~(0x03 << 2);
|
||||
TIMER1->CTL |= (_TIMERA_BOTH_EDGES); // Both edges
|
||||
// 6. Configure Load
|
||||
TIMER1->TAILR = 0xFFFF;
|
||||
//Set the prescaler to 0xFF
|
||||
TIMER1->TAPR = 0xFF;
|
||||
TIMER1->IMR = 0;
|
||||
// 7. Enable GPTM Timer
|
||||
TIMER1->CTL |= _TIMERA_ENABLE; // Enable TimerB
|
||||
}
|
||||
|
||||
void Setup_GPIO(void)
|
||||
{
|
||||
|
||||
// GPIO Initialization and Configuration
|
||||
// 1. Enable Clock to the GPIO Modules (SYSCTL->RCGCGPIO)
|
||||
SYSCTL->RCGCGPIO |= _PORTD|_PORTE|_PORTF;
|
||||
// allow time for clock to stabilize (SYSCTL->PRGPIO)
|
||||
while((SYSCTL->PRGPIO & (_PORTD|_PORTE|_PORTF)) != (_PORTD|_PORTE|_PORTF)){};
|
||||
// 2. Unlock PD7 and PF0 on TM4C123G; or PD7 on TM4C1294 (GPIO->LOCK and GPIO->CR)
|
||||
// 3. GPIO Analog Mode Select (GPIOAMSEL)
|
||||
GPIOD -> AMSEL = 0x0;
|
||||
GPIOE -> AMSEL = 0x0;
|
||||
GPIOF -> AMSEL = 0x0;
|
||||
// 4. GPIO Port COntrol (GPIOPCTL)
|
||||
GPIOD -> PCTL = 0x0;
|
||||
GPIOE -> PCTL = 0x0;
|
||||
GPIOF -> PCTL = 0x00005750;
|
||||
// 5. Clear AFSEL bits to 0 to select regular I/O
|
||||
GPIOD -> AFSEL = 0x0;
|
||||
GPIOE -> AFSEL = 0x0;
|
||||
GPIOF -> AFSEL |= _PIN1|_PIN2|_PIN3;
|
||||
// 6. GPIO Pin Direction (GPIODIR) 0 for input, 1 for output
|
||||
GPIOD -> DIR |= _PIN0|_PIN1|_PIN2|_PIN3;
|
||||
GPIOE -> DIR |= _PIN1|_PIN2|_PIN3;
|
||||
GPIOF -> DIR |= _PIN1|_PIN3;
|
||||
// 7. Set PUR bits to 1 to enable internal pull-up resistor
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOD -> DEN |= _PIN0|_PIN1|_PIN2|_PIN3;
|
||||
GPIOE -> DEN |= _PIN1|_PIN2|_PIN3;
|
||||
GPIOF -> DEN |= _PIN1|_PIN2|_PIN3;
|
||||
|
||||
}
|
||||
|
||||
void Setup_PWM(){
|
||||
//PF1 M1PWM5 GEN 2
|
||||
//PF3 M1PWM7 GEN 3
|
||||
int load = 8;
|
||||
// 1. Enable Clock for PWM Module 1
|
||||
SYSCTL->RCGCPWM |= _PWM_MODULE1;
|
||||
while((SYSCTL->PRPWM & _PWM_MODULE1)!= _PWM_MODULE1){};
|
||||
// 2. Enable and Setup Clock Divider for PWM
|
||||
SYSCTL->RCC |= (0 << 20); // RCC[20]=1:USEPWMDIV
|
||||
//SYSCTL->RCC &= ~0x000E0000; // RCC[19:17]=000 PWMDIV
|
||||
//SYSCTL->RCC |= (_PWMDIV_2 << 17); // RCC[19:17]=0x04 divider=/32
|
||||
// 3. Disable PWM Generator 2
|
||||
PWM1->_2_CTL &= ~0x01; // Disable PWM Generator 3
|
||||
PWM1->_3_CTL &= ~0x01; // Disable PWM Generator 3
|
||||
// 4. Config LOAD, CMPn, GENn values
|
||||
PWM1->_2_LOAD = load; // GEN 2 B PWM 5 PF1 LED
|
||||
PWM1->_2_CMPB = load/2;
|
||||
PWM1->_2_GENB = _PWM_RIGHT_ALIG_CMPBD;//0x080C
|
||||
|
||||
PWM1->_3_LOAD = load; // GEN 3 B PWM 7 PF3 PWM OUT
|
||||
PWM1->_3_CMPB = load/2;
|
||||
PWM1->_3_GENB = _PWM_RIGHT_ALIG_CMPBD;//0x080C
|
||||
// 5. Enable PWM Generator 2
|
||||
PWM1->_3_CTL |= 0x01;
|
||||
PWM1->_3_CTL |= 0x01;
|
||||
// 6. Enable PWM5 Output
|
||||
PWM1 -> ENABLE |= _PWM5;
|
||||
PWM1 -> ENABLE |= _PWM7;
|
||||
|
||||
|
||||
}
|
269
measureFreqDutyLCD.c
Executable file
269
measureFreqDutyLCD.c
Executable file
@ -0,0 +1,269 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <TM4C123GH6PM.h> // The Header File for EK-TM4C123GXL LaunchPad
|
||||
// #include <TM4C1294NCPDT.h> // The Header File for EK-TM4C1294XL LaunchPad
|
||||
#include "ez123G.h"
|
||||
#include "MyDefines.h" // Your Definitions for the System Configuration
|
||||
|
||||
#define _TIMER_CFG_1632B_TIMER16B (0x4)
|
||||
#define _TIMERA_CAPTURE_EVENT_INT_CLR (1 << 2)
|
||||
#define _TIMERA_CAPTURE_EVENT_INT (1 << 2)
|
||||
#define _TIMERB_CAPTURE_EVENT_INT_CLR (1 << 10)
|
||||
#define _TIMERB_CAPTURE_EVENT_INT (1 << 10)
|
||||
|
||||
float SYSTEM_CLOCK_FREQ = ________;
|
||||
|
||||
typedef enum EDGE_EVENT{
|
||||
FALLING_EDGE,
|
||||
RISING_EDGE
|
||||
|
||||
} EDGE_EVENT;
|
||||
|
||||
void Setup_PWM(void);
|
||||
void Setup_Timer(void);
|
||||
void Setup_GPIO(void);
|
||||
void Setup_UART(void);
|
||||
|
||||
uint32_t MeasurePeriod(void);
|
||||
uint32_t MeasurePulseWidth(void);
|
||||
void UART_PrintString(char * s);
|
||||
|
||||
typedef struct PWM_CONTROL{
|
||||
uint16_t load;
|
||||
uint16_t cmp;
|
||||
} PWM_CONTROL;
|
||||
|
||||
PWM_CONTROL Pwm[]={
|
||||
{18150, 4628},
|
||||
{6665, 3032},
|
||||
{12490, 8118},
|
||||
{49996, 37497},
|
||||
{8328, 2914}
|
||||
};
|
||||
|
||||
// On-board switch
|
||||
uint32_t *Sw = (uint32_t *) (((char*)_____)+ (______ << 2));
|
||||
|
||||
int main()
|
||||
{
|
||||
PEZOBJ_LCD lcd;
|
||||
volatile uint32_t T;
|
||||
volatile uint32_t t;
|
||||
uint32_t freq;
|
||||
double duty;
|
||||
char str[100];
|
||||
int idx = 0;
|
||||
uint8_t i = 0;
|
||||
bool preSw = true;
|
||||
uint16_t currSw;
|
||||
|
||||
Setup_123G_80MHz(); // Setup System Clock to 80 MHz
|
||||
|
||||
Setup_PWM();
|
||||
Setup_Timer();
|
||||
Setup_GPIO();
|
||||
|
||||
lcd = ezLCD_Create();
|
||||
ezLCD_Connect_DataPort(lcd, GPIO____, PIN_3_0);
|
||||
ezLCD_Connect_ENPin(lcd, GPIO____, PIN7);
|
||||
ezLCD_Connect_RSPin(lcd, GPIO____, PIN6);
|
||||
ezLCD_Connect_RWPin(lcd, GPIO____, PIN4);
|
||||
|
||||
ezLCD_Start(lcd);
|
||||
ezLCD_ClearDisplay(lcd);
|
||||
|
||||
PWM0->_1_CTL &= ~0x01; // Disable PWM Module 0, Generator 1
|
||||
PWM1->_3_CTL &= ~0x01; // Disable PWM Module 1, Generator 3
|
||||
PWM0->_1_LOAD = Pwm[idx].load;
|
||||
PWM0->_1_CMPB = Pwm[idx].cmp;
|
||||
PWM1->_3_LOAD = Pwm[idx].load;
|
||||
PWM1->_3_CMPB = Pwm[idx].cmp;
|
||||
PWM0->_1_CTL |= 0x01; // Disable PWM Module 0, Generator 1
|
||||
PWM1->_3_CTL |= 0x01; // Disable PWM Module 1, Generator 3
|
||||
|
||||
while(1){
|
||||
|
||||
currSw = *Sw;
|
||||
if (preSw && (!currSw)){
|
||||
if (++idx >= (sizeof(Pwm) / sizeof(PWM_CONTROL))) idx = 0;
|
||||
PWM0->_1_CTL &= ~0x01; // Disable PWM Module 0, Generator 1
|
||||
PWM1->_3_CTL &= ~0x01; // Disable PWM Module 1, Generator 3
|
||||
PWM0->_1_LOAD = Pwm[idx].load;
|
||||
PWM0->_1_CMPB = Pwm[idx].cmp;
|
||||
PWM1->_3_LOAD = Pwm[idx].load;
|
||||
PWM1->_3_CMPB = Pwm[idx].cmp;
|
||||
PWM0->_1_CTL |= 0x01; // Disable PWM Module 0, Generator 1
|
||||
PWM1->_3_CTL |= 0x01; // Disable PWM Module 1, Generator 3
|
||||
timer_waitMillis(100);
|
||||
}
|
||||
preSw = currSw;
|
||||
|
||||
T = MeasurePeriod();
|
||||
t = MeasurePulseWidth();
|
||||
freq = ____________ ;
|
||||
duty = ____________ ;
|
||||
sprintf(str, "%02d: f%d = %d Hz ", i, idx, freq);
|
||||
ezLCD_Position(lcd, 0,0);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
sprintf(str, "Duty = %.1f %% ", duty);
|
||||
ezLCD_Position(lcd, 1,0);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
i = (++i) % 100;
|
||||
timer_waitMillis(500);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Setup_PWM(void)
|
||||
{
|
||||
ENB
|
||||
|
||||
// 1. Enable Clock for PWM Module
|
||||
SYSCTL->RCGCPWM |= (_______);
|
||||
while((SYSCTL->PRPWM & (_______)) != (_______)){};
|
||||
// 2. Enable and Setup Clock Divider for PWM
|
||||
SYSCTL->RCC |= (1 << 20); // RCC[20]=1:USEPWMDIV
|
||||
SYSCTL->RCC &= ~(0x07 << 17); // RCC[19:17]=000 PWMDIV
|
||||
SYSCTL->RCC |= (________ << 17); // RCC[19:17]=0x04 divider=/32
|
||||
// 3. Disable PWM Generator
|
||||
// 4. Configure LOAD (Period), CMP (Initial Duty), GEN (PWM Mode) values
|
||||
// 5. Enable PWM Generator
|
||||
// 6. Enable PWM Output
|
||||
|
||||
}
|
||||
void Setup_Timer(void)
|
||||
{
|
||||
// 1 . Enable Clock for TIMER
|
||||
SYSCTL->RCGCTIMER |= ________;
|
||||
while ((SYSCTL->PRTIMER & (________)) != (________)) {}
|
||||
// 2. Disable TIMER
|
||||
TIMER_->CTL &= ~(________);
|
||||
// 3. Configure TIMER
|
||||
TIMER_->CFG = _TIMER_CFG_1632B_TIMER16B;
|
||||
// 4. Configure Timer n Mode: GPTMTAMR
|
||||
TIMER_->TAMR = ________;
|
||||
// 5. Configure Timer Event Mode
|
||||
TIMER_->CTL &= ~________;
|
||||
TIMER_->CTL |= ________;
|
||||
// 6. Configure Load
|
||||
TIMER_->TAILR = 0xffff; //0x00000000;
|
||||
//Set the prescaler to 0xff
|
||||
TIMER_->TAPR = 0xff;
|
||||
TIMER_->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
TIMER_->IMR = 0;
|
||||
// 7. Enable GPTM Timer
|
||||
TIMER_->CTL |= ________; // Enable Timer
|
||||
|
||||
}
|
||||
void Setup_GPIO(void)
|
||||
{
|
||||
|
||||
// GPIO Initialization and Configuration
|
||||
// 1. Enable Clock to the GPIO Modules (SYSCTL->RCGCGPIO)
|
||||
SYSCTL->RCGCGPIO |= (_______);
|
||||
// allow time for clock to stabilize (SYSCTL->PRGPIO)
|
||||
while((SYSCTL->PRGPIO & (_______)) != (_______)){};
|
||||
// 2. Unlock PD7 and/or PF0 on TM4C123G (GPIO->LOCK and GPIO->CR)
|
||||
//GPIOF->LOCK = 0x4C4F434B;
|
||||
//GPIOF->CR |= _PIN0;
|
||||
|
||||
//GPIOD_AHB->LOCK = 0x4C4F434B;
|
||||
//while( (GPIOD_AHB->LOCK & 0x01) == 0x01) {};
|
||||
//*(((char*)GPIOD_AHB)+0x524) = 0xFF;
|
||||
|
||||
// 3. GPIO Analog Mode Select (GPIOAMSEL)
|
||||
// 4. GPIO Port COntrol (GPIOPCTL)
|
||||
// 5. Clear AFSEL bits to 0 to select regular I/O
|
||||
// 6. GPIO Pin Direction (GPIODIR) 0 for input, 1 for output
|
||||
// 7. Set PUR bits to 1 to enable internal pull-up resistor
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
|
||||
}
|
||||
|
||||
uint32_t MeasurePeriod(void)
|
||||
{
|
||||
volatile uint32_t edge1;
|
||||
volatile uint32_t edge2;
|
||||
uint32_t load;
|
||||
|
||||
// **** Capture firstEgde i.e. rising edge ****
|
||||
TIMER_->CTL &= ~(_TIMERA_ENABLE);
|
||||
TIMER_->CTL &= ~(_TIMERA_EVENT);
|
||||
TIMER_->CTL |= ________; // Capture on the falling- or rising- edgs
|
||||
TIMER_->CTL |= _TIMERA_ENABLE;
|
||||
|
||||
//1. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register (CnERIS bit)
|
||||
TIMER_->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
//2. Waiting for capture event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while ((TIMER_->RIS & _TIMERA_CAPTURE_EVENT_INT) != _TIMERA_CAPTURE_EVENT_INT) {};
|
||||
//3. Read the capture value from GPTMTAR (TIMER1->TAR) register
|
||||
edge1 = TIMER_->TAR;
|
||||
|
||||
// **** Capture secondEgde i.e. falling edge ****
|
||||
//4. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register
|
||||
TIMER_->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
|
||||
//5. Waiting for capture falling edge event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while ((TIMER_->RIS & _TIMERA_CAPTURE_EVENT_INT) != _TIMERA_CAPTURE_EVENT_INT) {};
|
||||
|
||||
//6. Read the capture value from GPTMTAR (TIMERa->TAR) register
|
||||
edge2 = TIMER_->TAR;
|
||||
|
||||
//7. Calculate deltaT = highEdge - lowEdge
|
||||
// Note: the deltaT must large than zero, cannot be negative value
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
uint32_t MeasurePulseWidth(void)
|
||||
{
|
||||
uint32_t edge1;
|
||||
uint32_t edge2;
|
||||
static uint32_t load;
|
||||
|
||||
// **** Capture first Rising-Edge ****
|
||||
TIMER_->CTL &= ~(_TIMERA_ENABLE);
|
||||
TIMER_->CTL &= ~(_TIMERA_EVENT);
|
||||
TIMER_->CTL |= ________; // Capture on the Rising-Edge
|
||||
TIMER_->CTL |= _TIMERA_ENABLE;
|
||||
|
||||
//1. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register
|
||||
TIMER_->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
//2. Waiting for capture event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while ((TIMER_->RIS & _TIMERA_CAPTURE_EVENT_INT) != _TIMERA_CAPTURE_EVENT_INT) {};
|
||||
//3. Read the capture value from GPTMTAR (TIMER1->TAR) register
|
||||
edge1 = TIMER_->TAR;
|
||||
|
||||
TIMER_->CTL &= ~(_TIMERA_EVENT);
|
||||
TIMER_->CTL |= ________; // Capture on the Falling-Edge
|
||||
|
||||
|
||||
// **** Capture second Egde i.e. falling edge ****
|
||||
//4. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register
|
||||
TIMER_->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
|
||||
//5. Waiting for capture falling edge event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while ((TIMER_->RIS & _TIMERA_CAPTURE_EVENT_INT) != _TIMERA_CAPTURE_EVENT_INT) {};
|
||||
|
||||
//6. Read the capture value from GPTMTAR (TIMERa->TAR) register
|
||||
edge2 = TIMER_->TAR;
|
||||
|
||||
//7. Calculate deltaT = highEdge - lowEdge
|
||||
// Note: the deltaT must large than zero, cannot be negative value
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
297
pwmanalyserfirstdraft.c
Executable file
297
pwmanalyserfirstdraft.c
Executable file
@ -0,0 +1,297 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <TM4C123GH6PM.h> // The Header File for EK-TM4C123GXL LaunchPad
|
||||
// #include <TM4C1294NCPDT.h> // The Header File for EK-TM4C1294XL LaunchPad
|
||||
#include "ez123G.h"
|
||||
#include "MyDefines.h" // Your Definitions for the System Configuration
|
||||
|
||||
#define _TIMER_CFG_1632B_TIMER16B (0x4)
|
||||
#define _TIMERA_CAPTURE_EVENT_INT_CLR (1 << 2)
|
||||
#define _TIMERA_CAPTURE_EVENT_INT (1 << 2)
|
||||
#define _TIMERB_CAPTURE_EVENT_INT_CLR (1 << 10)
|
||||
#define _TIMERB_CAPTURE_EVENT_INT (1 << 10)
|
||||
|
||||
float SYSTEM_CLOCK_FREQ = 80E6;
|
||||
|
||||
typedef enum EDGE_EVENT{
|
||||
FALLING_EDGE,
|
||||
RISING_EDGE
|
||||
|
||||
} EDGE_EVENT;
|
||||
|
||||
void Setup_PWM(void);
|
||||
void Setup_Timer(void);
|
||||
void Setup_GPIO(void);
|
||||
void Setup_UART(void);
|
||||
|
||||
uint32_t MeasurePeriod(void);
|
||||
uint32_t MeasurePulseWidth(void);
|
||||
void UART_PrintString(char * s);
|
||||
|
||||
typedef struct PWM_CONTROL{
|
||||
uint16_t load;
|
||||
uint16_t cmp;
|
||||
} PWM_CONTROL;
|
||||
|
||||
PWM_CONTROL Pwm[]={
|
||||
{18150, 4628},
|
||||
{6665, 3032},
|
||||
{12490, 8118},
|
||||
{49996, 37497},
|
||||
{8328, 2914}
|
||||
};
|
||||
|
||||
// On-board switch
|
||||
uint32_t *Sw = (uint32_t *) (((char*)GPIOF)+ (_PIN4 << 2));
|
||||
|
||||
int main()
|
||||
{
|
||||
PEZOBJ_LCD lcd;
|
||||
volatile uint32_t T;
|
||||
volatile uint32_t t;
|
||||
uint32_t freq;
|
||||
double duty;
|
||||
char str[100];
|
||||
int idx = 0;
|
||||
uint8_t i = 0;
|
||||
bool preSw = true;
|
||||
uint16_t currSw;
|
||||
|
||||
Setup_123G_80MHz(); // Setup System Clock to 80 MHz
|
||||
|
||||
Setup_PWM();
|
||||
Setup_Timer();
|
||||
Setup_GPIO();
|
||||
|
||||
lcd = ezLCD_Create();
|
||||
ezLCD_Connect_DataPort(lcd, GPIOD, PIN_3_0);
|
||||
ezLCD_Connect_ENPin(lcd, GPIOE, PIN1);
|
||||
ezLCD_Connect_RSPin(lcd, GPIOE, PIN2);
|
||||
ezLCD_Connect_RWPin(lcd, GPIOE, PIN3);
|
||||
|
||||
ezLCD_Start(lcd);
|
||||
ezLCD_ClearDisplay(lcd);
|
||||
|
||||
PWM0->_1_CTL &= ~0x01; // Disable PWM Module 0, Generator 1
|
||||
PWM1->_3_CTL &= ~0x01; // Disable PWM Module 1, Generator 3
|
||||
PWM0->_1_LOAD = Pwm[idx].load;
|
||||
PWM0->_1_CMPB = Pwm[idx].cmp;
|
||||
PWM1->_3_LOAD = Pwm[idx].load;
|
||||
PWM1->_3_CMPB = Pwm[idx].cmp;
|
||||
PWM0->_1_CTL |= 0x01; // Disable PWM Module 0, Generator 1
|
||||
PWM1->_3_CTL |= 0x01; // Disable PWM Module 1, Generator 3
|
||||
|
||||
while(1){
|
||||
|
||||
currSw = *Sw;
|
||||
if (preSw && (!currSw)){
|
||||
if (++idx >= (sizeof(Pwm) / sizeof(PWM_CONTROL))) idx = 0;
|
||||
PWM0->_1_CTL &= ~0x01; // Disable PWM Module 0, Generator 1
|
||||
PWM1->_3_CTL &= ~0x01; // Disable PWM Module 1, Generator 3
|
||||
PWM0->_1_LOAD = Pwm[idx].load;
|
||||
PWM0->_1_CMPB = Pwm[idx].cmp;
|
||||
PWM1->_3_LOAD = Pwm[idx].load;
|
||||
PWM1->_3_CMPB = Pwm[idx].cmp;
|
||||
PWM0->_1_CTL |= 0x01; // Disable PWM Module 0, Generator 1
|
||||
PWM1->_3_CTL |= 0x01; // Disable PWM Module 1, Generator 3
|
||||
timer_waitMillis(100);
|
||||
}
|
||||
preSw = currSw;
|
||||
|
||||
T = MeasurePeriod();
|
||||
t = MeasurePulseWidth();
|
||||
freq = 1 / (T * (1.25E-8));
|
||||
duty = (t * 100) / T ;
|
||||
sprintf(str, "%02d: f%d = %d Hz ", i, idx, freq);
|
||||
ezLCD_Position(lcd, 0,0);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
sprintf(str, "Duty = %.1f %% ", duty);
|
||||
ezLCD_Position(lcd, 1,0);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
i = (++i) % 100;
|
||||
timer_waitMillis(500);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Setup_PWM(void)
|
||||
{
|
||||
//PF1 M1PWM5 GEN 2
|
||||
//PF3 M1PWM7 GEN 3
|
||||
int load = 8;
|
||||
// 1. Enable Clock for PWM Module 1
|
||||
SYSCTL->RCGCPWM |= _PWM_MODULE1;
|
||||
while((SYSCTL->PRPWM & _PWM_MODULE1)!= _PWM_MODULE1){};
|
||||
// 2. Enable and Setup Clock Divider for PWM
|
||||
SYSCTL->RCC |= (0 << 20); // RCC[20]=1:USEPWMDIV
|
||||
//SYSCTL->RCC &= ~0x000E0000; // RCC[19:17]=000 PWMDIV
|
||||
//SYSCTL->RCC |= (_PWMDIV_2 << 17); // RCC[19:17]=0x04 divider=/32
|
||||
// 3. Disable PWM Generator 2
|
||||
PWM1->_2_CTL &= ~0x01; // Disable PWM Generator 3
|
||||
PWM1->_3_CTL &= ~0x01; // Disable PWM Generator 3
|
||||
// 4. Config LOAD, CMPn, GENn values
|
||||
PWM1->_2_LOAD = load; // GEN 2 B PWM 5 PF1 LED
|
||||
PWM1->_2_CMPB = load/2;
|
||||
PWM1->_2_GENB = _PWM_RIGHT_ALIG_CMPBD;//0x080C
|
||||
|
||||
PWM1->_3_LOAD = load; // GEN 3 B PWM 7 PF3 PWM OUT
|
||||
PWM1->_3_CMPB = load/2;
|
||||
PWM1->_3_GENB = _PWM_RIGHT_ALIG_CMPBD;//0x080C
|
||||
// 5. Enable PWM Generator 2
|
||||
PWM1->_3_CTL |= 0x01;
|
||||
PWM1->_3_CTL |= 0x01;
|
||||
// 6. Enable PWM5 Output
|
||||
PWM1 -> ENABLE |= _PWM5;
|
||||
PWM1 -> ENABLE |= _PWM7;
|
||||
|
||||
}
|
||||
void Setup_Timer(void)
|
||||
{
|
||||
// 1 . Enable Clock for TIMER
|
||||
SYSCTL->RCGCTIMER |= _TIMER1;
|
||||
while ((SYSCTL->PRTIMER & (_TIMER1)) != (_TIMER1)) {}
|
||||
// 2. Disable TIMER
|
||||
TIMER1->CTL &= ~(_TIMERA_ENABLE);
|
||||
// 3. Configure TIMER
|
||||
TIMER1->CFG = _TIMER_CFG_1632B_TIMER16B;
|
||||
// 4. Configure Timer n Mode: GPTMTAMR
|
||||
TIMER1->TAMR = (_TIMERA_COUNTDOWN|_TIMERA_EDGE_TIME|_TIMERA_CAPTURE);
|
||||
// 5. Configure Timer Event Mode
|
||||
TIMER1->CTL &= ~(0x03 << 2);
|
||||
TIMER1->CTL |= _TIMERA_BOTH_EDGES;
|
||||
// 6. Configure Load
|
||||
TIMER1->TAILR = 0xffff; //0x00000000;
|
||||
//Set the prescaler to 0xff
|
||||
TIMER1->TAPR = 0xff;
|
||||
TIMER1->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
TIMER1->IMR = 0;
|
||||
// 7. Enable GPTM Timer
|
||||
TIMER1->CTL |= _TIMERA_ENABLE; // Enable Timer
|
||||
|
||||
}
|
||||
void Setup_GPIO(void)
|
||||
{
|
||||
|
||||
// GPIO Initialization and Configuration
|
||||
// 1. Enable Clock to the GPIO Modules (SYSCTL->RCGCGPIO)
|
||||
SYSCTL->RCGCGPIO |= _PORTD|_PORTE|_PORTF;
|
||||
// allow time for clock to stabilize (SYSCTL->PRGPIO)
|
||||
while((SYSCTL->PRGPIO & (_PORTD|_PORTE|_PORTF)) != (_PORTD|_PORTE|_PORTF)){};
|
||||
// 2. Unlock PD7 and PF0 on TM4C123G; or PD7 on TM4C1294 (GPIO->LOCK and GPIO->CR)
|
||||
// 3. GPIO Analog Mode Select (GPIOAMSEL)
|
||||
GPIOD -> AMSEL = 0x0;
|
||||
GPIOE -> AMSEL = 0x0;
|
||||
GPIOF -> AMSEL = 0x0;
|
||||
// 4. GPIO Port Control (GPIOPCTL)
|
||||
GPIOD -> PCTL = 0x0;
|
||||
GPIOE -> PCTL = 0x0;
|
||||
GPIOF -> PCTL = 0x00005750;
|
||||
// 5. Clear AFSEL bits to 0 to select regular I/O
|
||||
GPIOD -> AFSEL = 0x0;
|
||||
GPIOE -> AFSEL = 0x0;
|
||||
GPIOF -> AFSEL |= _PIN1|_PIN2|_PIN3;
|
||||
// 6. GPIO Pin Direction (GPIODIR) 0 for input, 1 for output
|
||||
GPIOD -> DIR |= _PIN0|_PIN1|_PIN2|_PIN3;
|
||||
GPIOE -> DIR |= _PIN1|_PIN2|_PIN3;
|
||||
GPIOF -> DIR |= _PIN1|_PIN3;
|
||||
// 7. Set PUR bits to 1 to enable internal pull-up resistor
|
||||
GPIOF -> PUR |= _PIN4;
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOD -> DEN |= _PIN0|_PIN1|_PIN2|_PIN3;
|
||||
GPIOE -> DEN |= _PIN1|_PIN2|_PIN3;
|
||||
GPIOF -> DEN |= _PIN1|_PIN2|_PIN3|_PIN4;
|
||||
}
|
||||
|
||||
uint32_t MeasurePeriod(void)
|
||||
{
|
||||
volatile uint32_t edge1;
|
||||
volatile uint32_t edge2;
|
||||
uint32_t load;
|
||||
|
||||
// **** Capture firstEgde i.e. rising edge ****
|
||||
TIMER1->CTL &= ~(_TIMERA_ENABLE);
|
||||
TIMER1->CTL &= ~(0x03);
|
||||
TIMER1->CTL |= _TIMERA_POSITIVE_EDGE; // Capture on the falling- or rising- edgs
|
||||
TIMER1->CTL |= _TIMERA_ENABLE;
|
||||
|
||||
//1. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register (CnERIS bit)
|
||||
TIMER1->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
//2. Waiting for capture event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while ((TIMER1->RIS & _TIMERA_CAPTURE_EVENT_INT) != _TIMERA_CAPTURE_EVENT_INT) {};
|
||||
//3. Read the capture value from GPTMTAR (TIMER1->TAR) register
|
||||
edge1 = TIMER1->TAR;
|
||||
|
||||
// **** Capture secondEgde i.e. falling edge ****
|
||||
//4. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register
|
||||
TIMER1->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
|
||||
//5. Waiting for capture falling edge event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while ((TIMER1->RIS & _TIMERA_CAPTURE_EVENT_INT) != _TIMERA_CAPTURE_EVENT_INT) {};
|
||||
|
||||
//6. Read the capture value from GPTMTAR (TIMERa->TAR) register
|
||||
edge2 = TIMER1->TAR;
|
||||
|
||||
//7. Calculate deltaT = highEdge - lowEdge
|
||||
// Note: the deltaT must large than zero, cannot be negative value
|
||||
if(edge1 > edge2){
|
||||
return edge1 - edge2;
|
||||
}else{
|
||||
return (0xFFFFFFFF - (edge2 - edge1));
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t MeasurePulseWidth(void)
|
||||
{
|
||||
uint32_t edge1;
|
||||
uint32_t edge2;
|
||||
static uint32_t load;
|
||||
|
||||
// **** Capture first Rising-Edge ****
|
||||
TIMER1->CTL &= ~(_TIMERA_ENABLE);
|
||||
TIMER1->CTL &= ~(0x03);
|
||||
TIMER1->CTL |= _TIMERA_POSITIVE_EDGE; // Capture on the Rising-Edge
|
||||
TIMER1->CTL |= _TIMERA_ENABLE;
|
||||
|
||||
//1. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register
|
||||
TIMER1->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
//2. Waiting for capture event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while ((TIMER1->RIS & _TIMERA_CAPTURE_EVENT_INT) != _TIMERA_CAPTURE_EVENT_INT) {};
|
||||
//3. Read the capture value from GPTMTAR (TIMER1->TAR) register
|
||||
edge1 = TIMER1->TAR;
|
||||
|
||||
TIMER1->CTL &= ~(0x03);
|
||||
TIMER1->CTL |= _TIMERA_NEGATIVE_EDGE; // Capture on the Falling-Edge
|
||||
|
||||
|
||||
// **** Capture second Egde i.e. falling edge ****
|
||||
//4. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register
|
||||
TIMER1->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
|
||||
//5. Waiting for capture falling edge event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while ((TIMER1->RIS & _TIMERA_CAPTURE_EVENT_INT) != _TIMERA_CAPTURE_EVENT_INT) {};
|
||||
|
||||
//6. Read the capture value from GPTMTAR (TIMERa->TAR) register
|
||||
edge2 = TIMER1->TAR;
|
||||
|
||||
//7. Calculate deltaT = highEdge - lowEdge
|
||||
// Note: the deltaT must large than zero, cannot be negative value
|
||||
if(edge1 > edge2){
|
||||
return edge1 - edge2;
|
||||
}else{
|
||||
return (0xFFFFFFFF - (edge2 - edge1));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
65
pwmmeasurer/MyDefines.h
Executable file
65
pwmmeasurer/MyDefines.h
Executable file
@ -0,0 +1,65 @@
|
||||
#ifndef __MYDEFINES_H
|
||||
#define __MYDEFINES_H
|
||||
|
||||
#define _PIN0 0x01
|
||||
#define _PIN1 0x02
|
||||
#define _PIN2 0x04
|
||||
#define _PIN3 0x08
|
||||
#define _PIN4 0x10
|
||||
#define _PIN5 0x20
|
||||
#define _PIN6 0x40
|
||||
#define _PIN7 0x80
|
||||
|
||||
#define _PORTA 0x0001
|
||||
#define _PORTB 0x0002
|
||||
#define _PORTC 0x0004
|
||||
#define _PORTD 0x0008
|
||||
#define _PORTE 0x0010
|
||||
#define _PORTF 0x0020
|
||||
|
||||
|
||||
#define _PWM_MODULE0 0x01
|
||||
#define _PWM_MODULE1 0x02
|
||||
|
||||
#define _PWM0 0x01
|
||||
#define _PWM1 0x02
|
||||
#define _PWM2 0x04
|
||||
#define _PWM3 0x08
|
||||
#define _PWM4 0x10
|
||||
#define _PWM5 0x20
|
||||
#define _PWM6 0x40
|
||||
#define _PWM7 0x80
|
||||
|
||||
#define _PWMDIV_2 0x0
|
||||
#define _PWMDIV_4 0x1
|
||||
#define _PWMDIV_8 0x2
|
||||
#define _PWMDIV_16 0x3
|
||||
#define _PWMDIV_32 0x4
|
||||
#define _PWMDIV_64 0x5
|
||||
|
||||
#define _PWM_LEFT_ALIG_CMPAD ((0x02 << 6) | (0x03 << 2))
|
||||
#define _PWM_LEFT_ALIG_CMPBD ((0x02 << 10) | (0x03 << 2))
|
||||
|
||||
#define _PWM_RIGHT_ALIG_CMPAD ((0x03 << 6) | (0x02 << 2))
|
||||
#define _PWM_RIGHT_ALIG_CMPBD ((0x03 << 10) | (0x02 << 2))
|
||||
|
||||
#define _TIMER0 0x01
|
||||
#define _TIMER1 0x02
|
||||
#define _TIMER2 0x04
|
||||
#define _TIMER3 0x08
|
||||
#define _TIMER4 0x10
|
||||
#define _TIMER5 0x20
|
||||
#define _TIMER6 0x40
|
||||
#define _TIMER7 0x80
|
||||
|
||||
#define _TIMERA_ENABLE (1 << 0)
|
||||
#define _TIMERB_ENABLE (1 << 8)
|
||||
#define _TIMERA_COUNTUP (1 << 4)
|
||||
#define _TIMERA_COUNTDOWN (0 << 4)
|
||||
#define _TIMERA_CAPTURE 0x03
|
||||
#define _TIMERA_EDGE_TIME (1 << 2)
|
||||
#define _TIMERA_POSITIVE_EDGE 0
|
||||
#define _TIMERA_NEGATIVE_EDGE (1 << 2)
|
||||
#define _TIMERA_BOTH_EDGES (3 << 2)
|
||||
|
||||
#endif
|
314
pwmmeasurer/main.c
Executable file
314
pwmmeasurer/main.c
Executable file
@ -0,0 +1,314 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "TM4C123GH6PM.h" // The Header File for EK-TM4C123GXL LaunchPad
|
||||
#include "ez123G.h"
|
||||
#include "MyDefines.h" // Your Definitions for the System Configuration
|
||||
|
||||
#define _TIMER_CFG_1632B_TIMER16B (0x4)
|
||||
#define _TIMERA_CAPTURE_EVENT_INT_CLR (1 << 2)
|
||||
#define _TIMERA_CAPTURE_EVENT_INT (1 << 2)
|
||||
#define _TIMERB_CAPTURE_EVENT_INT_CLR (1 << 10)
|
||||
#define _TIMERB_CAPTURE_EVENT_INT (1 << 10)
|
||||
|
||||
float SYSTEM_CLOCK_FREQ = 80E6;
|
||||
|
||||
typedef enum EDGE_EVENT{
|
||||
FALLING_EDGE,
|
||||
RISING_EDGE
|
||||
|
||||
} EDGE_EVENT;
|
||||
|
||||
void Setup_PWM(void);
|
||||
void Setup_Timer(void);
|
||||
void Setup_GPIO(void);
|
||||
|
||||
uint32_t MeasurePeriod(void);
|
||||
uint32_t MeasurePulseWidth(void);
|
||||
|
||||
typedef struct PWM_CONTROL{
|
||||
uint16_t load;
|
||||
uint16_t cmp;
|
||||
} PWM_CONTROL;
|
||||
|
||||
PWM_CONTROL Pwm[]={
|
||||
{18150, 4628},
|
||||
{6665, 3032},
|
||||
{12490, 8118},
|
||||
{49996, 37497},
|
||||
{8328, 2914}
|
||||
};
|
||||
|
||||
// On-board switch
|
||||
uint32_t *Sw = (uint32_t *) (((char*)GPIOF)+ (_PIN4 << 2));
|
||||
|
||||
int main()
|
||||
{
|
||||
PEZOBJ_LCD lcd;
|
||||
volatile uint32_t T;
|
||||
volatile uint32_t t;
|
||||
uint32_t freq;
|
||||
double duty;
|
||||
char str[100];
|
||||
int idx = 0;
|
||||
uint8_t i = 0;
|
||||
bool preSw = true;
|
||||
uint16_t currSw;
|
||||
|
||||
Setup_123G_80MHz(); // Setup System Clock to 80 MHz
|
||||
|
||||
Setup_PWM();
|
||||
Setup_Timer();
|
||||
Setup_GPIO();
|
||||
|
||||
lcd = ezLCD_Create();
|
||||
ezLCD_Connect_DataPort(lcd, GPIOD, PIN_3_0);
|
||||
ezLCD_Connect_ENPin(lcd, GPIOE, PIN1);
|
||||
ezLCD_Connect_RSPin(lcd, GPIOE, PIN2);
|
||||
ezLCD_Connect_RWPin(lcd, GPIOE, PIN3);
|
||||
|
||||
ezLCD_Start(lcd);
|
||||
ezLCD_LoadVerticalBargraphFonts(lcd);
|
||||
ezLCD_ClearDisplay(lcd);
|
||||
//ezLCD_PrintString(lcd, "HELLO WORLD");
|
||||
|
||||
PWM0->_1_CTL &= ~0x01; // Disable PWM Module 0, Generator 1
|
||||
PWM1->_3_CTL &= ~0x01; // Disable PWM Module 1, Generator 3
|
||||
PWM0->_1_LOAD = Pwm[idx].load;
|
||||
PWM0->_1_CMPB = Pwm[idx].cmp;
|
||||
PWM1->_3_LOAD = Pwm[idx].load;
|
||||
PWM1->_3_CMPB = Pwm[idx].cmp;
|
||||
PWM0->_1_CTL |= 0x01; // Disable PWM Module 0, Generator 1
|
||||
PWM1->_3_CTL |= 0x01; // Disable PWM Module 1, Generator 3
|
||||
|
||||
while(1){
|
||||
|
||||
currSw = *Sw;
|
||||
if (preSw && (!currSw)){
|
||||
if (++idx >= (sizeof(Pwm) / sizeof(PWM_CONTROL))) idx = 0;
|
||||
PWM0->_1_CTL &= ~0x01; // Disable PWM Module 0, Generator 1
|
||||
PWM1->_3_CTL &= ~0x01; // Disable PWM Module 1, Generator 3
|
||||
PWM0->_1_LOAD = Pwm[idx].load;
|
||||
PWM0->_1_CMPB = Pwm[idx].cmp;
|
||||
PWM1->_3_LOAD = Pwm[idx].load;
|
||||
PWM1->_3_CMPB = Pwm[idx].cmp;
|
||||
PWM0->_1_CTL |= 0x01; // Disable PWM Module 0, Generator 1
|
||||
PWM1->_3_CTL |= 0x01; // Disable PWM Module 1, Generator 3
|
||||
timer_waitMillis(100);
|
||||
}
|
||||
preSw = currSw;
|
||||
|
||||
T = MeasurePeriod();
|
||||
t = MeasurePulseWidth();
|
||||
freq = 1 / (T * (1.25E-8));
|
||||
duty = (t * 100)/T ;
|
||||
sprintf(str, "%02d: f%d = %d Hz ", i, idx, freq);
|
||||
ezLCD_Position(lcd, 0,0);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
sprintf(str, "Duty = %.1f %% ", duty);
|
||||
ezLCD_Position(lcd, 1,0);
|
||||
ezLCD_PrintString(lcd, str);
|
||||
i = (++i) % 100;
|
||||
timer_waitMillis(500);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Setup_PWM(void)
|
||||
{
|
||||
// M0 GEN 1 B PWM 3 PB5 PWM
|
||||
// M1 GEN 3 B PWM 7 PF3 LED
|
||||
|
||||
// 1. Enable Clock for PWM Module
|
||||
SYSCTL->RCGCPWM |= (_PWM_MODULE0|_PWM_MODULE1);
|
||||
while((SYSCTL->PRPWM & (_PWM_MODULE0|_PWM_MODULE1)) != (_PWM_MODULE0|_PWM_MODULE1)){};
|
||||
// 2. Enable and Setup Clock Divider for PWM
|
||||
SYSCTL->RCC |= (1 << 20); // RCC[20]=1:USEPWMDIV
|
||||
SYSCTL->RCC &= ~(0x07 << 17); // RCC[19:17]=000 PWMDIV
|
||||
SYSCTL->RCC |= (_PWMDIV_8 << 17); // RCC[19:17]=0x04 divider=/32
|
||||
// 3. Disable PWM Generator
|
||||
PWM0->_1_CTL &= ~0x01; // Disable PWM Generator 1
|
||||
PWM1->_3_CTL &= ~0x01; // Disable PWM Generator 3
|
||||
// 4. Configure LOAD (Period), CMP (Initial Duty), GEN (PWM Mode) values
|
||||
PWM0->_1_LOAD = 18150;
|
||||
PWM0->_1_CMPB = 4628;
|
||||
PWM1->_3_LOAD = 18150;
|
||||
PWM1->_3_CMPB = 4628;
|
||||
|
||||
PWM0 -> _1_GENB = _PWM_RIGHT_ALIG_CMPBD;
|
||||
PWM1 -> _3_GENB = _PWM_RIGHT_ALIG_CMPBD;
|
||||
// 5. Enable PWM Generator
|
||||
PWM0->_1_CTL |= 0x01;
|
||||
PWM1->_3_CTL |= 0x01;
|
||||
// 6. Enable PWM Output
|
||||
PWM0 -> ENABLE = _PWM3;
|
||||
PWM1 -> ENABLE = _PWM7;
|
||||
|
||||
|
||||
}
|
||||
void Setup_Timer(void)
|
||||
{
|
||||
//PF2 T1CCP0
|
||||
|
||||
// 1 . Enable Clock for TIMER
|
||||
SYSCTL->RCGCTIMER |= _TIMER1;
|
||||
while ((SYSCTL->PRTIMER & (_TIMER1)) != (_TIMER1)) {}
|
||||
// 2. Disable TIMER
|
||||
TIMER1->CTL &= ~(_TIMERA_ENABLE);
|
||||
// 3. Configure TIMER
|
||||
TIMER1->CFG = _TIMER_CFG_1632B_TIMER16B;
|
||||
// 4. Configure Timer n Mode: GPTMTAMR
|
||||
TIMER1->TAMR = (_TIMERA_COUNTDOWN|_TIMERA_EDGE_TIME|_TIMERA_CAPTURE);
|
||||
// 5. Configure Timer Event Mode
|
||||
TIMER1->CTL &= ~(0x03 << 2);
|
||||
TIMER1->CTL |= _TIMERA_BOTH_EDGES;
|
||||
// 6. Configure Load
|
||||
TIMER1->TAILR = 0xffff; //0x00000000;
|
||||
//Set the prescaler to 0xff
|
||||
TIMER1->TAPR = 0xff;
|
||||
TIMER1->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
TIMER1->IMR = 0;
|
||||
// 7. Enable GPTM Timer
|
||||
TIMER1->CTL |= _TIMERA_ENABLE; // Enable Timer
|
||||
|
||||
}
|
||||
void Setup_GPIO(void)
|
||||
{
|
||||
|
||||
// GPIO Initialization and Configuration
|
||||
// 1. Enable Clock to the GPIO Modules (SYSCTL->RCGCGPIO)
|
||||
SYSCTL->RCGCGPIO |= (_PORTB|_PORTD|_PORTE|_PORTF);
|
||||
// allow time for clock to stabilize (SYSCTL->PRGPIO)
|
||||
while((SYSCTL->PRGPIO & (_PORTB|_PORTD|_PORTE|_PORTF)) != (_PORTB|_PORTD|_PORTE|_PORTF)){};
|
||||
// 2. Unlock PD7 and/or PF0 on TM4C123G (GPIO->LOCK and GPIO->CR)
|
||||
//GPIOF->LOCK = 0x4C4F434B;
|
||||
//GPIOF->CR |= _PIN0;
|
||||
|
||||
//GPIOD_AHB->LOCK = 0x4C4F434B;
|
||||
//while( (GPIOD_AHB->LOCK & 0x01) == 0x01) {};
|
||||
//*(((char*)GPIOD_AHB)+0x524) = 0xFF;
|
||||
|
||||
// 3. GPIO Analog Mode Select (GPIOAMSEL)
|
||||
GPIOB -> AMSEL = 0x00;
|
||||
GPIOD -> AMSEL = 0x00;
|
||||
GPIOE -> AMSEL = 0x00;
|
||||
GPIOF -> AMSEL = 0x00;
|
||||
// 4. GPIO Port COntrol (GPIOPCTL)
|
||||
GPIOB -> PCTL = 0x00400000;
|
||||
GPIOD -> PCTL = 0x00;
|
||||
GPIOE -> PCTL = 0x00;
|
||||
GPIOF -> PCTL = 0x00005700;
|
||||
// 5. Clear AFSEL bits to 0 to select regular I/O
|
||||
GPIOB -> AFSEL |= _PIN5;
|
||||
GPIOD -> AFSEL = 0x0;
|
||||
GPIOE -> AFSEL = 0x0;
|
||||
GPIOF -> AFSEL |= (_PIN2|_PIN3);
|
||||
// 6. GPIO Pin Direction (GPIODIR) 0 for input, 1 for output
|
||||
GPIOB -> DIR |= (_PIN5);
|
||||
GPIOD -> DIR |= (_PIN0|_PIN1|_PIN2|_PIN3);
|
||||
GPIOE -> DIR |= (_PIN1|_PIN2|_PIN3);
|
||||
GPIOF -> DIR |= (_PIN3);
|
||||
// 7. Set PUR bits to 1 to enable internal pull-up resistor
|
||||
GPIOF -> PUR |= (_PIN4);
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOB -> DEN |= (_PIN5);
|
||||
GPIOD -> DEN |= (_PIN0|_PIN1|_PIN2|_PIN3);
|
||||
GPIOE -> DEN |= (_PIN1|_PIN2|_PIN3);
|
||||
GPIOF -> DEN |= (_PIN2|_PIN3|_PIN4);
|
||||
|
||||
}
|
||||
|
||||
uint32_t MeasurePeriod(void)
|
||||
{
|
||||
volatile uint32_t edge1;
|
||||
volatile uint32_t edge2;
|
||||
uint32_t load;
|
||||
|
||||
// **** Capture firstEgde i.e. rising edge ****
|
||||
TIMER1->CTL &= ~(_TIMERA_ENABLE);
|
||||
TIMER1->CTL &= ~(0x03 << 2);
|
||||
TIMER1->CTL |= _TIMERA_POSITIVE_EDGE; // Capture on the falling- or rising- edgs
|
||||
TIMER1->CTL |= _TIMERA_ENABLE;
|
||||
|
||||
//1. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register (CnERIS bit)
|
||||
TIMER1->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
//2. Waiting for capture event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while ((TIMER1->RIS & _TIMERA_CAPTURE_EVENT_INT) != _TIMERA_CAPTURE_EVENT_INT) {};
|
||||
//3. Read the capture value from GPTMTAR (TIMER1->TAR) register
|
||||
edge1 = TIMER1->TAR;
|
||||
|
||||
// **** Capture secondEgde i.e. falling edge ****
|
||||
//4. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register
|
||||
TIMER1->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
|
||||
//5. Waiting for capture falling edge event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while ((TIMER1->RIS & _TIMERA_CAPTURE_EVENT_INT) != _TIMERA_CAPTURE_EVENT_INT) {};
|
||||
|
||||
//6. Read the capture value from GPTMTAR (TIMERa->TAR) register
|
||||
edge2 = TIMER1->TAR;
|
||||
|
||||
//7. Calculate deltaT = highEdge - lowEdge
|
||||
// Note: the deltaT must large than zero, cannot be negative value
|
||||
if(edge1 > edge2){
|
||||
return edge1 - edge2;
|
||||
}else{
|
||||
return (0xFFFFFFFF - (edge2 - edge1));
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
uint32_t MeasurePulseWidth(void)
|
||||
{
|
||||
uint32_t edge1;
|
||||
uint32_t edge2;
|
||||
static uint32_t load;
|
||||
|
||||
// **** Capture first Rising-Edge ****
|
||||
TIMER1->CTL &= ~(_TIMERA_ENABLE);
|
||||
TIMER1->CTL &= ~(0x03 << 2);
|
||||
TIMER1->CTL |= _TIMERA_POSITIVE_EDGE; // Capture on the Rising-Edge
|
||||
TIMER1->CTL |= _TIMERA_ENABLE;
|
||||
|
||||
//1. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register
|
||||
TIMER1->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
//2. Waiting for capture event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while ((TIMER1->RIS & _TIMERA_CAPTURE_EVENT_INT) != _TIMERA_CAPTURE_EVENT_INT) {};
|
||||
//3. Read the capture value from GPTMTAR (TIMER1->TAR) register
|
||||
edge1 = TIMER1->TAR;
|
||||
|
||||
TIMER1->CTL &= ~(0x03 << 2);
|
||||
TIMER1->CTL |= _TIMERA_NEGATIVE_EDGE; // Capture on the Falling-Edge
|
||||
|
||||
|
||||
// **** Capture second Egde i.e. falling edge ****
|
||||
//4. Clear GPTM Timer A Capture Mode Event by writing 1 to
|
||||
// corresponding bit on GPTMICR (TIMER1->ICR) register
|
||||
TIMER1->ICR = _TIMERA_CAPTURE_EVENT_INT_CLR;
|
||||
|
||||
//5. Waiting for capture falling edge event by check the GPTM Raw Interrupt Status
|
||||
// GPTMRIS (TIMER1->RIS) register
|
||||
while ((TIMER1->RIS & _TIMERA_CAPTURE_EVENT_INT) != _TIMERA_CAPTURE_EVENT_INT) {};
|
||||
|
||||
//6. Read the capture value from GPTMTAR (TIMERa->TAR) register
|
||||
edge2 = TIMER1->TAR;
|
||||
|
||||
//7. Calculate deltaT = highEdge - lowEdge
|
||||
// Note: the deltaT must large than zero, cannot be negative value
|
||||
if(edge1 > edge2){
|
||||
return edge1 - edge2;
|
||||
}else{
|
||||
return (0xFFFFFFFF - (edge2 - edge1));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
43
servo/MyDefines.h
Executable file
43
servo/MyDefines.h
Executable file
@ -0,0 +1,43 @@
|
||||
#ifndef __MYDEFINES_H
|
||||
#define __MYDEFINES_H
|
||||
|
||||
#define _PIN0 0x01
|
||||
#define _PIN1 0x02
|
||||
#define _PIN2 0x04
|
||||
#define _PIN3 0x08
|
||||
#define _PIN4 0x10
|
||||
#define _PIN5 0x20
|
||||
#define _PIN6 0x40
|
||||
#define _PIN7 0x80
|
||||
|
||||
#define _PORTA 0x0001
|
||||
#define _PORTB 0x0002
|
||||
#define _PORTC 0x0004
|
||||
#define _PORTD 0x0008
|
||||
#define _PORTE 0x0010
|
||||
#define _PORTF 0x0020
|
||||
|
||||
|
||||
#define _PWM_MODULE0 0x01
|
||||
#define _PWM_MODULE1 0x02
|
||||
|
||||
#define _PWM0 0x01
|
||||
#define _PWM1 0x02
|
||||
#define _PWM2 0x04
|
||||
#define _PWM3 0x08
|
||||
#define _PWM4 0x10
|
||||
#define _PWM5 0x20
|
||||
#define _PWM6 0x40
|
||||
#define _PWM7 0x80
|
||||
|
||||
#define _PWMDIV_2 0x0
|
||||
#define _PWMDIV_4 0x1
|
||||
#define _PWMDIV_8 0x2
|
||||
#define _PWMDIV_16 0x3
|
||||
#define _PWMDIV_32 0x4
|
||||
#define _PWMDIV_64 0x5
|
||||
|
||||
#define _PWM_LEFT_ALIG_CMPAD ((0x02 << 6) | (0x03 << 2))
|
||||
#define _PWM_LEFT_ALIG_CMPBD ((0x02 << 10) | (0x03 << 2))
|
||||
|
||||
#endif
|
88
servo/main.c
Executable file
88
servo/main.c
Executable file
@ -0,0 +1,88 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "MyDefines.h"
|
||||
|
||||
#include "TM4C123GH6PM.h"
|
||||
|
||||
void SetupPWM(void);
|
||||
void SetupGPIO(void);
|
||||
|
||||
void Delay(int s)
|
||||
{
|
||||
volatile int i, j;
|
||||
for (i = 0; i < s; i++){
|
||||
for(j = 0; j < 3180; j++){}}
|
||||
}
|
||||
|
||||
#define CMP_0_5MS 19500
|
||||
#define CMP_1_5MS 18500
|
||||
#define CMP_2_5MS 17500
|
||||
#define TO_RIGHT 0
|
||||
int main()
|
||||
{
|
||||
uint16_t cmp = CMP_1_5MS;
|
||||
bool dir = TO_RIGHT;
|
||||
SetupPWM();
|
||||
SetupGPIO();
|
||||
|
||||
while(1){
|
||||
if(dir == TO_RIGHT){
|
||||
cmp += 10;
|
||||
if( cmp >= CMP_0_5MS){
|
||||
cmp = CMP_0_5MS;
|
||||
dir = !dir;
|
||||
}
|
||||
}else{
|
||||
cmp -= 10;
|
||||
if(cmp <= CMP_2_5MS){
|
||||
cmp = CMP_2_5MS;
|
||||
dir = !dir;
|
||||
}
|
||||
}
|
||||
PWM1->_3_CMPB = cmp;
|
||||
Delay(10);
|
||||
}
|
||||
}
|
||||
|
||||
void SetupGPIO(){
|
||||
// Config for GPIO
|
||||
// 1. Enable Clock on GPIOF
|
||||
SYSCTL->RCGCGPIO = _PORTF;
|
||||
// allow time for clock to stabilize
|
||||
while((SYSCTL->PRGPIO & _PORTF) != _PORTF){};
|
||||
// 2. Unlock GPIO
|
||||
// 3. Clear AMSEL to disable analog
|
||||
GPIOF -> AMSEL = 0x0;
|
||||
// 4. Config PCTL to select GPIO
|
||||
GPIOF -> PCTL = 0x00005000;
|
||||
// 5. Set DIR to 0 for input, 1 for output
|
||||
GPIOF -> DIR = _PIN3;
|
||||
// 6. Enable AFSEL bits to 1
|
||||
GPIOF -> AFSEL = _PIN3;
|
||||
// 7. Set PUE bits to 1 to enable internal pull-up
|
||||
// 8. Set DEN bits to 1 to enable data pins
|
||||
GPIOF -> DEN = _PIN3;
|
||||
}
|
||||
|
||||
void SetupPWM(void)
|
||||
{
|
||||
// 1. Enable Clock for PWM Module 1
|
||||
SYSCTL->RCGCPWM |= _PWM_MODULE1;
|
||||
while((SYSCTL->PRPWM & _PWM_MODULE1)==0){};
|
||||
// 2. Enable and Setup Clock Divider for PWM
|
||||
SYSCTL->RCC |= (1 << 20); // RCC[20]=1:USEPWMDIV
|
||||
SYSCTL->RCC &= ~0x000E0000; // RCC[19:17]=000 PWMDIV
|
||||
SYSCTL->RCC |= (_PWMDIV_16 << 17); // RCC[19:17]=0x04 divider=/32
|
||||
// 3. Disable PWM Generator 2
|
||||
PWM1->_3_CTL &= ~0x01; // Disable PWM Generator 2
|
||||
// 4. Config LOAD, CMPn, GENn values
|
||||
PWM1->_3_LOAD = 20000; // GEN 3 B PWM 7 PF3 MOTOR
|
||||
PWM1->_3_CMPB = 18500;
|
||||
PWM1->_3_GENB = (0x02 << 10 ) | (0x03 <<2);//0x080C
|
||||
// 5. Enable PWM Generator 3
|
||||
PWM1->_3_CTL |= 0x01;
|
||||
// 6. Enable PWM7 Output
|
||||
PWM1 -> ENABLE |= _PWM7;
|
||||
}
|
Loading…
Reference in New Issue
Block a user