/******************** (C) COPYRIGHT 2010 STMicroelectronics ********************
* File Name : main.c
* Author : MCD Application Team
* Version : V3.2.1
* Date : 04/18/2011
* Description :
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/*
Predefine 설정
100p
STM32F103VCT6(512KB, 64KB) : USE_STDPERIPH_DRIVER, STM32F10X_HD
STM32F105VCT6(512KB, 64KB) : USE_STDPERIPH_DRIVER, STM32F10X_CL
STM32F107VBT6(256KB, 64KB) : USE_STDPERIPH_DRIVER, STM32F10X_CL
STM32F107VCT6(256KB, 64KB) : USE_STDPERIPH_DRIVER, STM32F10X_CL
STM32F107VBT6(128KB, 32KB) : USE_STDPERIPH_DRIVER, STM32F10X_CL
144p
STM32F103ZET6(512KB, 64KB) : USE_STDPERIPH_DRIVER, STM32F10X_HD
*/
/* Includes ------------------------------------------------------------------*/
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "hw_config.h"
#include "main.h"
#include "timer.h"
#include "usart.h"
#include "rtc.h"
#include "lcd.h"
#include "key.h"
#include "spi.h"
#include "at24c02.h"
#include "rs485.h"
#include "adc.h"
#include "dac.h"
#include "lcd1602.h"
// #include "lcd12864.h"
// fat
#include "ff.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Extern variables ----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
// setting menu tree.
service_define_type s_menu_level = MainService;
u8 s_current_service = serviceMAX;
static volatile s16 s_blink_cnt = 0;
static volatile s16 s_wait_cnt = 0;
#ifdef NRF24L01_BPS_CHECK
static volatile s16 s_rf_bps_check_cnt = 0;
#endif
static volatile u16 s_key = 0;
static u8 rs485_data_count = 0;
// for mp3 player
//#define BUFF_SIZE ( 512 )
#define BUFF_SIZE ( 3092 )
u8 buffer[BUFF_SIZE]; // file copy buffer
struct FileList
{
u8 filename[65];
struct FileList *next;
struct FileList *back;
};
typedef struct FileList dnode;
typedef dnode *dlink;
extern uint16_t CAN_ID;
extern uint8_t CAN_DATA0,CAN_DATA1,CAN_DATA2,CAN_DATA3,CAN_DATA4,CAN_DATA5,CAN_DATA6,CAN_DATA7;
extern uint8_t CanFlag,Display;
extern tft_lcd_type curr_tft_lcd;
extern u16 demo_selected_pen_color;
extern unsigned int POINT_COLOR;
extern unsigned int BACK_COLOR;
FATFS fs; // Work area (file system object) for logical drive
DIR dirs;
FRESULT res;
FILINFO finfo;
FIL fsrc; // file objects
char path[50] = {""};
u16 read_count;
char szlcdpath[120];
const main_service_type gbl_main_service[1][serviceMAX] =
{
{
{TimerService, "[2] TIMER test\r\n", service_timer, '2'},
{LcdService, "[6] LCD test\r\n", service_lcd, '6'},
{EepromService, "[7] EEPROM(AT2402) test\r\n", service_eeprom, '7'},
{KeyService, "[8] KEY test\r\n", service_key, '8'},
{Uart2Service, "[b] UART2 test\r\n", service_uart2, 'b'},
{Rs485Service, "[c] RS485 test\r\n", service_rs485, 'c'},
{AdcService, "[e] ADC test\r\n", service_adc, 'e'},
{DacService, "[f] DAC test\r\n", service_dac, 'f'},
{Lcd1602Service, "[h] LCD1602 test\r\n", service_lcd1602, 'h'},
// {Lcd12864Service, "[i] LCD12864 test\r\n", service_lcd12864, 'i'},
{serviceMAX, 0x00, 0x00, 0x00}
}
};
const sub_service_type gbl_service[serviceMAX-1][10] =
{
{
{timerTIM2Service, "[1] TIM2 ticktime test\r\n", service_tim2_ticktime, '1'},
{timerTIM2Stop, "[2] TIM2 blink stop\r\n", service_tim2_stop, '2'},
{timerExitService, "[x] Exit timer test\r\n", service_exit, 'x'},
{timerServiceMAX, 0x00, 0x00, 0x00}
},
{
{eepromWriteService, "[1] EEPROM(AT2402) write\r\n", service_eeprom_write, '1'},
{eepromReadService, "[2] EEPROM(AT2402) read\r\n", service_eeprom_read, '2'},
{eepromExitService, "[x] Exit EEPROM(AT2402) test\r\n", service_exit, 'x'},
{eepromServiceMAX, 0x00, 0x00, 0x00}
},
{
{keyStartPollingService, "[1] KEY service start(polling & exti)\r\n", service_key_polling_start, '1'},
{keyStopPollingService, "[2] KEY service stop(polling & exti)\r\n", service_key_polling_stop, '2'},
{keyExitService, "[x] Exit KEY test\r\n", service_exit, 'x'},
{keyServiceMAX, 0x00, 0x00, 0x00}
},
{
{uart2StartService, "[1] UART2 start\r\n", service_uart2_start, '1'},
{uart2ExitService, "[x] Exit UART2 test\r\n", service_exit, 'x'},
{uart2ServiceMAX, 0x00, 0x00, 0x00}
},
{
{rs485MasterStartService, "[1] RS485 Master.\r\n", service_rs485_master_start, '1'},
{rs485SlaveStartService, "[2] RS485 Slave.\r\n", service_rs485_slave_start, '2'},
{rs485ExitService, "[x] Exit RS485 test\r\n", service_exit, 'x'},
{rs485ServiceMAX, 0x00, 0x00, 0x00}
},
{
{adc12_15Service, "[1] ADC12 IN15 VR Input.\r\n", service_adc12_15_start, '1'},
{adc12_9Service, "[2] ADC12 IN9 Input.\r\n", service_adc12_9_start, '2'},
{adc12_8Service, "[3] ADC12 IN8 Input.\r\n", service_adc12_8_start, '3'},
{adcExitService, "[x] Exit ADC test\r\n", service_exit, 'x'},
{adcServiceMAX, 0x00, 0x00, 0x00}
},
{
{dac1_noiseService, "[1] DAC1 Noise output.\r\n", service_dac1_noise_start, '1'},
{dacExitService, "[x] Exit DAC test\r\n", service_exit, 'x'},
{dacServiceMAX, 0x00, 0x00, 0x00}
},
{
{lcd1602StartService, "[1] LCD1602 test.\r\n", service_lcd1602_start, '1'},
{lcd1602ExitService, "[x] Exit LCD1602 test.\r\n", service_exit, 'x'},
{lcd1602ServiceMAX, 0x00, 0x00, 0x00}
},
};
void wait_10ms(s16 ms_10)
{
s_wait_cnt = 0;
while( s_wait_cnt < ms_10 );
}
void welcome(void)
{
usart1_transmit_string("\r\n*****************************************************************************\r\n");
usart1_transmit_string("Rabbit Pro Development Board Ver 1.0\r\n");
#ifdef STM32F10X_CL
// STM32F105, 107 에서는 PLL설정이 약간 틀리다.
// 이후에 PLL설정 스트링을 수정해야 한다.
usart1_transmit_string("HSE(High Speed External clock signal) Enable\r\n");
usart1_transmit_string("HCLK(SYSCLK) = 8MHz, PCLK2 = HCLK, PCLK1 = HCLK/2, ADCCLK = PCLK2/2\r\n");
usart1_transmit_string("PLLCLK = 8MHz / 1 * 9 = 72MHz, USBCLK = PLLCLK / 2 = 48MHz\r\n\r\n");
#else
usart1_transmit_string("HSE(High Speed External clock signal) Enable\r\n");
usart1_transmit_string("HCLK(SYSCLK) = 8MHz, PCLK2 = HCLK, PCLK1 = HCLK/2, ADCCLK = PCLK2/2\r\n");
usart1_transmit_string("PLLCLK = 8MHz / 1 * 9 = 72MHz, USBCLK = PLLCLK / 2 = 48MHz\r\n");
#endif
}
void display_menu()
{
int i;
if( s_menu_level == MainService )
{
for(i=0;i<serviceMAX;i++)
{
if( gbl_main_service[MainService][i].run == 0x00 )
break;
// wait(5);
usart1_transmit_string(gbl_main_service[MainService][i].service_string);
//strcpy(gbl_zz, gbl_service[s_menu_level][i].service_string);
//strcpy(zz, gbl_service[s_menu_level][i].service_string);
}
}
else
{
for(i=0;i<serviceMAX;i++)
{
if( gbl_service[s_menu_level-1][i].run == 0x00 )
break;