Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.82 KB | None | 0 0
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
  10. * All rights reserved.</center></h2>
  11. *
  12. * This software component is licensed by ST under BSD 3-Clause license,
  13. * the "License"; You may not use this file except in compliance with the
  14. * License. You may obtain a copy of the License at:
  15. * opensource.org/licenses/BSD-3-Clause
  16. *
  17. ******************************************************************************
  18. */
  19. /* USER CODE END Header */
  20.  
  21. /* Includes ------------------------------------------------------------------*/
  22. #include "main.h"
  23.  
  24. /* Private includes ----------------------------------------------------------*/
  25. /* USER CODE BEGIN Includes */
  26.  
  27. /* USER CODE END Includes */
  28.  
  29. /* Private typedef -----------------------------------------------------------*/
  30. /* USER CODE BEGIN PTD */
  31.  
  32. /* USER CODE END PTD */
  33.  
  34. /* Private define ------------------------------------------------------------*/
  35. /* USER CODE BEGIN PD */
  36.  
  37. /* USER CODE END PD */
  38.  
  39. /* Private macro -------------------------------------------------------------*/
  40. /* USER CODE BEGIN PM */
  41.  
  42. /* USER CODE END PM */
  43.  
  44. /* Private variables ---------------------------------------------------------*/
  45. TIM_HandleTypeDef htim6;
  46.  
  47. UART_HandleTypeDef huart6;
  48.  
  49. /* USER CODE BEGIN PV */
  50.  
  51. /* USER CODE END PV */
  52.  
  53. /* Private function prototypes -----------------------------------------------*/
  54. void SystemClock_Config(void);
  55. static void MX_GPIO_Init(void);
  56. static void MX_USART6_UART_Init(void);
  57. static void MX_TIM6_Init(void);
  58. /* USER CODE BEGIN PFP */
  59.  
  60. /* USER CODE END PFP */
  61.  
  62. /* Private user code ---------------------------------------------------------*/
  63. /* USER CODE BEGIN 0 */
  64.  
  65. /* USER CODE END 0 */
  66.  
  67.  
  68.  
  69. #define IT_ENABLE 0
  70. #define IT_DISABLE 1
  71.  
  72. static short int MODE = IT_ENABLE;
  73.  
  74. static short int RECEIVED = 1;
  75.  
  76. int receive_str(char* dst) {
  77.  
  78. HAL_StatusTypeDef status;
  79. if (MODE != IT_ENABLE){
  80. status = HAL_UART_Receive(&huart6, dst, 1, HAL_MAX_DELAY);
  81. if(status != HAL_OK){
  82. return status;
  83. }
  84. char buf[1];
  85. sprintf(buf, "%c", *dst);
  86. transmit_str(buf);
  87. return status;
  88. } else {
  89. RECEIVED = 1;
  90. HAL_UART_Receive_IT(&huart6, dst, 1);
  91. while (RECEIVED){
  92. if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_15) == 0){
  93. change_mode();
  94. }
  95. }
  96. return HAL_OK;
  97. }
  98. }
  99.  
  100. int transmit_str(const char* src)
  101. {
  102. if(MODE != IT_ENABLE){
  103. return HAL_UART_Transmit(&huart6, src, strlen(src), HAL_MAX_DELAY);
  104. }else{
  105. RECEIVED = 1;
  106. HAL_UART_Transmit_IT(&huart6, src, strlen(src));
  107. while(RECEIVED);
  108. return HAL_OK;
  109. }
  110. }
  111.  
  112. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
  113. if(huart == &huart6)
  114. {
  115. RECEIVED = 0;
  116. }
  117. }
  118.  
  119. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
  120. if(huart == &huart6)
  121. {
  122. RECEIVED = 0;
  123. }
  124. }
  125.  
  126. int change_mode(){
  127. HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_14);
  128. HAL_Delay(500);
  129. HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_14);
  130. HAL_Delay(500);
  131. MODE = 1 - MODE;
  132. return 0;
  133. }
  134.  
  135. int errors_count = 0;
  136. int i = 0;
  137. char code_source[] = {'r', 'o', 'f', 'l', 'a', 'n', 'n', 'n'};
  138.  
  139. HAL_StatusTypeDef writeDeleteSymbol(huart) {
  140. const char delete[] = "\x08 \x08";
  141. return transmit_str((uint8_t*)delete);
  142. }
  143.  
  144. void checkCounter(char symbol) {
  145. const isRight = code_source[i] == symbol;
  146. if (isRight) {
  147. i++;
  148. errors_count = 0;
  149. if (sizeof(code_source) / sizeof(char) == i || code_source[i] == '\0') {
  150. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);
  151. HAL_Delay(300);
  152. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET);
  153. for (int k = 0; k < i; k++) {
  154. writeDeleteSymbol(&huart6);
  155. }
  156. i = 0;
  157. transmit_str("Success\r\n");
  158. return;
  159. }
  160. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
  161. HAL_Delay(300);
  162. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
  163. return;
  164. }
  165. for (int k = 0; k <= i; k++) {
  166. writeDeleteSymbol(&huart6);
  167. }
  168. i = 0;
  169. errors_count++;
  170. if (errors_count == 3) {
  171. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);
  172. HAL_Delay(200);
  173. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);
  174. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);
  175. HAL_Delay(200);
  176. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);
  177. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);
  178. HAL_Delay(200);
  179. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);
  180. errors_count = 0;
  181. return;
  182. }
  183. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);
  184. HAL_Delay(300);
  185. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);
  186. }
  187.  
  188.  
  189. HAL_StatusTypeDef HAL_UART_ReceiveString(
  190. UART_HandleTypeDef *huart, uint8_t *pData,
  191. uint16_t Size) {
  192. const char newline[] = "\r\n";
  193. const char delete[] = "\x08 \x08";
  194. const uint32_t Timeout = HAL_MAX_DELAY;
  195. HAL_StatusTypeDef status;
  196.  
  197. if(Size == 0)
  198. return HAL_ERROR;
  199.  
  200. int forIndex = 0;
  201. for(;;) {
  202. status = receive_str(&pData[forIndex]);
  203. transmit_str("Success\r\n");
  204. if(status != HAL_OK)
  205. return status;
  206.  
  207. if((pData[forIndex] == '\x08')||(pData[forIndex] == '\x7F')) { // backspace
  208. if(forIndex > 0) {
  209. status = writeDeleteSymbol(huart);
  210. if(status != HAL_OK)
  211. return status;
  212. forIndex--;
  213. }
  214. continue;
  215. }
  216.  
  217. if((pData[forIndex] == '\r') || (pData[forIndex] == '\n')) {
  218. pData[forIndex] = '\0';
  219. status = transmit_str((uint8_t*)newline);
  220. if(status != HAL_OK)
  221. return status;
  222. break;
  223. }
  224.  
  225. // last character is reserved for '\0', ignore
  226. status = transmit_str("*");
  227. if(status != HAL_OK)
  228. return status;
  229. forIndex++;
  230. if(forIndex == Size)
  231. break;
  232.  
  233. }
  234.  
  235. return HAL_OK;
  236. }
  237.  
  238. HAL_StatusTypeDef checkPassword(UART_HandleTypeDef *huart, uint8_t *pData) {
  239. while (1)
  240. {
  241. HAL_StatusTypeDef status;
  242. int if_set = 0;
  243. while(i < 8) {
  244. status = receive_str(&pData[i]);
  245. if (status != HAL_OK)
  246. return status;
  247. if (pData[i] == '+') {
  248. i = 0;
  249. transmit_str("\r\n");
  250. transmit_str("Tap a new password\r\n");
  251. HAL_UART_ReceiveString(huart, code_source, 8);
  252. transmit_str("\r\nSaved\r\n");
  253. continue;
  254. }
  255. status = transmit_str("*");
  256. if(status != HAL_OK)
  257. return status;
  258. checkCounter(pData[i]);
  259. // sleep
  260. }
  261. /* USER CODE END WHILE */
  262.  
  263. /* USER CODE BEGIN 3 */
  264. }
  265. return HAL_OK;
  266. }
  267.  
  268. /**
  269. * @brief The application entry point.
  270. * @retval int
  271. */
  272. int main(void)
  273. {
  274. /* USER CODE BEGIN 1 */
  275.  
  276. /* USER CODE END 1 */
  277.  
  278.  
  279. /* MCU Configuration--------------------------------------------------------*/
  280.  
  281. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  282. HAL_Init();
  283.  
  284. /* USER CODE BEGIN Init */
  285.  
  286. /* USER CODE END Init */
  287.  
  288. /* Configure the system clock */
  289. SystemClock_Config();
  290.  
  291. /* USER CODE BEGIN SysInit */
  292.  
  293. /* USER CODE END SysInit */
  294.  
  295. /* Initialize all configured peripherals */
  296. MX_GPIO_Init();
  297. MX_USART6_UART_Init();
  298. MX_TIM6_Init();
  299. /* USER CODE BEGIN 2 */
  300.  
  301. /* USER CODE END 2 */
  302.  
  303. /* Infinite loop */
  304. /* USER CODE BEGIN WHILE */
  305.  
  306. while (1)
  307. {
  308. uint8_t *pData;
  309. UART_HandleTypeDef *huart = &huart6;
  310. char codeSource[8];
  311. checkPassword(huart, codeSource);
  312. /* USER CODE END WHILE */
  313.  
  314. /* USER CODE BEGIN 3 */
  315. }
  316. /* USER CODE END 3 */
  317. }
  318. /**
  319. * @brief System Clock Configuration
  320. * @retval None
  321. */
  322. void SystemClock_Config(void)
  323. {
  324. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  325. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  326.  
  327. /** Configure the main internal regulator output voltage
  328. */
  329. __HAL_RCC_PWR_CLK_ENABLE();
  330. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  331. /** Initializes the CPU, AHB and APB busses clocks
  332. */
  333. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  334. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  335. RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  336. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  337. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  338. {
  339. Error_Handler();
  340. }
  341. /** Initializes the CPU, AHB and APB busses clocks
  342. */
  343. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  344. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  345. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  346. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  347. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  348. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  349.  
  350. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  351. {
  352. Error_Handler();
  353. }
  354. }
  355.  
  356. /**
  357. * @brief TIM6 Initialization Function
  358. * @param None
  359. * @retval None
  360. */
  361. static void MX_TIM6_Init(void)
  362. {
  363.  
  364. /* USER CODE BEGIN TIM6_Init 0 */
  365.  
  366. /* USER CODE END TIM6_Init 0 */
  367.  
  368. TIM_MasterConfigTypeDef sMasterConfig = {0};
  369.  
  370. /* USER CODE BEGIN TIM6_Init 1 */
  371.  
  372. /* USER CODE END TIM6_Init 1 */
  373. htim6.Instance = TIM6;
  374. htim6.Init.Prescaler = 0;
  375. htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  376. htim6.Init.Period = 0;
  377. htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  378. if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  379. {
  380. Error_Handler();
  381. }
  382. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  383. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  384. if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  385. {
  386. Error_Handler();
  387. }
  388. /* USER CODE BEGIN TIM6_Init 2 */
  389.  
  390. /* USER CODE END TIM6_Init 2 */
  391.  
  392. }
  393.  
  394. /**
  395. * @brief USART6 Initialization Function
  396. * @param None
  397. * @retval None
  398. */
  399. static void MX_USART6_UART_Init(void)
  400. {
  401.  
  402. /* USER CODE BEGIN USART6_Init 0 */
  403.  
  404. /* USER CODE END USART6_Init 0 */
  405.  
  406. /* USER CODE BEGIN USART6_Init 1 */
  407.  
  408. /* USER CODE END USART6_Init 1 */
  409. huart6.Instance = USART6;
  410. huart6.Init.BaudRate = 115200;
  411. huart6.Init.WordLength = UART_WORDLENGTH_8B;
  412. huart6.Init.StopBits = UART_STOPBITS_1;
  413. huart6.Init.Parity = UART_PARITY_NONE;
  414. huart6.Init.Mode = UART_MODE_TX_RX;
  415. huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  416. huart6.Init.OverSampling = UART_OVERSAMPLING_16;
  417. if (HAL_UART_Init(&huart6) != HAL_OK)
  418. {
  419. Error_Handler();
  420. }
  421. /* USER CODE BEGIN USART6_Init 2 */
  422.  
  423. /* USER CODE END USART6_Init 2 */
  424.  
  425. }
  426.  
  427. /**
  428. * @brief GPIO Initialization Function
  429. * @param None
  430. * @retval None
  431. */
  432. static void MX_GPIO_Init(void)
  433. {
  434. GPIO_InitTypeDef GPIO_InitStruct = {0};
  435.  
  436. /* GPIO Ports Clock Enable */
  437. __HAL_RCC_GPIOC_CLK_ENABLE();
  438. __HAL_RCC_GPIOH_CLK_ENABLE();
  439. __HAL_RCC_GPIOD_CLK_ENABLE();
  440. __HAL_RCC_GPIOA_CLK_ENABLE();
  441. __HAL_RCC_GPIOB_CLK_ENABLE();
  442.  
  443. /*Configure GPIO pin Output Level */
  444. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);
  445.  
  446. /*Configure GPIO pin : PC15 */
  447. GPIO_InitStruct.Pin = GPIO_PIN_15;
  448. GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  449. GPIO_InitStruct.Pull = GPIO_NOPULL;
  450. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  451.  
  452. /*Configure GPIO pins : PD13 PD14 PD15 */
  453. GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  454. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  455. GPIO_InitStruct.Pull = GPIO_NOPULL;
  456. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  457. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  458.  
  459. }
  460.  
  461. /* USER CODE BEGIN 4 */
  462.  
  463. /* USER CODE END 4 */
  464.  
  465. /**
  466. * @brief This function is executed in case of error occurrence.
  467. * @retval None
  468. */
  469. void Error_Handler(void)
  470. {
  471. /* USER CODE BEGIN Error_Handler_Debug */
  472. /* User can add his own implementation to report the HAL error return state */
  473.  
  474. /* USER CODE END Error_Handler_Debug */
  475. }
  476.  
  477. #ifdef USE_FULL_ASSERT
  478. /**
  479. * @brief Reports the name of the source file and the source line number
  480. * where the assert_param error has occurred.
  481. * @param file: pointer to the source file name
  482. * @param line: assert_param error line source number
  483. * @retval None
  484. */
  485. void assert_failed(uint8_t *file, uint32_t line)
  486. {
  487. /* USER CODE BEGIN 6 */
  488. /* User can add his own implementation to report the file name and line number,
  489. tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  490. /* USER CODE END 6 */
  491. }
  492. #endif /* USE_FULL_ASSERT */
  493.  
  494. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement