Sei sulla pagina 1di 6

#include "stm32f10x.

h"
#include "antilib_gpio.h"
#define KEYPAD_GPIO GPIOA
#define KEYPAD_PIN1 0 //COLUMN 1 TO PA0
#define KEYPAD_PIN2 1 //COLUMN 2 TO PA1
#define KEYPAD_PIN3 2 //COLUMN 3 TO PA2
#define KEYPAD_PIN4 3 //COLUMN 4 TO PA3
#define KEYPAD_PIN5 4 //ROW 1 TO PA4
#define KEYPAD_PIN6 5 //ROW 2 TO PA5
#define KEYPAD_PIN7 6 //ROW 3 TO PA6
#define KEYPAD_PIN8 7 //ROW 4 TO PA7
#define LED_GPIO GPIOC
#define LED_BLUE_PIN 8
#define LED_GREEN_PIN 9
void init_gpio_timers(){
RCC->APB2ENR | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN;
RCC->APB1ENR | RCC_APB1ENR_TIM3EN | RCC_APB1ENR_TIM4EN;
//setup pin config for LED
LED_GPIO->CRH = (LED_GPIO->CRH & CONFMASKH(LED_BLUE_PIN)) |
GPIOPINCONFH(LED_BLUE_PIN, GPIOCONF(GPIO_MODE_OUTPUT2MHz, GPIO_CNF_AFIO_PUSHPULL)) |
(LED_GPIO->CRH &
CONFMASKH(LED_GREEN_PIN)) | GPIOPINCONFH(LED_GREEN_PIN, GPIOCONF(GPIO_MODE_OUTPUT2MHz,
GPIO_CNF_AFIO_PUSHPULL));
//setup pin config for KeyPad
KEYPAD_GPIO->CRL = (KEYPAD_GPIO->CRL & CONFMASKL(KEYPAD_PIN1)) |
GPIOPINCONFL(KEYPAD_PIN1, GPIOCONF(GPIO_MODE_OUTPUT2MHz, GPIO_CNF_OUTPUT_PUSHPULL)) |
(KEYPAD_GPIO->CRL &
CONFMASKL(KEYPAD_PIN2)) | GPIOPINCONFL(KEYPAD_PIN2, GPIOCONF(GPIO_MODE_OUTPUT2MHz,
GPIO_CNF_OUTPUT_PUSHPULL)) |
(KEYPAD_GPIO->CRL &
CONFMASKL(KEYPAD_PIN3)) | GPIOPINCONFL(KEYPAD_PIN3, GPIOCONF(GPIO_MODE_OUTPUT2MHz,
GPIO_CNF_OUTPUT_PUSHPULL)) |
(KEYPAD_GPIO->CRL &
CONFMASKL(KEYPAD_PIN4)) | GPIOPINCONFL(KEYPAD_PIN4, GPIOCONF(GPIO_MODE_OUTPUT2MHz,
GPIO_CNF_OUTPUT_PUSHPULL)) |
(KEYPAD_GPIO->CRL &
CONFMASKL(KEYPAD_PIN5)) | GPIOPINCONFL(KEYPAD_PIN5, GPIOCONF(GPIO_MODE_INPUT,
GPIO_CNF_INPUT_FLOATING)) |
(KEYPAD_GPIO->CRL &
CONFMASKL(KEYPAD_PIN6)) | GPIOPINCONFL(KEYPAD_PIN6, GPIOCONF(GPIO_MODE_INPUT,
GPIO_CNF_INPUT_FLOATING)) |
(KEYPAD_GPIO->CRL &
CONFMASKL(KEYPAD_PIN7)) | GPIOPINCONFL(KEYPAD_PIN7, GPIOCONF(GPIO_MODE_INPUT,
GPIO_CNF_INPUT_FLOATING)) |
(KEYPAD_GPIO->CRL &
CONFMASKL(KEYPAD_PIN8)) | GPIOPINCONFL(KEYPAD_PIN8, GPIOCONF(GPIO_MODE_INPUT,
GPIO_CNF_INPUT_FLOATING)) ;
//setup timer config
//TIM3 goes to pc8
file:///C:/Users/Dani/Documents/Project Management/Goldfinger/figner...
1 of 6 10/15/2014 11:10 PM
TIM3->PSC = 23990; // prescaler to 24000 (PSC + 1), so 24MHz/24k we
can say each second has a 1k clicks according to the Timer now
TIM3->ARR = 0; // auto reload number 1/ms
TIM3->DIER = TIM_DIER_UIE; //enable update interrupt (timer level) , to turn
off the led
NVIC_EnableIRQ(TIM3_IRQn); //enable interrupt from TIM3 (NVIC level)
//TIM4
TIM4->PSC = 23990; // prescaler to 24000 (PSC + 1), so 24MHz/24k we
can say each second has a 1k clicks according to the Timer now
TIM4->ARR = 0; // auto reload number 1/ms
TIM4->DIER = TIM_DIER_UIE; //enable update interrupt (timer level) , to turn
off the led
NVIC_EnableIRQ(TIM4_IRQn);
}
void TIM3_IRQHandler(void){
if(TIM3->SR & TIM_SR_UIF){
TIM3->SR &= ~TIM_SR_UIF;
LED_GPIO->ODR = (1 << LED_BLUE_PIN);
TIM3->CR1 &= ~TIM_CR1_CEN; // Disable TIM3
}
}
void TIM4_IRQHandler(void){
if(TIM4->SR & TIM_SR_UIF){
TIM4->SR &= ~TIM_SR_UIF;
LED_GPIO->ODR = (1 << LED_BLUE_PIN);
TIM4->CR1 &= ~TIM_CR1_CEN;
}
}
void stop_procedure(){
LED_GPIO->BRR = (1 << LED_BLUE_PIN);
LED_GPIO->BRR = (1 << LED_GREEN_PIN);
TIM3->CR1 &= ~TIM_CR1_CEN; // Disable TIM3
TIM3->ARR = 0;
TIM4->CR1 &= ~TIM_CR1_CEN;
TIM4->ARR = 0;
}
void setup_pc8_timer(){ //stop co-output, reset co-TIM register, listen for numbers, push
captured numbers to TIM registers,
//stop ANY co-output
//stop/reset co-TIM register
stop_procedure();
//listen for NEW numbers
TIM3->ARR = listen_for_number();
//done
}
void setup_pc9_timer(){ //stop co-output, reset co-TIM register, listen for numbers, push
captured numbers to TIM registers
//stop co-output
file:///C:/Users/Dani/Documents/Project Management/Goldfinger/figner...
2 of 6 10/15/2014 11:10 PM
//stop/reset co-TIM register
stop_procedure();
//listen for NEW numbers
TIM4->ARR = listen_for_number();
//done
}
void run_magnets(){
//if TIMx->ARR = 0, skip running pc8 or pc9
if (TIM3->ARR != 0){
TIM3->CR1 = TIM_CR1_CEN; // Enable TIM3
LED_GPIO->BSRR = (1 << LED_BLUE_PIN);
}
if (TIM4->ARR != 0){
TIM4->CR1 = TIM_CR1_CEN; // Enable TIM4
LED_GPIO->BSRR = (1 << LED_GREEN_PIN);
}
}
/* defunct
void process_input(int keypad){ //this function stops the output to PA0 "Led
switch(keypad){
case 12: // Letter A
run_magnets();//run button_press() program as setup by the
"setting program"
break;
case 13: // Letter B
setup_pc8_timer();//set for running only pc8
break;
case 14: // Letter C
setup_pc9_timer()//set for running pc8 and pc9
break;
case 15: //Letter D
//empty for now
break;
}
}
*/
void listen_for_number(){ // 10 is asterisk (terminate listening), 11 is hash (try
enumeration again)
int number = 0;
//make array to store numbers
while ((number != 10)||(number != 11)){
void check_pin_1(){
set_keypad_pin_high(0);
if(KEYPAD_GPIO->IDR & KEYPAD_PIN5){
number += 1; //add function: if key is pressed, stop
all action, and use key to add time to timer hardware
}
file:///C:/Users/Dani/Documents/Project Management/Goldfinger/figner...
3 of 6 10/15/2014 11:10 PM
if(KEYPAD_GPIO->IDR & KEYPAD_PIN6){
number += 4;
}
if(KEYPAD_GPIO->IDR & KEYPAD_PIN7){
number += 7;
}
if(KEYPAD_GPIO->IDR & KEYPAD_PIN8){
break; //asterisk terminate listen function
}
}
void check_pin_2(){
set_keypad_pin_high(1);
if(KEYPAD_GPIO->IDR & KEYPAD_PIN5){
number += 2;
}
if(KEYPAD_GPIO->IDR & KEYPAD_PIN6){
number += 5;
}
if(KEYPAD_GPIO->IDR & KEYPAD_PIN7){
number += 8;
}
if(KEYPAD_GPIO->IDR & KEYPAD_PIN8){
number += 0;
}
}
void check_pin_3(){
set_keypad_pin_high(2);
if(KEYPAD_GPIO->IDR & KEYPAD_PIN5){
number += 3;
}
if(KEYPAD_GPIO->IDR & KEYPAD_PIN6){
number += 6;
}
if(KEYPAD_GPIO->IDR & KEYPAD_PIN7){
number += 9;
}
if(KEYPAD_GPIO->IDR & KEYPAD_PIN8){
number = 0; // hash function clear previously
captured numbers and try again
}
}
}
file:///C:/Users/Dani/Documents/Project Management/Goldfinger/figner...
4 of 6 10/15/2014 11:10 PM
return number;
}
void listen_for_functionCall(){
set_keypad_pin_high(3);
void check_pin_4(){
if(KEYPAD_GPIO->IDR & KEYPAD_PIN5){
run_magnets();
}
if(KEYPAD_GPIO->IDR & KEYPAD_PIN6){
setup_pc8_timer();
}
if(KEYPAD_GPIO->IDR & KEYPAD_PIN7){
setup_pc9_timer;
}
if(KEYPAD_GPIO->IDR & KEYPAD_PIN8){
}
}
}
void set_keypad_pin_high(int column){
switch(column){
case 0:
GPIOA->BSRR = KEYPAD_PIN1; // PIN 0 IS HIGH
GPIOA->BRR = KEYPAD_PIN2;
GPIOA->BRR = KEYPAD_PIN3;
GPIOA->BRR = KEYPAD_PIN4;
break;
case 1:
GPIOA->BRR = KEYPAD_PIN1;
GPIOA->BSRR = KEYPAD_PIN2; // PIN 1 IS HIGH
GPIOA->BRR = KEYPAD_PIN3;
GPIOA->BRR = KEYPAD_PIN4;
break;
case 2:
GPIOA->BRR = KEYPAD_PIN1;
GPIOA->BRR = KEYPAD_PIN2;
GPIOA->BSRR = KEYPAD_PIN3; // PIN 2 IS HIGH
GPIOA->BRR = KEYPAD_PIN4;
break;
case 3:
GPIOA->BRR = KEYPAD_PIN1;
GPIOA->BRR = KEYPAD_PIN2;
GPIOA->BSRR = KEYPAD_PIN3;
GPIOA->BRR = KEYPAD_PIN4; // PIN 3 IS HIGH
break;
}
}
int main(void){
init_gpio_timers();
while(1){
file:///C:/Users/Dani/Documents/Project Management/Goldfinger/figner...
5 of 6 10/15/2014 11:10 PM
listen_for_functionCall();
}
}
file:///C:/Users/Dani/Documents/Project Management/Goldfinger/figner...
6 of 6 10/15/2014 11:10 PM

Potrebbero piacerti anche