48ADC_HandleTypeDef hadc1;
49DMA_HandleTypeDef hdma_adc1;
51CAN_HandleTypeDef hcan1;
53I2C_HandleTypeDef hi2c2;
55TIM_HandleTypeDef htim2;
58CAN_FilterTypeDef sFilterConfig;
59CAN_RxHeaderTypeDef RxHeader;
60CAN_TxHeaderTypeDef TxHeader;
61CAN_TxHeaderTypeDef TxHeaderSDO;
62CAN_TxHeaderTypeDef TxHeaderPDO;
63CAN_TxHeaderTypeDef TxHeaderScan;
74UNS8 lastRequestedAddress = 0;
80static void MX_GPIO_Init(
void);
81static void MX_DMA_Init(
void);
82static void MX_CAN1_Init(
void);
83static void MX_TIM2_Init(
void);
84static void MX_I2C2_Init(
void);
85static void MX_ADC1_Init(
void);
112 UNS8 node = *(uint8_t*)(127 * FLASH_PAGE_SIZE);
113 if(node > 0 && node <= 0x7F)
114 Status_NodeId = node;
118 ObjDict_obj1018_Serial_Number = *(uint8_t*)(0x08004FFD) << 8 | *(uint8_t*)(0x08004FFE);
119 ObjDict_obj1018_Product_Code = *(uint8_t*)(0x08004FFF);
121 HAL_Delay(START_DELAY_MS * (Status_NodeId - 1));
191 if(
getState(&ObjDict_Data) == Waiting)
205 HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
219 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
220 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
224 if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
232 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_MSI;
233 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
234 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
235 RCC_OscInitStruct.MSIState = RCC_MSI_ON;
236 RCC_OscInitStruct.MSICalibrationValue = 0;
237 RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_8;
238 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
239 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
246 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
247 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
248 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
249 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV4;
250 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
251 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
253 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
264static void MX_ADC1_Init(
void)
271 ADC_ChannelConfTypeDef sConfig = {0};
274 __HAL_RCC_ADC_CLK_ENABLE();
280 hadc1.Instance = ADC1;
281 hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV256;
282 hadc1.Init.Resolution = ADC_RESOLUTION_8B;
283 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
284 hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
285 hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
286 hadc1.Init.LowPowerAutoWait = DISABLE;
287 hadc1.Init.ContinuousConvMode = DISABLE;
288 hadc1.Init.NbrOfConversion = 4;
289 hadc1.Init.DiscontinuousConvMode = DISABLE;
290 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
291 hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
292 hadc1.Init.DMAContinuousRequests = DISABLE;
293 hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
294 hadc1.Init.OversamplingMode = ENABLE;
295 hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16;
296 hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_NONE;
297 hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
298 hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE;
299 if (HAL_ADC_Init(&hadc1) != HAL_OK)
306 sConfig.Channel = ADC_CHANNEL_1;
307 sConfig.Rank = ADC_REGULAR_RANK_1;
308 sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
309 sConfig.SingleDiff = ADC_SINGLE_ENDED;
310 sConfig.OffsetNumber = ADC_OFFSET_NONE;
312 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
319 sConfig.Channel = ADC_CHANNEL_2;
320 sConfig.Rank = ADC_REGULAR_RANK_2;
321 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
328 sConfig.Channel = ADC_CHANNEL_3;
329 sConfig.Rank = ADC_REGULAR_RANK_3;
330 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
337 sConfig.Channel = ADC_CHANNEL_4;
338 sConfig.Rank = ADC_REGULAR_RANK_4;
339 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
344 HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
354static void MX_CAN1_Init(
void)
364 hcan1.Instance = CAN1;
365 hcan1.Init.Prescaler = 4;
366 hcan1.Init.Mode = CAN_MODE_NORMAL;
367 hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
368 hcan1.Init.TimeSeg1 = CAN_BS1_6TQ;
369 hcan1.Init.TimeSeg2 = CAN_BS2_3TQ;
370 hcan1.Init.TimeTriggeredMode = DISABLE;
371 hcan1.Init.AutoBusOff = DISABLE;
372 hcan1.Init.AutoWakeUp = DISABLE;
373 hcan1.Init.AutoRetransmission = ENABLE;
374 hcan1.Init.ReceiveFifoLocked = DISABLE;
375 hcan1.Init.TransmitFifoPriority = DISABLE;
376 if (HAL_CAN_Init(&hcan1) != HAL_OK)
381 sFilterConfig.FilterBank = 0;
382 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
383 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
384 sFilterConfig.FilterIdHigh = 0x0000;
385 sFilterConfig.FilterIdLow = 0x0000;
386 sFilterConfig.FilterMaskIdHigh = 0x0000;
387 sFilterConfig.FilterMaskIdLow = 0x0000;
388 sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
389 sFilterConfig.FilterActivation = ENABLE;
390 sFilterConfig.SlaveStartFilterBank = 14;
391 if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
397 HAL_CAN_Start(&hcan1);
399 HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
400 HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO1_MSG_PENDING);
401 HAL_CAN_ActivateNotification(&hcan1, CAN_IT_LAST_ERROR_CODE);
402 HAL_CAN_ActivateNotification(&hcan1, CAN_IT_ERROR);
403 HAL_CAN_ActivateNotification(&hcan1, CAN_IT_BUSOFF);
404 HAL_CAN_ActivateNotification(&hcan1, CAN_IT_ERROR_WARNING);
405 HAL_CAN_ActivateNotification(&hcan1, CAN_IT_ERROR_PASSIVE);
407 ObjDict_Data.canHandle = &hcan1;
418static void MX_I2C2_Init(
void)
428 hi2c2.Instance = I2C2;
429 hi2c2.Init.Timing = 0x00000000;
430 hi2c2.Init.OwnAddress1 = 0;
431 hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
432 hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
433 hi2c2.Init.OwnAddress2 = 0;
434 hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
435 hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
436 hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
437 if (HAL_I2C_Init(&hi2c2) != HAL_OK)
444 if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
451 if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK)
458 HAL_I2CEx_EnableFastModePlus(I2C_FASTMODEPLUS_I2C2);
470static void MX_TIM2_Init(
void)
477 TIM_ClockConfigTypeDef sClockSourceConfig = {0};
478 TIM_MasterConfigTypeDef sMasterConfig = {0};
483 htim2.Instance = TIM2;
484 htim2.Init.Prescaler = 39;
485 htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
486 htim2.Init.Period = 65535;
487 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
488 htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
489 if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
493 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
494 if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
498 sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC4REF;
499 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
500 if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
505 if(HAL_TIM_Base_Start_IT(&htim2) != HAL_OK) {
Error_Handler();}
507 CLEAR_BIT(TIM2->CR1, TIM_CR1_CEN);
519static void MX_DMA_Init(
void)
523 __HAL_RCC_DMA1_CLK_ENABLE();
527 HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
528 HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
537static void MX_GPIO_Init(
void)
539 GPIO_InitTypeDef GPIO_InitStruct = {0};
544 __HAL_RCC_GPIOC_CLK_ENABLE();
545 __HAL_RCC_GPIOB_CLK_ENABLE();
546 __HAL_RCC_GPIOA_CLK_ENABLE();
549 GPIO_InitStruct.Pin = I2C2_INT_Pin;
550 GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
551 GPIO_InitStruct.Pull = GPIO_NOPULL;
552 HAL_GPIO_Init(I2C2_INT_GPIO_Port, &GPIO_InitStruct);
569 if (memorySelect > 0 )
570 statusByteMemory = 0;
572 if (memorySelect == 1)
574 else if (memorySelect == 4)
576 else if (memorySelect == 8)
578 else if (memorySelect != 0)
579 statusByteMemory = 4;
589 UNS8 RMDataSize =
sizeof(ReadMemoryData);
590 UNS16 recordSize = FLASH_RECORD_SIZE;
592 if (AddressRequest > (FLASH_SIZE - recordSize))
595 if (lastRequestedAddress != AddressRequest || (triggerReadMemory == 1))
598 memset( ReadMemoryData, 0xA5,
sizeof(ReadMemoryData));
601 ReadMemoryData[RMDataSize - 4] = (
UNS8) AddressRequest;
602 ReadMemoryData[RMDataSize - 3] = (
UNS8)(AddressRequest >> 8);
603 ReadMemoryData[RMDataSize - 2] = (
UNS8)(AddressRequest >> 16);
604 ReadMemoryData[RMDataSize - 1] = (
UNS8)(AddressRequest >> 24);
606 lastRequestedAddress = AddressRequest;
607 triggerReadMemory = 0;
619 UNS8 RMDataSize =
sizeof(ReadMemoryData);
620 UNS16 recordSize = EEPROM_RECORD_SIZE;
625 if (lastRequestedAddress != AddressRequest || (triggerReadMemory == 1))
628 memset( ReadMemoryData, 0xA5,
sizeof(ReadMemoryData));
631 ReadMemoryData[RMDataSize - 4] = (
UNS8) AddressRequest;
632 ReadMemoryData[RMDataSize - 3] = (
UNS8)(AddressRequest >> 8);
633 ReadMemoryData[RMDataSize - 2] = (
UNS8)(AddressRequest >> 16);
634 ReadMemoryData[RMDataSize - 1] = (
UNS8)(AddressRequest >> 24);
636 lastRequestedAddress = AddressRequest;
637 triggerReadMemory = 0;
684#ifdef USE_FULL_ASSERT
692void assert_failed(uint8_t *file, uint32_t line)
void updateDiagnostics(void)
If disgnostics is enabled, update their entries in the OD.
void initAccelerometer(void)
Initializes Accelerometer.
void updateAccelerometer(void)
update Accelerometer
void initTemperature(void)
initializes thermometer to default configuration
#define UNS8
Unsigned int8 representation in CANFest.
#define UNS16
Unsigned int16 representation in CANFest.
#define UNS32
Unsigned int32 representation in CANFest.
#define MAX_EEPROM_MEMORY
(6KB)
UNS8 CheckRestoreFlag(void)
checks whether or not RestoreValues() should be run.
void EEPROM_write(UNS16 address, UNS8 *data, UNS16 length)
Writes bytes to a specified location in EEPROM.
void RestoreValues(void)
Restores the values of custom OD entries (specified in RestoreList OD index 0x2900) to the OD from EE...
void EEPROM_read(UNS16 address, UNS8 *data, UNS16 length)
Reads bytes from a specified location in EEPROM.
UNS8 EEPROM_commit()
Commits edits to EEPROM from ram to flash.
void SaveValues(void)
Saves the values of custom OD entries (specified in RestoreList OD index 0x2900) to EEPROM from the O...
UNS8 ReadLocalFlashData(UNS32 nvAddress, UNS8 *data, UNS8 numData)
reads CPU based flash data
UNS8 EEPROM_open()
Copies the EEPROM into ram for modification by EEPROM_write()
void initAppTask(void)
Function called at the initialization of program.
void updateAppTask()
Main application loop called from main.c.
UNS8 setState(CO_Data *d, e_nodeState newState)
Change the state of the node.
e_nodeState getState(CO_Data *d)
Returns the state of the node.
void setNodeId(CO_Data *d, UNS8 nodeId)
Define the node ID. Initialize the object dictionary.
TIMER_HANDLE SetAlarm(CO_Data *d, UNS32 id, TimerCallback_t callback, TIMEVAL value, TIMEVAL period)
Set an alarm to execute a callback function when expired.
UNS8 ReadLocalFlashMemory(void)
Read flash memory in CPU.
void Error_Handler(void)
This function is executed in case of error occurrence.
void initNodeIDSerialNumber(void)
Initializes node ID and serial number data in the object dictionary.
void ReadMemory(void)
Command processor to let CE read various memory locations.
void start_callback(CO_Data *d, UNS32 id)
Callback that runs at the beginning of timer execution.
UNS8 WriteEEProm(void)
used with handshake through the OD at 0x2020 to allow remote writing of a single value in the emulate...
void SystemClock_Config(void)
System Clock Configuration.
int main(void)
The application entry point.
UNS8 ReadEEProm(void)
used with handshake through the OD at 0x2020 to allow remote reading of values in the emulated eeprom...
: Header for main.c file. This file contains the common defines of the application.
This structure contains all necessary informations to define a CANOpen node.