Advertisement
Guest User

czujka

a guest
Feb 19th, 2020
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.25 KB | None | 0 0
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. ** This notice applies to any and all portions of this file
  8. * that are not between comment pairs USER CODE BEGIN and
  9. * USER CODE END. Other portions of this file, whether
  10. * inserted by the user or by software development tools
  11. * are owned by their respective copyright owners.
  12. *
  13. * COPYRIGHT(c) 2020 STMicroelectronics
  14. *
  15. * Redistribution and use in source and binary forms, with or without modification,
  16. * are permitted provided that the following conditions are met:
  17. * 1. Redistributions of source code must retain the above copyright notice,
  18. * this list of conditions and the following disclaimer.
  19. * 2. Redistributions in binary form must reproduce the above copyright notice,
  20. * this list of conditions and the following disclaimer in the documentation
  21. * and/or other materials provided with the distribution.
  22. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  23. * may be used to endorse or promote products derived from this software
  24. * without specific prior written permission.
  25. *
  26. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  27. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  28. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  29. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  30. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  31. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  32. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  33. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  34. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  35. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  36. *
  37. ******************************************************************************
  38. */
  39. /* USER CODE END Header */
  40.  
  41. /* Includes ------------------------------------------------------------------*/
  42. #include "main.h"
  43.  
  44. /* Private includes ----------------------------------------------------------*/
  45. /* USER CODE BEGIN Includes */
  46. #include "string.h"
  47. #include "stdarg.h"
  48.  
  49. #define FRAME_STARTSTOP 0x30 //znak początku i końca ramki "zero" 0
  50. #define UNIK_PZU 0x2D //myślnik, Pierwszy Znak Ucieczki "minus" -
  51. #define UNIK_DZU 0x2E //kropka, Drugi Znak Ucieczki "kropka" .
  52. #define UNIKANIE_UNIKU 0x2F //aby móc wpisac w ramce myślnik /. to - "slash" /
  53. #define CONTINUUE 10
  54. #define UNIK1 20
  55. #define UNIK2 30
  56. #define INFORMATION_MESSAGE 40
  57. #define FRAME_RECEIVED 50
  58. #define BUFF_SIZE 256 //zdefiniowanie rozmiaru bufora
  59. #define COMMAND_SIZE 128 //zdefiniowanie rozmiaru komendy
  60.  
  61. /* USER CODE END Includes */
  62.  
  63. /* Private typedef -----------------------------------------------------------*/
  64. /* USER CODE BEGIN PTD */
  65. uint8_t frame_state = CONTINUUE;
  66. int idx;
  67.  
  68. char Buff_Rx[BUFF_SIZE]; //zdefiniowanie rozmiaru bufora odbiorczego (256)
  69. char Buff_Tx[BUFF_SIZE]; //zdefiniowanie rozmiaru bufora nadawczego (256)
  70.  
  71. volatile uint8_t Busy_Tx = 0;//deklaracja wskaźnika na bufory 0 (zmienna ulotna)
  72. volatile uint8_t Empty_Tx = 0; //deklaracja wskaźnika na bufory 0
  73. volatile uint8_t Busy_Rx = 0; //deklaracja wskaźnika na bufory 0
  74. volatile uint8_t Empty_Rx = 0; //deklaracja wskaźnika na bufory 0
  75.  
  76. uint8_t pir_state = 0; //zdefiniowanie stanu czujki na 0
  77. uint8_t previous_pir_state = 0; //zdefiniowanie poprzedniego stanu czujki na 0
  78. uint8_t alarm_armed = 0; //zdefiniowanie uzbrojenia alarmu na 0
  79. uint8_t ap, p; //zdefiniowanie zmiennych potrzebnych do alarmu
  80. uint8_t bajty_idle = 0; //zdefiniowanie bufora ramki na 0
  81. char frame[128]; //zdefiniowanie rozmiaru ramki
  82. char command[COMMAND_SIZE]; //zdefiniowanie rozmiaru komendy command=128
  83.  
  84. /* USER CODE END PTD */
  85.  
  86. /* Private define ------------------------------------------------------------*/
  87. /* USER CODE BEGIN PD */
  88.  
  89. /* USER CODE END PD */
  90.  
  91. /* Private macro -------------------------------------------------------------*/
  92. /* USER CODE BEGIN PM */
  93.  
  94. /* USER CODE END PM */
  95.  
  96. /* Private variables ---------------------------------------------------------*/
  97. TIM_HandleTypeDef htim4;
  98.  
  99. UART_HandleTypeDef huart2;
  100.  
  101. /* USER CODE BEGIN PV */
  102.  
  103. /* USER CODE END PV */
  104.  
  105. /* Private function prototypes -----------------------------------------------*/
  106. void SystemClock_Config(void);
  107. static void MX_GPIO_Init(void);
  108. static void MX_USART2_UART_Init(void);
  109. static void MX_TIM4_Init(void);
  110. /* USER CODE BEGIN PFP */
  111.  
  112. /* USER CODE END PFP */
  113.  
  114. /* Private user code ---------------------------------------------------------*/
  115. /* USER CODE BEGIN 0 */
  116. void USART_fsend(char* format, ...) {
  117.  
  118. char tmp_rs[128]; //zmiena tymczasowa tmp_rs
  119. int i;
  120. __IO int idx; // __IO to zmienna typu volatile, indeks naszej tablicy
  121. va_list valist; //tworzymy liste ze zmienna iloscia argumentu
  122. va_start(valist, format);//inicjalizuje valist, aby pobrac dodatkowe argumenty po parametrze
  123. vsprintf(tmp_rs, format, valist); //do zmiennej tmp_rs jest zapisywany sformatowany juz ciag znaków
  124. va_end(valist); //zakonczenie listy ze zmienna iloscia argumentow
  125. idx = Empty_Tx; //naszemu indeksowi przypisujemy wskaznik na puste miejsce w buforze nadawczym
  126. for (i = 0; i < strlen(tmp_rs); i++) { //wypelniamy bufor nadawczy znakami
  127. Buff_Tx[idx] = tmp_rs[i];
  128. idx++;
  129. if (idx >= BUFF_SIZE)//jezeli przekroczymy rozmiar bufora, to zerujemy index
  130. idx = 0;
  131. }
  132. __disable_irq(); //wylaczamy przerwania
  133.  
  134. if ((Empty_Tx == Busy_Tx)
  135. && (__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TXE) == SET))
  136. //jezeli wskazniki na puste i zajete miejsce w buforze sa takie same oraz UART nic nie nadaje oraz UART nic nie nadaje
  137. { //to rozpoczynamy wysylanie
  138. Empty_Tx = idx; //przypisujemy wskazniki pustego miejsca nasz indeks
  139. uint8_t tmp = Buff_Tx[Busy_Tx]; //zmiennej tymczasowej przypisujemy element z bufora nadawczego
  140. Busy_Tx++; //zwiekszamy wskaznik miejsca zajetego w buforze
  141. if (Busy_Tx >= BUFF_SIZE)//jezeli przekroczymy zakres bufora to... zerujemy wskaznik
  142. Busy_Tx = 0;
  143. HAL_UART_Transmit_IT(&huart2, &tmp, 1); //transmitujemy pierwszy bajt danych
  144. //po przeslaniu tego bajtu zostanie wywolaane przerwanie z callbacku
  145. } else {
  146. Empty_Tx = idx; //wskaznikowi pustego miejsca przypisujemy nasz indeks
  147. }
  148. __enable_irq(); //wlaczamy przerwania
  149. }
  150.  
  151. char getchar_BuffRx() //pobierz znak z bufora
  152. {
  153. char tmp;
  154. if (Busy_Rx != Empty_Rx)//jeżeli miejsce zajęte bufora odczytu jest różne od pustego miejsca buforu odczytu
  155. {
  156. tmp = Buff_Rx[Busy_Rx]; //pod tymczasową zmiennę, do bufora odczytu wpisz zajęte miejsce bufora odczytu
  157. Busy_Rx++; //zwiększ wskaźnik
  158. if (Busy_Rx > BUFF_SIZE)
  159. Busy_Rx = 0;//jeżeli zajęte miejsce jest większe niż rozmiar bufora, to przejdź do elementu "0" w tym buforze (zatocz koło)
  160. return tmp;
  161. }
  162. return -1;
  163. }
  164.  
  165. void DoCommand(char *comm) //funkcja, która wykonuje polecenie z ramki
  166. {
  167. if (strncmp(comm, "alarm", 5) == 0) {
  168. ap = sscanf(comm, "alarm:%d", &p);//wyszukaj po usarcie kombinacji alarm: tj. 0alarm:costam0
  169. if (ap == 1) //jeżeli wpisano kombinację alarm:
  170. {
  171. alarm_armed = p; //uzbrajamy alarm
  172. USART_fsend("OK, działamy! \n\r");//wysyłamy komunikat, że alarm został uzbrojony
  173. } else {
  174. USART_fsend("Brak wszystkich potrzebnych parametrów! :-( \n\r"); //alarm nie został uzbrojony
  175. }
  176. }
  177. }
  178.  
  179. void clear_data() {
  180. for (int i = 0; i < COMMAND_SIZE; i++)
  181. command[i] = 0;
  182. idx = 0;
  183. }
  184.  
  185. void framee() {
  186. if (Busy_Rx != Empty_Rx) {//jeżeli miejsce zajęte odczytu jest różne od pustego
  187. char a = getchar_BuffRx(); //ZNAK Z BUFORA
  188. __HAL_TIM_SET_COUNTER(&htim4, 0); //nasłuch na linii dzięki Timer 4.
  189. switch (frame_state) //ODCZYT DANYCH
  190. {
  191. case CONTINUUE: {
  192. if (a == FRAME_STARTSTOP) { //a jest znakiem początka ramki - "zero" 0
  193. clear_data(); //wyczyśc dane
  194. frame_state = INFORMATION_MESSAGE;//stan ramki na tryb przesył wiadomości (opcja jednego z case)
  195. }
  196. break;
  197. }
  198. //0 5A 0
  199. case INFORMATION_MESSAGE: {
  200. if (a == FRAME_STARTSTOP) { //znak przesłany z bufora odbiorczego to znak początku i końca ramki
  201.  
  202. if(idx>0)
  203. {
  204. DoCommand(command); //command wykonuje polecenie z ramki
  205. clear_data(); //wyczysc dane
  206. frame_state = INFORMATION_MESSAGE;///stan ramki na tryb przesył wiadomości (opcja jednego z case)
  207. }
  208. else
  209. {
  210. clear_data(); //wyczysc dane
  211. frame_state = INFORMATION_MESSAGE;///stan ramki na tryb przesył wiadomości (opcja jednego z case)
  212. }
  213.  
  214. }
  215. else if (a == UNIK_PZU)//jeżeli znak to pierwszy znak uniku to...
  216. {
  217. frame_state = UNIK2;
  218. } //status ramki będzie interpretowany w case UNIK2 który jest niżej żeby sprawdzic czy bedzie drugi znak uniku
  219. //zwiększenie wskaźnika //zawiesi sie
  220. else
  221. {
  222. command[idx] = a;
  223. if(idx>128)
  224. {
  225. frame_state = CONTINUUE;
  226. break;
  227. }
  228. else
  229. {
  230. idx++;
  231. }
  232. frame_state = INFORMATION_MESSAGE;
  233. break;
  234. }
  235. }
  236. break;
  237. }
  238. //jakby co to ciebie nie slysze, masz wyciszony mikrofon
  239. //dobra mam na drugim monitorze fb hehe
  240. case UNIK2:
  241. {
  242. if (a == UNIK_DZU) { //jeżeli odebrany znak to drugi znak uniku
  243. command[idx] = FRAME_STARTSTOP; //to nasza ramka się nie wysypie i mmożemy korzystac w środku treści ramki z "zera"
  244. ///////
  245. if (idx > 128) {
  246. frame_state = CONTINUUE;
  247. break;
  248. }
  249. else
  250. {
  251. idx++;
  252. }
  253. break;
  254. }
  255. else if (a == UNIKANIE_UNIKU)
  256. { //aby moc w ramce wpisac "myślnik" -
  257. command[idx] = UNIK_PZU;//slash z myślnikiem jest po to, aby moc wpisac do ramki myślnik
  258. if (idx > 128) {
  259. frame_state = CONTINUUE;
  260. break;
  261. } else {
  262. idx++;
  263. }
  264.  
  265. }
  266. else if(a == FRAME_STARTSTOP)
  267. {
  268. frame_state = INFORMATION_MESSAGE;
  269. clear_data();
  270. break;
  271. }
  272. else {
  273. frame_state = CONTINUUE;
  274. clear_data();
  275. break;
  276. }
  277.  
  278. frame_state = INFORMATION_MESSAGE; //znak jest znakiem ramki
  279. break;
  280. }
  281. }
  282. }
  283. }
  284. uint8_t pir_move() { //ustawienie PINu dla czujki ruchu
  285. if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_SET)
  286. return 1;
  287. else
  288. return 0;
  289. }
  290.  
  291. uint8_t pir_move_detected() {
  292. previous_pir_state = pir_state; //na początku oba są zerami (zadeklarowane w #include)
  293. pir_state = pir_move(); //stan ruchu pobierz z funkcji pirmove
  294. if (previous_pir_state == 0 && pir_state == 1) //jeżeli wykryto ruch (stan wysoki w obecnym pir_state)
  295. return 1;
  296. else
  297. return 0;
  298. }
  299. /* USER CODE END 0 */
  300.  
  301. /**
  302. * @brief The application entry point.
  303. * @retval int
  304. */
  305. int main(void) {
  306. /* USER CODE BEGIN 1 */
  307.  
  308. /* USER CODE END 1 */
  309.  
  310. /* MCU Configuration--------------------------------------------------------*/
  311.  
  312. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  313. HAL_Init();
  314.  
  315. /* USER CODE BEGIN Init */
  316.  
  317. /* USER CODE END Init */
  318.  
  319. /* Configure the system clock */
  320. SystemClock_Config();
  321.  
  322. /* USER CODE BEGIN SysInit */
  323.  
  324. /* USER CODE END SysInit */
  325.  
  326. /* Initialize all configured peripherals */
  327. MX_GPIO_Init();
  328. MX_USART2_UART_Init();
  329. MX_TIM4_Init();
  330. /* USER CODE BEGIN 2 */
  331. HAL_UART_Receive_IT(&huart2, (uint8_t *) &Buff_Rx[Empty_Rx], 1);
  332. USART_fsend("Halo to ja, Twój STM32! :-)\n\r"); //komunikat powitalny po USARTcie
  333. /* USER CODE END 2 */
  334.  
  335. /* Infinite loop */
  336. /* USER CODE BEGIN WHILE */
  337. while (1) {
  338. /* USER CODE END WHILE */
  339. framee(); //funkcja z ramką
  340. if (pir_move_detected()) //jeżeli wykryto ruch (który sprawdza funkcja pir_move_detected)
  341. {
  342. if (alarm_armed) //jeżeli alarm jest uzbrojony
  343. {
  344. USART_fsend("I see you, sioooooooo :-) \n\r"); //wypisz po USART
  345. }
  346. }
  347. /* USER CODE BEGIN 3 */
  348. }
  349. /* USER CODE END 3 */
  350. }
  351.  
  352. /**
  353. * @brief System Clock Configuration
  354. * @retval None
  355. */
  356. void SystemClock_Config(void) {
  357. RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };
  358. RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };
  359. RCC_PeriphCLKInitTypeDef PeriphClkInit = { 0 };
  360.  
  361. /**Initializes the CPU, AHB and APB busses clocks
  362. */
  363. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  364. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  365. RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  366. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  367. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  368. RCC_OscInitStruct.PLL.PLLM = 1;
  369. RCC_OscInitStruct.PLL.PLLN = 10;
  370. RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
  371. RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  372. RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  373. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
  374. Error_Handler();
  375. }
  376. /**Initializes the CPU, AHB and APB busses clocks
  377. */
  378. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
  379. | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  380. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  381. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  382. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  383. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  384.  
  385. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) {
  386. Error_Handler();
  387. }
  388. PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
  389. PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
  390. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
  391. Error_Handler();
  392. }
  393. /**Configure the main internal regulator output voltage
  394. */
  395. if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) {
  396. Error_Handler();
  397. }
  398. }
  399.  
  400. /**
  401. * @brief TIM4 Initialization Function
  402. * @param None
  403. * @retval None
  404. */
  405. static void MX_TIM4_Init(void) {
  406.  
  407. /* USER CODE BEGIN TIM4_Init 0 */
  408.  
  409. /* USER CODE END TIM4_Init 0 */
  410.  
  411. TIM_ClockConfigTypeDef sClockSourceConfig = { 0 };
  412. TIM_MasterConfigTypeDef sMasterConfig = { 0 };
  413.  
  414. /* USER CODE BEGIN TIM4_Init 1 */
  415.  
  416. /* USER CODE END TIM4_Init 1 */
  417. htim4.Instance = TIM4;
  418. htim4.Init.Prescaler = 31;
  419. htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  420. htim4.Init.Period = 103;
  421. htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  422. htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  423. if (HAL_TIM_Base_Init(&htim4) != HAL_OK) {
  424. Error_Handler();
  425. }
  426. sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  427. if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) {
  428. Error_Handler();
  429. }
  430. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  431. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  432. if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) {
  433. Error_Handler();
  434. }
  435. /* USER CODE BEGIN TIM4_Init 2 */
  436.  
  437. /* USER CODE END TIM4_Init 2 */
  438.  
  439. }
  440.  
  441. /**
  442. * @brief USART2 Initialization Function
  443. * @param None
  444. * @retval None
  445. */
  446. static void MX_USART2_UART_Init(void) {
  447.  
  448. /* USER CODE BEGIN USART2_Init 0 */
  449.  
  450. /* USER CODE END USART2_Init 0 */
  451.  
  452. /* USER CODE BEGIN USART2_Init 1 */
  453.  
  454. /* USER CODE END USART2_Init 1 */
  455. huart2.Instance = USART2;
  456. huart2.Init.BaudRate = 9600;
  457. huart2.Init.WordLength = UART_WORDLENGTH_8B;
  458. huart2.Init.StopBits = UART_STOPBITS_1;
  459. huart2.Init.Parity = UART_PARITY_NONE;
  460. huart2.Init.Mode = UART_MODE_TX_RX;
  461. huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  462. huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  463. huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  464. huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  465. if (HAL_UART_Init(&huart2) != HAL_OK) {
  466. Error_Handler();
  467. }
  468. /* USER CODE BEGIN USART2_Init 2 */
  469.  
  470. /* USER CODE END USART2_Init 2 */
  471.  
  472. }
  473.  
  474. /**
  475. * @brief GPIO Initialization Function
  476. * @param None
  477. * @retval None
  478. */
  479. static void MX_GPIO_Init(void) {
  480. GPIO_InitTypeDef GPIO_InitStruct = { 0 };
  481.  
  482. /* GPIO Ports Clock Enable */
  483. __HAL_RCC_GPIOC_CLK_ENABLE()
  484. ;
  485. __HAL_RCC_GPIOH_CLK_ENABLE()
  486. ;
  487. __HAL_RCC_GPIOA_CLK_ENABLE()
  488. ;
  489. __HAL_RCC_GPIOB_CLK_ENABLE()
  490. ;
  491.  
  492. /*Configure GPIO pin : B1_Pin */
  493. GPIO_InitStruct.Pin = B1_Pin;
  494. GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  495. GPIO_InitStruct.Pull = GPIO_NOPULL;
  496. HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
  497.  
  498. /*Configure GPIO pin : PA5 */
  499. GPIO_InitStruct.Pin = GPIO_PIN_5;
  500. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  501. GPIO_InitStruct.Pull = GPIO_NOPULL;
  502. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  503.  
  504. }
  505.  
  506. /* USER CODE BEGIN 4 */
  507. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
  508. if (huart == &huart2) //sprawdzenie, czy funkcja była wywołana przez interfejs USART2
  509. {
  510. Empty_Rx++; //zwiększenie wskaźnika na miejsce puste w buforze
  511. if (Empty_Rx >= BUFF_SIZE) //jeżeli wskaźnik przekroczył rozmiar bufora
  512. Empty_Rx = 0; //wróc do początku (zatocz koło)
  513. HAL_UART_Receive_IT(&huart2, (uint8_t *) &Buff_Rx[Empty_Rx], 1);
  514. } //oczekuj na odbiór jednego kolejnego znaku na przerwaniu z interfejsu USART2
  515. } //do pustego miejsca w buforze odbiorczym
  516.  
  517. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
  518. if (huart == &huart2) //sprawdzenie, czy funkcja była wywołana przez interfejs USART2
  519. {
  520. if (Empty_Tx != Busy_Tx) {//jeżeli wskaźnik miejsca zajętego i miejsca pustego w buforze nadawczym się różnią (bufor nie jest pusty)
  521. uint8_t tmp = Buff_Tx[Busy_Tx]; //przypisanie do tymczasowej zmiennej tmp znaku znajdującego się w ostatnim zajętym miejscuw buforze nadawczym
  522. Busy_Tx++; //zwiększenie wskaźnika na zajęte miejsce w buforze nadawczym
  523. if (Busy_Tx >= BUFF_SIZE) //jeżeli wskaźnik przekroczył rozmiar bufora, wróc do początku (zatocz koło)
  524. Busy_Tx = 0;
  525. HAL_UART_Transmit_IT(&huart2, &tmp, 1); //prześlij na przerwaniu jeden znak znajdujący się w zmiennej tmp (traktuj tą zmienną jak jednoelementowy bufor)
  526. }
  527. }
  528. }
  529. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
  530. if (htim == &htim4) {
  531. if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE)
  532. == SET&& frame_state == INFORMATION_MESSAGE) //
  533. {
  534. bajty_idle++;
  535. if (bajty_idle >= 3) //jeśli nic nie jest nadawane na linii przez 3 sekundy, to czyścimy bufor ramki do czasu wystąpienia ciszy (nie bufor odbiorczy)
  536. { //o ile nie nie nastąpił znak końca ramki.
  537. bajty_idle = 0;
  538. frame_state = CONTINUUE;
  539. }
  540. }
  541. }
  542.  
  543. }
  544. /* USER CODE END 4 */
  545.  
  546. /**
  547. * @brief This function is executed in case of error occurrence.
  548. * @retval None
  549. */
  550. void Error_Handler(void) {
  551. /* USER CODE BEGIN Error_Handler_Debug */
  552. /* User can add his own implementation to report the HAL error return state */
  553.  
  554. /* USER CODE END Error_Handler_Debug */
  555. }
  556.  
  557. #ifdef USE_FULL_ASSERT
  558. /**
  559. * @brief Reports the name of the source file and the source line number
  560. * where the assert_param error has occurred.
  561. * @param file: pointer to the source file name
  562. * @param line: assert_param error line source number
  563. * @retval None
  564. */
  565. void assert_failed(char *file, uint32_t line)
  566. {
  567. /* USER CODE BEGIN 6 */
  568. /* User can add his own implementation to report the file name and line number,
  569. tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  570. /* USER CODE END 6 */
  571. }
  572. #endif /* USE_FULL_ASSERT */
  573.  
  574. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement