main.c

/* USER CODE BEGIN Header */

/**

******************************************************************************

* @file : main.c

* @brief : Main program body

******************************************************************************

STM32CubeIDE 1.4.0

MCU STM32F303K8T6 64Mhz(内部発信)

TIM2=回転数計算用

TIM3=イグニッションSCRトリガーONパルス PB4

TIM6 COMP2割込み停止時間

TIM7 COMP4割込み停止時間

6500rpm以上 35.5度即時点火

COMP2_INP BTDC12.5立上り PA7

COMP4_INP 35.5度立ち上が PB0

DAC1_OUT2 LoOfset電圧 PA5

DAC2_OUT1 HiOfset電圧 PA6

ADC_CH1_IN 吸気圧 PA0


******************************************************************************

*/

/* USER CODE END Header */


/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "adc.h"

#include "comp.h"

#include "dac.h"

#include "tim.h"

#include "usart.h"

#include "gpio.h"


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include "string.h"

/* USER CODE END Includes */


/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */

#define BACKUP_FLASH_SECTOR_NUM FLASH_DATA

#define BACKUP_FLASH_SECTOR_SIZE 1024*2

/* USER CODE END PTD */


/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */


/* USER CODE END PD */


/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */


/* USER CODE END PM */


/* Private variables ---------------------------------------------------------*/


/* USER CODE BEGIN PV */


/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

/* USER CODE BEGIN PFP */


/* USER CODE END PFP */


/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */

//FLASH書込み関数

uint8_t map_delay[512] = {0}; //0~385 マップテーブル 500~513 Hi BTDC 文字列

void FLASHEx_Erase_writ(void)

{

FLASH_EraseInitTypeDef EraseInitStruct;

uint32_t PAGEError,i;

uint32_t Address = 0x800F800;

EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;

EraseInitStruct.PageAddress = 0x800F800 ;

EraseInitStruct.NbPages = 1;


HAL_FLASH_Unlock();

HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError);


for(i=0; i<512; i+=4){ //1024

HAL_FLASH_Program( FLASH_TYPEPROGRAM_WORD, Address+i,*(uint32_t*) (map_delay +i)); //FLASH_TYPEPROGRAM_BYTE,

}

HAL_FLASH_Lock();

}


uint8_t flag_ADC_chek = 0; //==1 吸気負圧取り込み中

//uint16_t AD_C1MAX = 0; //吸気負圧

uint8_t flag_stat = 0; //キックスタート時 12.5°点火

uint8_t monitor[4]={0}; //モニター転送用

uint32_t tim2_value = 0; //TIM2 値保存

uint8_t flag_run = 0; //=1 連続回転中

//uint8_t flag_lowrpm = 0; //=1 アイドリング

uint8_t flag_ignition = 0; //点火処中 = 1

uint8_t COMP2_flag = 0; //COMP2 = 1 割込み停止

uint8_t COMP4_flag = 0; //COMP4 = 1 割込み停止

uint8_t ADC_value[3]={0}; //ADC_value[0]=読出し値 ADC_value[1]=最大値値 8bit

/* USER CODE END 0 */


/**

* @brief The application entry point.

* @retval int

*/

int main(void)

{

/* USER CODE BEGIN 1 */


uint32_t RPMmap; //マップテーブルアドレス

uint8_t uart_answer[5]; //コマンド受信用

uint8_t flag_UART = 0; //通信中=1

uint8_t S_buf[3]; //コマンド送信用

float Calcu_temp; //fpu使用時計算用



uint32_t delaypulse; //35.5よりの点火遅延パルス数

HAL_StatusTypeDef uart_return;

/* USER CODE END 1 */


/* MCU Configuration--------------------------------------------------------*/


/* Reset of all peripherals, Initializes the Flash interface and the Systick. */

HAL_Init();


/* USER CODE BEGIN Init */


/* USER CODE END Init */


/* Configure the system clock */

SystemClock_Config();


/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */


/* Initialize all configured peripherals */

MX_GPIO_Init();

MX_ADC1_Init();

MX_COMP2_Init();

MX_COMP4_Init();

MX_DAC1_Init();

MX_DAC2_Init();

MX_TIM2_Init();

MX_TIM3_Init();

MX_TIM6_Init();

MX_TIM7_Init();

MX_USART1_UART_Init();

/* USER CODE BEGIN 2 */

HAL_ADCEx_Calibration_Start(&hadc1 , ADC_SINGLE_ENDED);

//オフセ�?ト電圧

HAL_DAC_Start(&hdac1, DAC_CHANNEL_2);

HAL_DAC_Start(&hdac2, DAC_CHANNEL_1);

HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, 600); //600 0.5v 1200設定電圧0.99V 1800 1.41v

HAL_DAC_SetValue(&hdac2, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 600); //600 0.5v 1200設定電圧0.99V




//Flashのテーブルルマップをramにコピー

memcpy(map_delay, (uint8_t*)0x800F800, 512);

//COMP開�?

HAL_COMP_Start_IT(&hcomp2);

HAL_COMP_Start_IT(&hcomp4);

__HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE(); //COMP2 EXTIラインの立ち下がりを無効

__HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE(); //COMP2 EXTIラインの立ち下がりを無効


//タイマ割込み

LL_TIM_EnableIT_UPDATE(TIM2); //カウントアプ割り込み

LL_TIM_EnableIT_UPDATE(TIM3); //カウントアプ割り込み

LL_TIM_EnableIT_CC1(TIM3); //CH1割り込み

LL_TIM_EnableIT_UPDATE(TIM6); //カウントアプ割り込み

LL_TIM_EnableIT_UPDATE(TIM7); //カウントアプ割り込み


HAL_ADC_Start(&hadc1); //ADC

/* USER CODE END 2 */


/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{


if(flag_run == 1){ //点火タイミング計算

/****回転数計算*/

Calcu_temp = (float)tim2_value;

RPMmap = (uint32_t)19200000.0f / Calcu_temp; //RPM = RPMmap*100

monitor[0] = RPMmap; //モニター用回転数 monitor[0]*100rpm

if(flag_ignition == 1){ //点火タイミング

//テーブルアドレス

if(RPMmap <=10){ //1000rpm以下

RPMmap =10;

}

if(RPMmap ==10){ //マップテーブルアドレスに変換

RPMmap =0;

}

else{

RPMmap = (RPMmap-10)*7; //

}

switch (ADC_value[1]) { //負荷オフセット設定

case 0 ... 96: //高負荷

break;

case 97 ... 111:

RPMmap =RPMmap+1;

break;

case 112 ... 127:

RPMmap =RPMmap+2;

break;

case 128 ... 143:

RPMmap =RPMmap+3;

break;

case 144 ... 159:

RPMmap =RPMmap+4;

break;

case 160 ... 207: //パーシャル

RPMmap =RPMmap+5;

break;

case 208 ... 255: //エンジンブレーキ

RPMmap =RPMmap+6;

break;

}

delaypulse = map_delay[RPMmap]; //マップテーブル読出

monitor[1] = delaypulse; //遅延BTDCモニター用

/* 低速時処理取りやめ 21/5/16*/

/* if (RPMmap >= 42 & flag_lowrpm ==0){

flag_lowrpm =1;

flag_ignition = 0;

}

*/

//0.1度パルス計算 フロート

Calcu_temp = (float)tim2_value/3600.0f; //0.1 度パルス数

delaypulse =(uint32_t)(Calcu_temp*(float)delaypulse); //遅延パルス数

//点火タイミング待 割込みではなくループ

// if (flag_lowrpm == 0){ //flag_lowrpm

while(delaypulse > LL_TIM_GetCounter(TIM2)){


}

LL_TIM_EnableCounter(TIM3); //TIM3 点火用SCRトリガーパルス

flag_ignition = 0;

// }


} //点火タイミング計算END

/*負圧ADCデーター*/

if (flag_ADC_chek == 1){

/*ADC_value[0]=読出値 ADC_value[1]=最大値 8bit*/

if(HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK) //変換完了

{

ADC_value[0] = (uint8_t )HAL_ADC_GetValue(&hadc1); //8bit設定

if( ADC_value[0] > ADC_value[1] ){

ADC_value[1] = ADC_value[0];

monitor[2] = ADC_value[1]; //vacuumモニター用

}

}


}


if(flag_UART == 1) //モニター

{

if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) == 1){

HAL_UART_Receive(&huart1, uart_answer , 1, 2);

switch (uart_answer[0])

{

case 'O': //モニタ終了

flag_UART = 0;

break;

case 'M': //モニタ送信

monitor[2] = ADC_value[1]; //vacuumモニター用

HAL_UART_Transmit(&huart1, monitor,3 ,0xf ); //

break;

}

}

}

} //回転中処理 END

else //停止中通信コマンド

{


if(flag_UART == 1)

{

if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) == 1){

HAL_UART_Receive(&huart1, uart_answer , 1, 2);

switch (uart_answer[0])

{

case 'O': //UART接続モニタ終了

flag_UART = 0;

break;

case 'R': //全読み出

HAL_UART_Transmit(&huart1,map_delay, 385,0xfff );

break;

case 'W': //書込み

S_buf[0] = 'W';

HAL_UART_Transmit(&huart1,S_buf, 1,0xfff );

uart_return = HAL_UART_Receive(&huart1, map_delay , 512, 500); //

if (uart_return == HAL_TIMEOUT)

{

S_buf[0] = 'S';

HAL_UART_Transmit( &huart1, S_buf, 1, 10 );

}

else if (uart_return == HAL_OK)

{


FLASHEx_Erase_writ(); //FLASH保存

S_buf[0] = 'E';

HAL_UART_Transmit( &huart1, S_buf, 1, 10 );

}

break;

case 'M': //UARTモニタ

HAL_UART_Transmit(&huart1,monitor, 3,0xf );

break;

}//switch END


}

}

}

//UART接続

if(flag_UART == 0)

{

if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) == 1) //受信

{

HAL_UART_Receive(&huart1, uart_answer , 1, 10);

if (uart_answer[0] == 'S') //接続受信あり処理

{

flag_UART = 1;

S_buf[0] = 'S';

HAL_UART_Transmit( &huart1, S_buf, 1, 10 );

HAL_UART_Transmit( &huart1, &map_delay[500] ,4, 10 ); //接続時保存BTDC送信 &map_delay[500]はアドレスにて


}

}

} //UART接続END

}


/* USER CODE END WHILE */


/* USER CODE BEGIN 3 */


/* USER CODE END 3 */

}


/**

* @brief System Clock Configuration

* @retval None

*/

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};


/** Initializes the CPU, AHB and APB busses clocks

*/

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Error_Handler();

}

/** Initializes the CPU, AHB and APB busses clocks

*/

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;


if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

{

Error_Handler();

}

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_ADC12;

PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;

PeriphClkInit.Adc12ClockSelection = RCC_ADC12PLLCLK_DIV1;

if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

{

Error_Handler();

}

}


/* USER CODE BEGIN 4 */

void HAL_COMP_TriggerCallback(COMP_HandleTypeDef *hcomp)

{

/* Prevent unused argument(s) compilation warning */

UNUSED(hcomp);

/* NOTE : This function should not be modified, when the callback is needed,

the HAL_COMP_TriggerCallback should be implemented in the user file


*/

}

/* USER CODE END 4 */


/**

* @brief This function is executed in case of error occurrence.

* @retval None

*/

void Error_Handler(void)

{

/* USER CODE BEGIN Error_Handler_Debug */

/* User can add his own implementation to report the HAL error return state */


/* USER CODE END Error_Handler_Debug */

}


#ifdef USE_FULL_ASSERT

/**

* @brief Reports the name of the source file and the source line number

* where the assert_param error has occurred.

* @param file: pointer to the source file name

* @param line: assert_param error line source number

* @retval None

*/

void assert_failed(char *file, uint32_t line)

{

/* USER CODE BEGIN 6 */

/* User can add his own implementation to report the file name and line number,

tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

/* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/