main.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2025 STMicroelectronics.
  10. * All rights reserved.
  11. *
  12. * This software is licensed under terms that can be found in the LICENSE file
  13. * in the root directory of this software component.
  14. * If no LICENSE file comes with this software, it is provided AS-IS.
  15. *
  16. ******************************************************************************
  17. */
  18. /* USER CODE END Header */
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "main.h"
  21. #include "adc.h"
  22. #include "can.h"
  23. #include "dma.h"
  24. #include "rtc.h"
  25. #include "spi.h"
  26. #include "tim.h"
  27. #include "usart.h"
  28. #include "gpio.h"
  29. /* Private includes ----------------------------------------------------------*/
  30. /* USER CODE BEGIN Includes */
  31. /* USER CODE END Includes */
  32. /* Private typedef -----------------------------------------------------------*/
  33. /* USER CODE BEGIN PTD */
  34. /* USER CODE END PTD */
  35. /* Private define ------------------------------------------------------------*/
  36. /* USER CODE BEGIN PD */
  37. /* USER CODE END PD */
  38. /* Private macro -------------------------------------------------------------*/
  39. /* USER CODE BEGIN PM */
  40. /* USER CODE END PM */
  41. /* Private variables ---------------------------------------------------------*/
  42. /* USER CODE BEGIN PV */
  43. /* USER CODE END PV */
  44. /* Private function prototypes -----------------------------------------------*/
  45. void SystemClock_Config(void);
  46. /* USER CODE BEGIN PFP */
  47. /* USER CODE END PFP */
  48. /* Private user code ---------------------------------------------------------*/
  49. /* USER CODE BEGIN 0 */
  50. // Sysled ----------------------------------------------------------------------
  51. #include "LED_ATY.h"
  52. void SysLed_1_IO_SET(uint8_t level){
  53. if(level){
  54. HAL_GPIO_WritePin(SYSLED_GPIO_Port, SYSLED_Pin, GPIO_PIN_SET);
  55. }
  56. else{
  57. HAL_GPIO_WritePin(SYSLED_GPIO_Port, SYSLED_Pin, GPIO_PIN_RESET);
  58. }
  59. }
  60. struct LED_ATY_Dev LED_ATY_t_1 = {
  61. .ledBlinkStep = 0,
  62. .ledBlinkType = 0x20,
  63. .ioSet = SysLed_1_IO_SET,
  64. .longSteps = 20,
  65. .lock = __ATY_UNLOCKED
  66. };
  67. // Timer loop ------------------------------------------------------------------
  68. #include "HW_TIMER_ATY.h"
  69. void TimerLoopProcess_User_4(void);
  70. void TimerInit_4(){
  71. HAL_TIM_Base_Start_IT(&htim4);
  72. }
  73. struct HW_TIMER_ATY_Dev HW_TIMER_ATY_Dev_4 = {
  74. .msN = 0,
  75. .ms10 = 0,
  76. .ms100 = 0,
  77. .s1 = 0,
  78. .ms1_f = 0,
  79. .ms10_f = 0,
  80. .ms100_f = 0,
  81. .s1_f = 0,
  82. .timerInitFlag = 0,
  83. .timerInit = TimerInit_4,
  84. .timerLoopProcess_User = TimerLoopProcess_User_4,
  85. .lock = __ATY_UNLOCKED
  86. };
  87. // Uart ------------------------------------------------------------------------
  88. #include "HW_UART_ATY.h"
  89. extern DMA_HandleTypeDef hdma_usart2_rx;
  90. void UartReceiveProcess_User_1(void);
  91. void UartInit_1(uint8_t* rx){
  92. HAL_UARTEx_ReceiveToIdle_DMA(&huart2, rx, UART_RX_MAX_LEN);
  93. __HAL_DMA_DISABLE_IT(&hdma_usart2_rx, DMA_IT_HT);
  94. }
  95. void UartSendByte_1(uint8_t byte){
  96. HAL_UART_Transmit(&huart2, (uint8_t*)&byte, 1, 0xFFFF);
  97. }
  98. struct HW_UART_ATY_Dev HW_UART_ATY_Dev_1 = {
  99. .rx = {0},
  100. .rxCount = 0,
  101. .txCount = 0,
  102. .rcvOverTimeOutCountNum = 1,
  103. .rcvOverTimeOutCount = 0,
  104. .rcvOverFlag = 0,
  105. .uartInitFlag = 0,
  106. .uartInit = UartInit_1,
  107. .uartSendByte = UartSendByte_1,
  108. .uartReceiveProcess_User = UartReceiveProcess_User_1,
  109. .lock = __ATY_UNLOCKED
  110. };
  111. void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef* huart, uint16_t Size){
  112. if(huart == &huart2){
  113. HAL_UART_DMAStop(&huart2);
  114. HW_UART_ATY_Dev_1.rcvOverTimeOutCount = 0;
  115. HW_UART_ATY_Dev_1.rxCount = UART_RX_MAX_LEN - __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);
  116. HW_UART_ATY_Dev_1.rcvOverFlag = 0;
  117. HAL_UARTEx_ReceiveToIdle_DMA(&huart2, HW_UART_ATY_Dev_1.rx, UART_RX_MAX_LEN);
  118. __HAL_DMA_DISABLE_IT(&hdma_usart2_rx, DMA_IT_HT);
  119. }
  120. }
  121. // Regs ------------------------------------------------------------------------
  122. float rgf[200 / 2] = {0};
  123. // sys
  124. #define RGF_SYS_TIME rgf[0] // r // uint // sys run time in sec
  125. #define RGF_SYS_ADDR rgf[1] // rw // uint8 // sys address
  126. #define RGF_SYS_GROUP_ID rgf[2] // w // uint8 // sys group id,
  127. #define RGF_SYS_ERROR rgf[3] // rw // uint8 // sys error
  128. #define RGF_SOFTWARE_RST rgf[4] // w // uint1 // sys software reset
  129. #define RGF_UPDATE_RST rgf[5] // w // uint1 // sys update reset
  130. // ad
  131. #define RGF_VOL_PER_AD rgf[10] // r // float // ad vref ad
  132. #define RGF_MCU_BASE_VOL rgf[11] // r // float // ad vref vol
  133. #define RGF_MCU_TEMP rgf[12] // r // float // mcu T
  134. #define RGF_BOARD_TEMP rgf[13] // r // float // board ntc T, and for fan T use
  135. // motor fan
  136. #define RGF_MOTOR_FAN_EN rgf[20] // w // uint8 // 0: disable, 1: enable, 2: always full on
  137. #define RGF_MOTOR_FAN_BASE rgf[21] // w // uint8 // min dutycycle for fan running
  138. #define RGF_MOTOR_FAN_LOW_T rgf[22] // w // uint8 // min T for fan start
  139. #define RGF_MOTOR_FAN_HIGH_T rgf[23] // w // uint8 // max T for fan full on
  140. #define RGF_MOTOR_FAN_T_SPACE rgf[24] // w // uint8 // fan T space to jump speed level
  141. // motor angle base
  142. #define RGF_MOTOR_ANGLE_SET_ZERO rgf[25] // w // uint1 // 1: set zero now, auto clear, zero point is current angle
  143. #define RGF_MOTOR_ANGLE_ZERO rgf[26] // r // uint16 // current zero point value
  144. #define RGF_MOTOR_ANGLE rgf[27] // r // float // current angle
  145. #define RGF_MOTOR_ANGLE_ERR rgf[28] // r // uint8 // current angle error
  146. // motor angle correction
  147. #define RGF_MOTOR_ANGLE_ANGLE_START rgf[30] // r // float // angle when motor start
  148. #define RGF_MOTOR_ANGLE_TURN_COUNT rgf[31] // r // uint32 // current turn count this start
  149. #define RGF_MOTOR_ANGLE_ANGLE_TOTAL rgf[32] // r // float // last agle within 720 degree for motor compensate
  150. #define RGF_MOTOR_ANGLE_START rgf[33] // r // uint1 // MT6816 start flag when motor start
  151. // useless motor params
  152. #define RGF_MOTOR_FREQUENCY rgf[35] // w // float // motor pwm frequency
  153. #define RGF_MOTOR_DUTY_CYCLE rgf[36] // w // float // motor pwm duty cycle, 0 - 100
  154. #define RGF_MOTOR_FULL_STEPS rgf[38] // w // uint32 // motor full steps, = 360 / stpDegree, 1.8 = 200
  155. #define RGF_MOTOR_MICROSTEPPING rgf[39] // w // uint8 // controller microstepping
  156. // motor base
  157. #define RGF_MOTOR_ENABLE rgf[40] // w // uint1 // motor power control, influenced by autoPower flag
  158. #define RGF_MOTOR_DIRECTION rgf[41] // w // uint1 // motor run direction
  159. #define RGF_MOTOR_SPEED rgf[42] // w // uint32 // motor speed in rad/s
  160. #define RGF_MOTOR_UNIT_DIVISION rgf[43] // w // uint32 // motor params unit division, 1/10/100... like
  161. #define RGF_MOTOR_ACCELERATION rgf[44] // w // uint32 // motor acceleration in rad/s^2
  162. #define RGF_MOTOR_DECELERATION rgf[45] // w // uint32 // motor deceleration in rad/s^2
  163. #define RGF_MOTOR_MODE rgf[46] // w // uint8 // motor mode, defien in MOTOR_STEP_SPEED_T_C_ATY.h
  164. #define RGF_MOTOR_ANGLE_LOCK_TARGET rgf[47] // w // float // motor angle lock target
  165. #define RGF_MOTOR_AUTO_POWER rgf[48] // w // uint1 // motor auto power, if this enable, ENABLE flag is not useful
  166. #define RGF_MOTOR_RUN_STATE rgf[49] // rw // uint8 // motor run state, defien in MOTOR_STEP_SPEED_T_C_ATY.h
  167. #define RGF_MOTOR_RUN rgf[50] // w // uint1 // motor run command, set 1 to run
  168. #define RGF_MOTOR_STEP_COUNT rgf[51] // w // uint32 // motor run step count, only valid in COUNT mode
  169. #define RGF_MOTOR_CURRENT_STEPS rgf[52] // r // uint32 // motor current run steps
  170. #define RGF_MOTOR_ACCEL_STEPS rgf[53] // r // uint32 // motor accel steps
  171. #define RGF_MOTOR_ACCEL_LIMIT rgf[54] // r // uint32 // motor accel steps when accel to full speed
  172. #define RGF_MOTOR_DECEL_STEPS rgf[55] // r // uint32 // motor decel steps
  173. #define RGF_MOTOR_DECEL_START rgf[56] // r // uint32 // motor decel start step number
  174. #define RGF_MOTOR_INFO_FROM rgf[60] // w // uint8 // 0: MT6816 SM, 1: MB SF, 2: MB flowmeter
  175. #define RGF_MOTOR_INFO_REG1_TARGET rgf[61] // w // uint32 // motor info register 1 target
  176. #define RGF_MOTOR_INFO_REG1_CURRENT rgf[62] // r // uint32 // motor info register 1 current
  177. #define RGF_MOTOR_INFO_REG2_TARGET rgf[63] // w // uint32 // motor info register 2 target
  178. #define RGF_MOTOR_INFO_REG2_CURRENT rgf[64] // r // uint32 // motor info register 2 current
  179. // Modbus ----------------------------------------------------------------------
  180. #include "MODBUS_S_LOW_ATY.h"
  181. uint8_t MODBUS1_UART(uint8_t* buf, uint8_t len){
  182. HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_SET);
  183. UartSendBytes(buf, len, &HW_UART_ATY_Dev_1);
  184. HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_RESET);
  185. return 0;
  186. }
  187. struct MODBUS_S_LOW_ATY_Dev MODBUS_S_LOW_ATY_Dev_1 = {
  188. .addr = 0x01,
  189. .mbRegs = {0},
  190. .uartSendBytes = MODBUS1_UART,
  191. .bigEndian = 0,
  192. .lock = __ATY_UNLOCKED
  193. };
  194. // CAN -------------------------------------------------------------------------
  195. #include "CAN_ATY.h"
  196. uint8_t CAN_1_FilterConfig(uint8_t bankId){
  197. CAN_FilterTypeDef sFilterConfig;
  198. if(bankId > 14){
  199. sFilterConfig.FilterBank = CAN_FILTER_BROADCAST;
  200. sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  201. sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  202. sFilterConfig.FilterIdHigh = 0x0000;
  203. sFilterConfig.FilterIdLow = 0x0000;
  204. sFilterConfig.FilterMaskIdHigh = 0x0000;
  205. sFilterConfig.FilterMaskIdLow = 0x0000;
  206. sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
  207. sFilterConfig.FilterActivation = ENABLE;
  208. sFilterConfig.SlaveStartFilterBank = 0;
  209. if(HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
  210. return 9;
  211. }
  212. if(bankId == 0 || bankId == CAN_FILTER_BROADCAST){
  213. sFilterConfig.FilterBank = CAN_FILTER_BROADCAST;
  214. sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  215. sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  216. sFilterConfig.FilterIdHigh = ((CAN_STD_ID_BROADCAST << 21) >> 16);
  217. sFilterConfig.FilterIdLow = (CAN_STD_ID_BROADCAST << 21) & 0xFFFF;
  218. sFilterConfig.FilterMaskIdHigh = 0xFFFF;
  219. sFilterConfig.FilterMaskIdLow = 0xFFFF;
  220. sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO1;
  221. sFilterConfig.FilterActivation = ENABLE;
  222. sFilterConfig.SlaveStartFilterBank = 0;
  223. if(HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
  224. return 1;
  225. }
  226. if(bankId == 0 || bankId == CAN_FILTER_MULTICAST){
  227. sFilterConfig.FilterBank = CAN_FILTER_MULTICAST;
  228. sFilterConfig.FilterIdHigh = (((CAN_STD_ID_MULTICAST + (uint8_t)RGF_SYS_GROUP_ID) << 21) >> 16);
  229. sFilterConfig.FilterIdLow = ((CAN_STD_ID_MULTICAST + (uint8_t)RGF_SYS_GROUP_ID) << 21) & 0xFFFF;
  230. sFilterConfig.FilterMaskIdHigh = 0xFFFF;
  231. sFilterConfig.FilterMaskIdLow = 0xFFFF;
  232. sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO1;
  233. sFilterConfig.FilterActivation = ENABLE;
  234. if(HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
  235. return 2;
  236. }
  237. if(bankId == 0 || bankId == CAN_FILTER_P2P){
  238. sFilterConfig.FilterBank = CAN_FILTER_P2P;
  239. sFilterConfig.FilterIdHigh = (((CAN_STD_ID_P2P + (uint8_t)RGF_SYS_ADDR) << 21) >> 16);
  240. sFilterConfig.FilterIdLow = ((CAN_STD_ID_P2P + (uint8_t)RGF_SYS_ADDR) << 21) & 0xFFFF;
  241. sFilterConfig.FilterMaskIdHigh = 0xFFFF;
  242. sFilterConfig.FilterMaskIdLow = 0xFFFF;
  243. sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO1;
  244. sFilterConfig.FilterActivation = ENABLE;
  245. if(HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
  246. return 3;
  247. }
  248. return 0;
  249. }
  250. uint8_t CAN_1_InitConfigStart(void){
  251. uint8_t err = 0;
  252. err = CAN_1_FilterConfig(0);
  253. if(err != 0) return err;
  254. if(HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
  255. err = 10;
  256. if(HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO1_MSG_PENDING) != HAL_OK)
  257. err = 11;
  258. if(HAL_CAN_Start(&hcan) != HAL_OK)
  259. err = 12;
  260. return err;
  261. }
  262. uint8_t CAN_1_AddTxMessage(uint32_t stdId, uint8_t* data, uint8_t len){
  263. CAN_TxHeaderTypeDef txHeader;
  264. uint32_t mailBox;
  265. txHeader.StdId = stdId;
  266. txHeader.IDE = CAN_ID_STD;
  267. txHeader.RTR = CAN_RTR_DATA;
  268. txHeader.DLC = len;
  269. txHeader.TransmitGlobalTime = DISABLE;
  270. HAL_CAN_AddTxMessage(&hcan, &txHeader, data, &mailBox);
  271. return 0;
  272. }
  273. struct CAN_ATY_Dev CAN_ATY_Dev_1 = {
  274. .addTxMessage = CAN_1_AddTxMessage,
  275. .addr = 0,
  276. .groupId = 0,
  277. .lock = __ATY_UNLOCKED
  278. };
  279. void CAN_1_UpdateFilter(uint8_t addr, uint8_t groupId){
  280. if(CAN_ATY_Dev_1.addr != addr){
  281. CAN_ATY_Dev_1.addr = addr;
  282. CAN_1_FilterConfig(0);
  283. }
  284. if(CAN_ATY_Dev_1.groupId != groupId){
  285. CAN_ATY_Dev_1.groupId = groupId;
  286. CAN_1_FilterConfig(CAN_FILTER_MULTICAST);
  287. }
  288. }
  289. void CAN_1_RxProcess(CAN_HandleTypeDef* hcan_t, uint32_t RxFifo){
  290. CAN_RxHeaderTypeDef rxHeader;
  291. uint8_t rxData[8] = {0};
  292. if(HAL_CAN_GetRxMessage(hcan_t, RxFifo, &rxHeader, rxData) != HAL_OK){
  293. return;
  294. }
  295. if(rxHeader.IDE != CAN_ID_STD || rxHeader.DLC < 2 || rxHeader.DLC < 6){
  296. return;
  297. }
  298. CAN_RX_Callback(&CAN_ATY_Dev_1, rxHeader.StdId, rgf, rxData);
  299. }
  300. void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef* hcan_t){
  301. if(hcan_t == &hcan){
  302. CAN_1_RxProcess(hcan_t, CAN_RX_FIFO0);
  303. }
  304. }
  305. void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef* hcan_t){
  306. if(hcan_t == &hcan){
  307. CAN_1_RxProcess(hcan_t, CAN_RX_FIFO1);
  308. }
  309. }
  310. // ADDR_KEY --------------------------------------------------------------------
  311. uint8_t KEY_Filter(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin){
  312. uint8_t repeat = 0;
  313. if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_SET) repeat++;
  314. if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_SET) repeat++;
  315. if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_SET) repeat++;
  316. if(repeat >= 2) return 1;
  317. else return 0;
  318. }
  319. uint8_t ADDR_KEY_Scan(void){
  320. uint8_t ADDR_KEY = 0;
  321. if(KEY_Filter(SEL_A_GPIO_Port, SEL_A_Pin) == 0)
  322. ADDR_KEY |= 0x01;
  323. if(KEY_Filter(SEL_B_GPIO_Port, SEL_B_Pin) == 0)
  324. ADDR_KEY |= 0x02;
  325. if(KEY_Filter(SEL_C_GPIO_Port, SEL_C_Pin) == 0)
  326. ADDR_KEY |= 0x04;
  327. if(KEY_Filter(SEL_D_GPIO_Port, SEL_D_Pin) == 0)
  328. ADDR_KEY |= 0x08;
  329. return ADDR_KEY;
  330. }
  331. // AlgorithmBase ---------------------------------------------------------------
  332. #include "ALGO_AlgorithmBase_ATY.h"
  333. // ADC -------------------------------------------------------------------------
  334. #include "HW_ADC_ATY.h"
  335. void MCU_CoreAdcGet(void){
  336. // F405/F407(mV)
  337. // float VOL_PER_AD_ATY = 1210.0 / ((float)(*(__IO uint16_t*)(0x1FFF7A2A)));
  338. // float VREFINT_MCU_ATY = ADC_Get(&hadc1, ADC_CHANNEL_VREFINT) * VOL_PER_AD_ATY;
  339. // float TEMPERATURE_MCU_ATY =
  340. // (((ADC_Get(&hadc1, ADC_CHANNEL_TEMPSENSOR) * VOL_PER_AD_ATY) - 760.0) / 2.5) + 25.0;
  341. // F103(mV)
  342. float VOL_PER_AD_ATY = 1200.0 / ADC_Get(&hadc1, ADC_CHANNEL_VREFINT);
  343. float VREFINT_MCU_ATY = ADC_Get(&hadc1, ADC_CHANNEL_VREFINT) * VOL_PER_AD_ATY;
  344. float TEMPERATURE_MCU_ATY = ((1430.0 -
  345. (ADC_Get(&hadc1, ADC_CHANNEL_TEMPSENSOR) * VOL_PER_AD_ATY)) / 4.3) + 25.0;
  346. float MCU_BASE_VOL_D = 1200;//VREFINT_MCU_ATY;
  347. float MCU_BASE_VOL = VREFINT_MCU_ATY;
  348. float MCU_TEMP = TEMPERATURE_MCU_ATY;
  349. printf_ATY_D("\r\nCAD: %f, CV: %f, CT: %f\r\n", VOL_PER_AD_ATY, MCU_BASE_VOL, MCU_TEMP);
  350. RGF_VOL_PER_AD = VOL_PER_AD_ATY;
  351. RGF_MCU_BASE_VOL = MCU_BASE_VOL;
  352. RGF_MCU_TEMP = MCU_TEMP;
  353. }
  354. // T ---------------------------------------------------------------------------
  355. #include "ALGO_Temperature_ATY.h"
  356. void BoardTempGet(void){
  357. float MCU_BASE_VOL_D = 1200;//VREFINT_MCU_ATY;
  358. float BOARD_TEMP = ALGO_VolToKelvinTemp((1000.0 *
  359. ADC_Get(&hadc1, ADC_CHANNEL_9) / MCU_BASE_VOL_D),
  360. 3300.0, 10.0, 10.0, 3950, 1);
  361. printf_ATY_D("\r\nT: %f\r\n", BOARD_TEMP);
  362. RGF_BOARD_TEMP = BOARD_TEMP;
  363. }
  364. // FAN -------------------------------------------------------------------------
  365. uint8_t fanLevel = 0;
  366. uint8_t fanLevelLast = 0;
  367. float currentPwm = 0;
  368. #define FAN_PWM_FULL 10000
  369. void FAN_ControlCycle(void){
  370. if((uint8_t)RGF_MOTOR_FAN_EN == 2){
  371. if(RGF_BOARD_TEMP > RGF_MOTOR_FAN_LOW_T){
  372. fanLevel = 0xFF;
  373. }
  374. else if(RGF_BOARD_TEMP < RGF_MOTOR_FAN_LOW_T - RGF_MOTOR_FAN_T_SPACE){
  375. fanLevel = 0;
  376. }
  377. }
  378. else if((uint8_t)RGF_MOTOR_FAN_EN == 10
  379. || ((uint8_t)RGF_MOTOR_FAN_EN == 1 && RGF_BOARD_TEMP >= (RGF_MOTOR_FAN_HIGH_T - RGF_MOTOR_FAN_T_SPACE))){
  380. fanLevel = 0xFF;
  381. }
  382. else if((uint8_t)RGF_MOTOR_FAN_EN == 1 && RGF_BOARD_TEMP > RGF_MOTOR_FAN_LOW_T){
  383. if((uint8_t)((RGF_BOARD_TEMP - RGF_MOTOR_FAN_LOW_T) / RGF_MOTOR_FAN_T_SPACE) + 1 != fanLevel){
  384. fanLevel = (uint8_t)(((RGF_BOARD_TEMP - RGF_MOTOR_FAN_LOW_T) / RGF_MOTOR_FAN_T_SPACE) + 1);
  385. currentPwm = (RGF_MOTOR_FAN_BASE / 100.0 * FAN_PWM_FULL)
  386. + ((FAN_PWM_FULL - (RGF_MOTOR_FAN_BASE / 100.0 * FAN_PWM_FULL)) * fanLevel
  387. / ((RGF_MOTOR_FAN_HIGH_T - RGF_MOTOR_FAN_LOW_T) / RGF_MOTOR_FAN_T_SPACE));
  388. if(currentPwm >= FAN_PWM_FULL){
  389. currentPwm = FAN_PWM_FULL;
  390. fanLevel = ((RGF_MOTOR_FAN_HIGH_T - RGF_MOTOR_FAN_LOW_T) / RGF_MOTOR_FAN_T_SPACE) + 1;
  391. }
  392. }
  393. }
  394. else{
  395. fanLevel = 0;
  396. }
  397. if(fanLevel == fanLevelLast) return;
  398. fanLevelLast = fanLevel;
  399. if(fanLevel == 0xFF){
  400. HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
  401. __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, FAN_PWM_FULL);
  402. HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  403. }
  404. else if(fanLevel == 0){
  405. __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0);
  406. HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
  407. }
  408. else{
  409. HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
  410. __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, currentPwm);
  411. HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  412. }
  413. }
  414. void FAN_Init(void){
  415. RGF_MOTOR_FAN_EN = 2;
  416. RGF_MOTOR_FAN_BASE = 0;
  417. RGF_MOTOR_FAN_LOW_T = 40;
  418. RGF_MOTOR_FAN_HIGH_T = 80;
  419. RGF_MOTOR_FAN_T_SPACE = 5;
  420. }
  421. // MT6816 ---------------------------------------------------------------------
  422. #include "MT6816_ATY.h"
  423. void MT6816_1_NSS_SET(uint8_t level){
  424. if(level == __ATY_HL_L)
  425. HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_RESET);
  426. else if(level == __ATY_HL_H)
  427. HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET);
  428. }
  429. uint8_t MT6816_1_SPI(uint8_t* data_t, uint16_t len, uint8_t rw){
  430. if(rw == __ATY_RW_R){
  431. return HAL_SPI_Receive(&hspi1, (uint8_t*)data_t, len, 1000);
  432. }
  433. else{
  434. return HAL_SPI_Transmit(&hspi1, (uint8_t*)data_t, len, 1000);
  435. }
  436. }
  437. struct MT6816_ATY_Dev MT6816_ATY_Dev_1 = {
  438. .nssSet = MT6816_1_NSS_SET,
  439. .spiProcess = MT6816_1_SPI,
  440. .angleValue = 0,
  441. .angle = 0,
  442. .angleLast = 0,
  443. .angleStart = 0,
  444. .angleTotal = 0,
  445. .turnCount = 0,
  446. .start = 0,
  447. .error = 0,
  448. .zeroPoint = 0,
  449. .angleReverseDir = 1,
  450. .lock = __ATY_UNLOCKED
  451. };
  452. void MT6816_1_Init(void){
  453. MT6816_ReadAngleFull(&MT6816_ATY_Dev_1);
  454. HAL_Delay(100);
  455. MT6816_ReadAngleFull(&MT6816_ATY_Dev_1);
  456. RGF_MOTOR_ANGLE_SET_ZERO = 0;
  457. RGF_MOTOR_ANGLE_ZERO = MT6816_ATY_Dev_1.zeroPoint;
  458. RGF_MOTOR_ANGLE = MT6816_ATY_Dev_1.angle;
  459. RGF_MOTOR_ANGLE_ERR = MT6816_ATY_Dev_1.error;
  460. RGF_MOTOR_ANGLE_ANGLE_START = MT6816_ATY_Dev_1.angleStart;
  461. RGF_MOTOR_ANGLE_TURN_COUNT = MT6816_ATY_Dev_1.turnCount;
  462. RGF_MOTOR_ANGLE_ANGLE_TOTAL = MT6816_ATY_Dev_1.angleTotal;
  463. RGF_MOTOR_ANGLE_START = MT6816_ATY_Dev_1.start;
  464. }
  465. void MT6816_1_UpdateCycle(void){
  466. MT6816_ReadAngleFull(&MT6816_ATY_Dev_1);
  467. MT6816_TurnCountOffset(&MT6816_ATY_Dev_1);
  468. if((uint8_t)RGF_MOTOR_ANGLE_SET_ZERO == 1){
  469. RGF_MOTOR_ANGLE_SET_ZERO = 0;
  470. MT6816_SetZeroPoint(&MT6816_ATY_Dev_1);
  471. }
  472. RGF_MOTOR_ANGLE_ZERO = MT6816_ATY_Dev_1.zeroPoint;
  473. RGF_MOTOR_ANGLE = MT6816_ATY_Dev_1.angle;
  474. RGF_MOTOR_ANGLE_ERR = MT6816_ATY_Dev_1.error;
  475. RGF_MOTOR_ANGLE_ANGLE_START = MT6816_ATY_Dev_1.angleStart;
  476. RGF_MOTOR_ANGLE_TURN_COUNT = MT6816_ATY_Dev_1.turnCount;
  477. RGF_MOTOR_ANGLE_ANGLE_TOTAL = MT6816_ATY_Dev_1.angleTotal;
  478. RGF_MOTOR_ANGLE_START = MT6816_ATY_Dev_1.start;
  479. }
  480. #define MS_1_TIM htim1
  481. #define MS_1_TIM_CHANNEL TIM_CHANNEL_1
  482. #define MS_1_TIM_ACTIVE_CHANNEL HAL_TIM_ACTIVE_CHANNEL_1
  483. #define MS_1_TIM_IT_CC TIM_IT_CC1
  484. // MSSTC -----------------------------------------------------------------------
  485. #include "MOTOR_STEP_SPEED_T_C_ATY.h"
  486. uint8_t MSSTC_1_EnSet(uint8_t en){
  487. HAL_GPIO_WritePin(MS_EN_GPIO_Port, MS_EN_Pin,
  488. (en == 0) ? GPIO_PIN_SET : GPIO_PIN_RESET);
  489. return 0;
  490. }
  491. uint8_t MSSTC_1_DirSet(uint8_t dir){
  492. HAL_GPIO_WritePin(MS_DIR_GPIO_Port, MS_DIR_Pin,
  493. (dir == __ATY_PN_P) ? GPIO_PIN_SET : GPIO_PIN_RESET);
  494. return 0;
  495. }
  496. void MSSTC_1_SetTimerCompare(uint32_t value){
  497. if(value > 65535) value = 65535;
  498. __HAL_TIM_SET_COMPARE(&MS_1_TIM, MS_1_TIM_CHANNEL, value);
  499. __HAL_TIM_SET_AUTORELOAD(&MS_1_TIM, value);
  500. __HAL_TIM_SET_COUNTER(&MS_1_TIM, 0);
  501. }
  502. void MSSTC_1_Start(void){
  503. __HAL_TIM_SET_COUNTER(&MS_1_TIM, 0);
  504. HAL_TIM_OC_Start_IT(&MS_1_TIM, MS_1_TIM_CHANNEL);
  505. }
  506. void MSSTC_1_Stop(void){
  507. HAL_TIM_OC_Stop_IT(&MS_1_TIM, MS_1_TIM_CHANNEL);
  508. }
  509. struct MOTOR_STEP_SPEED_T_C_ATY_Dev MSSTC_Dev_1 = {
  510. .enSet = MSSTC_1_EnSet,
  511. .dirSet = MSSTC_1_DirSet,
  512. .start = MSSTC_1_Start,
  513. .stop = MSSTC_1_Stop,
  514. .setTimerCompare = MSSTC_1_SetTimerCompare,
  515. .timerFreq = 500000,
  516. .fullSteps = 200,
  517. .microstepping = 8,
  518. .enable = 0,
  519. .direction = __ATY_PN_P,
  520. .fullSpeed = 20,
  521. .unitDivision = 1,
  522. .acceleration = 100,
  523. .deceleration = 200,
  524. .mode = MSSTC_MODE_DISTANCE_CLOSE,
  525. .angleLock = 0,
  526. .powerOnlyRun = 1,
  527. .turnBackAllowed = 1,
  528. .runState = MSSTC_STATE_STANDBY,
  529. .lock = __ATY_UNLOCKED
  530. };
  531. void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef* htim){
  532. if(htim->Instance == TIM1 && htim->Channel == MS_1_TIM_ACTIVE_CHANNEL){
  533. if(__HAL_TIM_GET_IT_SOURCE(&MS_1_TIM, MS_1_TIM_IT_CC) != RESET){
  534. __HAL_TIM_CLEAR_IT(&MS_1_TIM, MS_1_TIM_IT_CC);
  535. if((MSSTC_Dev_1.mode == MSSTC_MODE_SPEED_OPEN
  536. && MSSTC_Dev_1.runState == MSSTC_STATE_FULL)){
  537. __HAL_TIM_DISABLE_IT(&MS_1_TIM, MS_1_TIM_IT_CC);
  538. }
  539. else{
  540. MSSTC_IRQHandler(&MSSTC_Dev_1);
  541. }
  542. }
  543. }
  544. }
  545. void MSSTC_1_Init(void){
  546. MT6816_1_Init();
  547. HAL_GPIO_WritePin(MS_SP_GPIO_Port, MS_SP_Pin, GPIO_PIN_SET);
  548. HAL_GPIO_WritePin(MS_MS1_GPIO_Port, MS_MS1_Pin, GPIO_PIN_RESET);
  549. HAL_GPIO_WritePin(MS_MS2_GPIO_Port, MS_MS2_Pin, GPIO_PIN_RESET);
  550. HAL_GPIO_WritePin(MS_EN_GPIO_Port, MS_EN_Pin, GPIO_PIN_SET);
  551. RGF_MOTOR_FREQUENCY = (1600.0 / 60.0);
  552. RGF_MOTOR_DUTY_CYCLE = 50.0;
  553. RGF_MOTOR_FULL_STEPS = MSSTC_Dev_1.fullSteps;
  554. RGF_MOTOR_MICROSTEPPING = MSSTC_Dev_1.microstepping;
  555. RGF_MOTOR_ENABLE = MSSTC_Dev_1.enable;
  556. RGF_MOTOR_DIRECTION = MSSTC_Dev_1.direction;
  557. RGF_MOTOR_SPEED = MSSTC_Dev_1.fullSpeed;
  558. RGF_MOTOR_UNIT_DIVISION = MSSTC_Dev_1.unitDivision;
  559. RGF_MOTOR_ACCELERATION = MSSTC_Dev_1.acceleration;
  560. RGF_MOTOR_DECELERATION = MSSTC_Dev_1.deceleration;
  561. RGF_MOTOR_MODE = MSSTC_Dev_1.mode;
  562. RGF_MOTOR_ANGLE_LOCK_TARGET = MSSTC_Dev_1.angleLock;
  563. RGF_MOTOR_AUTO_POWER = MSSTC_Dev_1.powerOnlyRun;
  564. RGF_MOTOR_RUN_STATE = MSSTC_Dev_1.runState;
  565. RGF_MOTOR_RUN = 1;
  566. RGF_MOTOR_STEP_COUNT = 1600;
  567. }
  568. void MSSTC_1_Cycle(void){
  569. if(MSSTC_IsRunning(&MSSTC_Dev_1) != 1){
  570. MSSTC_Dev_1.fullSteps = (uint32_t)RGF_MOTOR_FULL_STEPS;
  571. if(MSSTC_Dev_1.microstepping != (uint32_t)RGF_MOTOR_MICROSTEPPING){
  572. MSSTC_Dev_1.microstepping = (uint32_t)RGF_MOTOR_MICROSTEPPING;
  573. MSSTC_Dev_1.enSet(0);
  574. if(MSSTC_Dev_1.microstepping == 8){
  575. HAL_GPIO_WritePin(MS_MS1_GPIO_Port, MS_MS1_Pin, GPIO_PIN_RESET);
  576. HAL_GPIO_WritePin(MS_MS2_GPIO_Port, MS_MS2_Pin, GPIO_PIN_RESET);
  577. }
  578. else if(MSSTC_Dev_1.microstepping == 16){
  579. HAL_GPIO_WritePin(MS_MS1_GPIO_Port, MS_MS1_Pin, GPIO_PIN_SET);
  580. HAL_GPIO_WritePin(MS_MS2_GPIO_Port, MS_MS2_Pin, GPIO_PIN_SET);
  581. }
  582. else if(MSSTC_Dev_1.microstepping == 32){
  583. HAL_GPIO_WritePin(MS_MS1_GPIO_Port, MS_MS1_Pin, GPIO_PIN_RESET);
  584. HAL_GPIO_WritePin(MS_MS2_GPIO_Port, MS_MS2_Pin, GPIO_PIN_SET);
  585. }
  586. else if(MSSTC_Dev_1.microstepping == 64){
  587. HAL_GPIO_WritePin(MS_MS1_GPIO_Port, MS_MS1_Pin, GPIO_PIN_SET);
  588. HAL_GPIO_WritePin(MS_MS2_GPIO_Port, MS_MS2_Pin, GPIO_PIN_RESET);
  589. }
  590. if(MSSTC_Dev_1.powerOnlyRun == 0){
  591. MSSTC_Dev_1.enSet(MSSTC_Dev_1.enable);
  592. }
  593. }
  594. if(MSSTC_Dev_1.enable != (uint8_t)RGF_MOTOR_ENABLE){
  595. MSSTC_Dev_1.enable = (uint8_t)RGF_MOTOR_ENABLE;
  596. if(MSSTC_Dev_1.powerOnlyRun == 0){
  597. MSSTC_Dev_1.enSet(MSSTC_Dev_1.enable);
  598. }
  599. }
  600. if(MSSTC_Dev_1.direction != (uint8_t)RGF_MOTOR_DIRECTION){
  601. MSSTC_Dev_1.direction = (uint8_t)RGF_MOTOR_DIRECTION;
  602. MSSTC_Dev_1.dirSet(MSSTC_Dev_1.direction);
  603. MT6816_TurnCountOffsetStart(&MT6816_ATY_Dev_1, MSSTC_Dev_1.direction);
  604. MT6816_TurnCountOffsetStop(&MT6816_ATY_Dev_1);
  605. }
  606. MSSTC_Dev_1.fullSpeed = (uint32_t)RGF_MOTOR_SPEED;
  607. MSSTC_Dev_1.unitDivision = (uint32_t)RGF_MOTOR_UNIT_DIVISION;
  608. MSSTC_Dev_1.acceleration = (uint32_t)RGF_MOTOR_ACCELERATION;
  609. MSSTC_Dev_1.deceleration = (uint32_t)RGF_MOTOR_DECELERATION;
  610. MSSTC_Dev_1.mode = (uint8_t)RGF_MOTOR_MODE;
  611. if(MSSTC_Dev_1.angleLock != (uint16_t)RGF_MOTOR_ANGLE_LOCK_TARGET){
  612. MSSTC_Dev_1.angleLock = (uint16_t)RGF_MOTOR_ANGLE_LOCK_TARGET;
  613. if(MSSTC_Dev_1.mode == 1){
  614. }
  615. }
  616. if(MSSTC_Dev_1.powerOnlyRun != (uint8_t)RGF_MOTOR_AUTO_POWER){
  617. MSSTC_Dev_1.powerOnlyRun = (uint8_t)RGF_MOTOR_AUTO_POWER;
  618. if(MSSTC_Dev_1.powerOnlyRun == 0){
  619. MSSTC_Dev_1.enSet(MSSTC_Dev_1.enable);
  620. }
  621. else{
  622. MSSTC_Dev_1.enSet(0);
  623. }
  624. }
  625. }
  626. MT6816_1_UpdateCycle();
  627. MSSTC_UpdateAngle(&MSSTC_Dev_1,
  628. MT6816_ATY_Dev_1.turnCount,
  629. MT6816_ATY_Dev_1.angleTotal + MT6816_ATY_Dev_1.angleStart);
  630. if(MSSTC_Dev_1.mode == MSSTC_MODE_SPEED_OPEN
  631. && MSSTC_Dev_1.fullSpeed != (uint32_t)RGF_MOTOR_SPEED){
  632. MSSTC_Dev_1.fullSpeed = (uint32_t)RGF_MOTOR_SPEED;
  633. MSSTC_UpdateFullSpeed(&MSSTC_Dev_1);
  634. }
  635. if((uint8_t)RGF_MOTOR_RUN == 1){
  636. MT6816_TurnCountOffsetStart(&MT6816_ATY_Dev_1, MSSTC_Dev_1.direction);
  637. MSSTC_Move(&MSSTC_Dev_1, RGF_MOTOR_STEP_COUNT, MT6816_ATY_Dev_1.angleStart);
  638. }
  639. else if((uint8_t)RGF_MOTOR_RUN == 2){
  640. MSSTC_Scram(&MSSTC_Dev_1);
  641. }
  642. else if((uint8_t)RGF_MOTOR_RUN == 3){
  643. MSSTC_Stop(&MSSTC_Dev_1);
  644. __HAL_TIM_ENABLE_IT(&MS_1_TIM, MS_1_TIM_IT_CC);
  645. }
  646. RGF_MOTOR_RUN = 0;
  647. if(MSSTC_Dev_1.runState == MSSTC_STATE_STANDBY
  648. && MT6816_ATY_Dev_1.start == 1){
  649. MT6816_TurnCountOffsetStop(&MT6816_ATY_Dev_1);
  650. }
  651. RGF_MOTOR_ENABLE = MSSTC_Dev_1.enable;
  652. RGF_MOTOR_DIRECTION = MSSTC_Dev_1.direction;
  653. RGF_MOTOR_RUN_STATE = MSSTC_Dev_1.runState;
  654. RGF_MOTOR_CURRENT_STEPS = MSSTC_Dev_1.stepCountCurrent;
  655. RGF_MOTOR_ACCEL_STEPS = MSSTC_Dev_1.accelSteps;
  656. RGF_MOTOR_ACCEL_LIMIT = MSSTC_Dev_1.accelLimit;
  657. RGF_MOTOR_DECEL_STEPS = MSSTC_Dev_1.decelSteps;
  658. RGF_MOTOR_DECEL_START = MSSTC_Dev_1.decelStart;
  659. }
  660. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim){
  661. if(htim == &htim4){
  662. UserTimerLoop_Cycle1ms(&HW_TIMER_ATY_Dev_4);
  663. }
  664. // if((uint8_t)RGF_MOTOR_MODE == 0 && htim == &MS_1_COUNT_TIM){
  665. // HAL_TIM_PWM_Stop(&MS_1_TIM, MS_1_TIM_CHANNEL);
  666. // HAL_TIM_Base_Stop_IT(&MS_1_COUNT_TIM);
  667. // RGF_MOTOR_STEP_COUNT = 0;
  668. // MOTOR_STEP_O_ATY_Dev_1.stepCount = 0;
  669. // }
  670. }
  671. // user ------------------------------------------------------------------------
  672. uint8_t CNA_T_regAddr = 16;
  673. uint8_t CNA_T_regEnable = 0;
  674. uint8_t
  675. /* ATY Machine ****************************************************************/
  676. void TimerLoopProcess_User_4(void){
  677. if(HW_TIMER_ATY_Dev_4.ms1_f == 1){
  678. HW_TIMER_ATY_Dev_4.ms1_f = 0;
  679. }
  680. if(HW_TIMER_ATY_Dev_4.ms100_f == 1){
  681. HW_TIMER_ATY_Dev_4.ms100_f = 0;
  682. SysLedBlink(&LED_ATY_t_1);
  683. UpdateMbRegsFromFloat(rgf, &MODBUS_S_LOW_ATY_Dev_1);
  684. CAN_1_UpdateFilter((uint8_t)RGF_SYS_ADDR, (uint8_t)RGF_SYS_GROUP_ID);
  685. MSSTC_1_Cycle();
  686. if(CNA_T_regEnable == 1){
  687. CNA_T_regEnable = 0;
  688. CAN_RegRW(&CAN_ATY_Dev_1, CAN_STD_ID_P2P + 8, CAN_CMD_WRITE, CNA_T_regAddr, rgf[CNA_T_regAddr]);
  689. }
  690. }
  691. if(HW_TIMER_ATY_Dev_4.s1_f == 1){
  692. HW_TIMER_ATY_Dev_4.s1_f = 0;
  693. MCU_CoreAdcGet();
  694. BoardTempGet();
  695. RGF_SYS_TIME = HW_TIMER_ATY_Dev_4.msN / 1000;
  696. FAN_ControlCycle();
  697. // CAN_RegRW(&CAN_ATY_Dev_1, CAN_STD_ID_P2P + 8, CAN_CMD_WRITE, 16, 1);
  698. uint8_t send[8] = {0x01, 0x03, 0x20, 0x1A, 0x00, 0x02, 0xEE, 0x0C};
  699. MODBUS1_UART(send, 8);
  700. }
  701. }
  702. void UartReceiveProcess_User_1(void){
  703. if(HW_UART_ATY_Dev_1.rx[0] == 'O'
  704. && HW_UART_ATY_Dev_1.rx[1] == 'K'
  705. && HW_UART_ATY_Dev_1.rx[2] == '?')
  706. printf_ATY("OK!");
  707. if(HW_UART_ATY_Dev_1.rxCount != 0){
  708. Modbus_Process(HW_UART_ATY_Dev_1.rx, HW_UART_ATY_Dev_1.rxCount, &MODBUS_S_LOW_ATY_Dev_1);
  709. if(MODBUS_S_LOW_ATY_Dev_1.setFlag == 1){
  710. MODBUS_S_LOW_ATY_Dev_1.setFlag = 0;
  711. TransMbRegsToFloat(rgf, &MODBUS_S_LOW_ATY_Dev_1);
  712. }
  713. }
  714. }
  715. #include "iwdg.h"
  716. void MainInit(void){
  717. // MX_IWDG_Init();
  718. LED_ATY_t_1.ledBlinkType = 0x02;
  719. // addr
  720. RGF_SYS_ADDR = (float)ADDR_KEY_Scan();
  721. RGF_SYS_GROUP_ID = 0;
  722. // mb
  723. MODBUS_S_LOW_ATY_Dev_1.addr = (uint8_t)RGF_SYS_ADDR;
  724. // can
  725. CAN_ATY_Dev_1.addr = (uint8_t)RGF_SYS_ADDR;
  726. CAN_ATY_Dev_1.groupId = (uint8_t)RGF_SYS_GROUP_ID;
  727. CAN_1_InitConfigStart();
  728. // fan
  729. FAN_Init();
  730. // MSSTC
  731. MSSTC_1_Init();
  732. printf_ATY("\r\nHello word!\r\n");
  733. LED_ATY_t_1.ledBlinkType = 0x20;
  734. }
  735. /* USER CODE END 0 */
  736. /**
  737. * @brief The application entry point.
  738. * @retval int
  739. */
  740. int main(void)
  741. {
  742. /* USER CODE BEGIN 1 */
  743. /* USER CODE END 1 */
  744. /* MCU Configuration--------------------------------------------------------*/
  745. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  746. HAL_Init();
  747. /* USER CODE BEGIN Init */
  748. /* USER CODE END Init */
  749. /* Configure the system clock */
  750. SystemClock_Config();
  751. /* USER CODE BEGIN SysInit */
  752. /* USER CODE END SysInit */
  753. /* Initialize all configured peripherals */
  754. MX_GPIO_Init();
  755. MX_DMA_Init();
  756. MX_TIM4_Init();
  757. MX_SPI1_Init();
  758. MX_TIM2_Init();
  759. MX_TIM1_Init();
  760. MX_USART2_UART_Init();
  761. MX_ADC1_Init();
  762. MX_CAN_Init();
  763. MX_TIM3_Init();
  764. MX_RTC_Init();
  765. /* USER CODE BEGIN 2 */
  766. MainInit();
  767. /* USER CODE END 2 */
  768. /* Infinite loop */
  769. /* USER CODE BEGIN WHILE */
  770. while(1){
  771. UartReceiveProcess(&HW_UART_ATY_Dev_1);
  772. UserTimerLoopProcess(&HW_TIMER_ATY_Dev_4);
  773. /* USER CODE END WHILE */
  774. /* USER CODE BEGIN 3 */
  775. }
  776. /* USER CODE END 3 */
  777. }
  778. /**
  779. * @brief System Clock Configuration
  780. * @retval None
  781. */
  782. void SystemClock_Config(void)
  783. {
  784. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  785. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  786. RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  787. /** Initializes the RCC Oscillators according to the specified parameters
  788. * in the RCC_OscInitTypeDef structure.
  789. */
  790. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
  791. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  792. RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  793. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  794. RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  795. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  796. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  797. RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  798. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  799. {
  800. Error_Handler();
  801. }
  802. /** Initializes the CPU, AHB and APB buses clocks
  803. */
  804. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  805. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  806. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  807. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  808. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  809. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  810. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  811. {
  812. Error_Handler();
  813. }
  814. PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_ADC;
  815. PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
  816. PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
  817. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  818. {
  819. Error_Handler();
  820. }
  821. }
  822. /* USER CODE BEGIN 4 */
  823. /* USER CODE END 4 */
  824. /**
  825. * @brief This function is executed in case of error occurrence.
  826. * @retval None
  827. */
  828. void Error_Handler(void)
  829. {
  830. /* USER CODE BEGIN Error_Handler_Debug */
  831. /* User can add his own implementation to report the HAL error return state */
  832. __disable_irq();
  833. while(1){
  834. }
  835. /* USER CODE END Error_Handler_Debug */
  836. }
  837. #ifdef USE_FULL_ASSERT
  838. /**
  839. * @brief Reports the name of the source file and the source line number
  840. * where the assert_param error has occurred.
  841. * @param file: pointer to the source file name
  842. * @param line: assert_param error line source number
  843. * @retval None
  844. */
  845. void assert_failed(uint8_t *file, uint32_t line)
  846. {
  847. /* USER CODE BEGIN 6 */
  848. /* User can add his own implementation to report the file name and line number,
  849. ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  850. /* USER CODE END 6 */
  851. }
  852. #endif /* USE_FULL_ASSERT */