R4FBL

Untitled

Feb 9th, 2021
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.32 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. #include "i2c.h"
  24. #include "tim.h"
  25. #include "gpio.h"
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28.  
  29. /* Private includes ----------------------------------------------------------*/
  30. /* USER CODE BEGIN Includes */
  31. #include "ST7920_SERIAL.h"
  32. #include "delay.h"
  33. #include "bitmap.h"
  34. uint8_t ds_buff[9];                  //сюда принимаем данные
  35. /* USER CODE END Includes */
  36.  
  37. /* Private typedef -----------------------------------------------------------*/
  38. /* USER CODE BEGIN PTD */
  39.  
  40. /* USER CODE END PTD */
  41.  
  42. /* Private define ------------------------------------------------------------*/
  43. /* USER CODE BEGIN PD */
  44.  
  45. /* USER CODE END PD */
  46.  
  47. /* Private macro -------------------------------------------------------------*/
  48. /* USER CODE BEGIN PM */
  49.  
  50. /* USER CODE END PM */
  51.  
  52. /* Private variables ---------------------------------------------------------*/
  53.  
  54. /* USER CODE BEGIN PV */
  55. #define PORT  GPIOA   //указать порт, к которому подключены датчики
  56. #define PIN 10
  57. #define TIMER TIM3    //задаем таймер, используемый для формирования задержек
  58. #define SKIP_ROM_ADR 0xCC // пропуск адресации
  59. #define CONVERT_TEMP 0x44 // запускает преобразование температуры
  60. #define READ_DATA_COMAND 0xBE //команда чтения содержимого памяти
  61.  
  62.  int temp;
  63.  int radix=10;
  64.  char znak =  '-' ;
  65.  
  66. /* USER CODE END PV */
  67.  
  68. /* Private function prototypes -----------------------------------------------*/
  69. void SystemClock_Config(void);
  70. void MX_GPIO_Init(void);
  71. void MX_TIM1_Init(void);
  72. void MX_TIM3_Init(void);
  73. /* USER CODE BEGIN PFP */
  74.  
  75. /* USER CODE END PFP */
  76.  
  77. /* Private user code ---------------------------------------------------------*/
  78. /* USER CODE BEGIN 0 */
  79. //*********************************************************************************************
  80. //function  импульс сброса                                                                   //
  81. //argument  маска порта                                                                      //
  82. //return    0 - устройство обнаружен, 1 - не обнаружено, 2 - к.з. на линии                   //
  83. //*********************************************************************************************
  84. uint8_t ds_reset_pulse(uint16_t PinMask)
  85. {
  86.    uint16_t result;
  87.  
  88.    if((PORT->IDR & PinMask)==0)  return 2;         //проверить линию на отсутствие замыкания
  89.    PORT->ODR &= ~PinMask;                          //потянуть шину к земле
  90.    TIMER->CNT=0;
  91.    while(TIMER->CNT<480){};                        //ждать 480 микросекунд
  92.    PORT->ODR |=  PinMask;                          //отпустить шину
  93.    while(TIMER->CNT<550){};                        //ждать 70 микросекунд
  94.    result =  PORT->IDR & PinMask;                 //прочитать шину
  95.    while(TIMER->CNT<960){};                        //дождаться окончания инициализации
  96.    if(result) return 1;                            //датчик не обнаружен
  97.    return 0;                                       //датчик обнаружен
  98. }
  99.  
  100.  
  101. //*********************************************************************************************
  102. //function  передача бита                                                                    //
  103. //argument  значение передаваемого бита,маска порта                                          //
  104. //return    none                                                                             //
  105. //*********************************************************************************************
  106. void ds_write_bit(uint8_t bit,uint16_t PinMask)
  107. {
  108.    TIMER->CNT=0;
  109.    PORT->ODR &= ~PinMask;                          //потянуть шину к земле
  110.    while(TIMER->CNT<2){};                          //ждать 1 микросекунду
  111.    if(bit) PORT->ODR |=  PinMask;                  //если передаем 1, то отпускаем шину
  112.    while(TIMER->CNT<60){};                         //задержка 60 микросекунд
  113.    PORT->ODR |=  PinMask;                          //отпускаем шину
  114. }
  115.  
  116. //*********************************************************************************************
  117. //function  чтение бита                                                                      //
  118. //argument  маска порта                                                                      //
  119. //return    прочитанный бит                                                                  //
  120. //*********************************************************************************************
  121. uint16_t ds_read_bit(uint16_t PinMask)
  122. {
  123.    uint16_t result;
  124.  
  125.   TIMER->CNT=0;
  126.    PORT->ODR &= ~PinMask;                          //потянуть шину к земле
  127.    while(TIMER->CNT<2){};
  128.    PORT->ODR |=  PinMask;                          //отпускаем шину
  129.    while(TIMER->CNT<15){};                         //задержка 15 микросекунд
  130.    result     =  PORT->IDR & PinMask;              //прочитать шину
  131.    while(TIMER->CNT<60){};                         //оставшееся время
  132.    return result;                                  //возвратить результат
  133. }
  134. //*********************************************************************************************
  135. //function  запись байта                                                                     //
  136. //argument  передаваемый байт,маска порта                                                    //
  137. //return    none                                                                             //
  138. //*********************************************************************************************
  139. void ds_write_byte(uint8_t byte, uint16_t PinMask)
  140. {
  141.    uint8_t i;
  142.    for(i=0;i<8;i++) ds_write_bit(byte&(1<<i), PinMask);
  143. }
  144. //*********************************************************************************************
  145. //function  чтение байта                                                                     //
  146. //argument  маска порта                                                                      //
  147. //return    прочитанный байт                                                                 //
  148. //*********************************************************************************************
  149. uint8_t ds_read_byte(uint16_t PinMask)
  150. {
  151.    uint8_t i,result = 0;
  152.    for(i=0;i<8;i++)
  153.    if(ds_read_bit(PinMask)) result |= 1<<i;
  154.    return result;
  155. }
  156.  
  157. /* USER CODE END 0 */
  158.  
  159. /**
  160.   * @brief  The application entry point.
  161.   * @retval int
  162.   */
  163. int main(void)
  164. {
  165.   /* USER CODE BEGIN 1 */
  166.  
  167.   /* USER CODE END 1 */
  168.  
  169.   /* MCU Configuration--------------------------------------------------------*/
  170.  
  171.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  172.   HAL_Init();
  173.  
  174.  
  175.   /* USER CODE BEGIN Init */
  176.  
  177.   /* USER CODE END Init */
  178.  
  179.   /* Configure the system clock */
  180.   SystemClock_Config();
  181.  
  182.   /* USER CODE BEGIN SysInit */
  183.  
  184.   /* USER CODE END SysInit */
  185.  
  186.   /* Initialize all configured peripherals */
  187.   MX_GPIO_Init();
  188.   MX_TIM1_Init();
  189.   MX_I2C1_Init();
  190.   MX_TIM3_Init();
  191.   /* USER CODE BEGIN 2 */
  192.  
  193.   delay_init();
  194.   ST7920_Init();
  195.   HAL_TIM_Base_Start(&htim3);
  196.  
  197.   /* USER CODE END 2 */
  198.  
  199.   /* Infinite loop */
  200.   /* USER CODE BEGIN WHILE */
  201.   while (1)
  202.   {
  203.  
  204.        ////////////////////////////////////////////////////////////////////////
  205.       /////////////////////////////////////////////////////////////////////////
  206.  
  207.       ds_reset_pulse(1<<PIN);          //послать импульс сброса                                       /
  208.       ds_write_byte(SKIP_ROM_ADR,1<<PIN);//разрешить доступ к датчику не используя адрес
  209.       ds_write_byte(CONVERT_TEMP,1<<PIN);      //запустить преобразование
  210.       HAL_Delay (1000);               //дать время для измерения
  211.       ds_reset_pulse(1<<PIN);          //послать импульс сброса
  212.       ds_write_byte(SKIP_ROM_ADR,1<<PIN);//разрешить доступ к датчику не используя адрес
  213.       ds_write_byte(READ_DATA_COMAND,1<<PIN);      //команда, заставляющая датчик выдать 9 байт своей памяти
  214.       for(int i=0; i<9; i++ )           //прочитать 9 байт в массив
  215.       ds_buff[i] = ds_read_byte(1<<PIN);
  216.       //////////////////////////////////////////////////////////////////////////
  217.       //////////////////////////////////////////////////////////////////////////
  218.  
  219.       //  ds_buff[1]=255;//255 проверка отрицательных температур
  220.       //    ds_buff[0]=94;//94//248
  221.  
  222.       //        temp = ds_buff[1];
  223.       //        temp = temp<<8;
  224.       //        temp |= ds_buff[0];
  225.       //        //переводим в градусы
  226.       //        temp *= 0.0625;//0.0625 градуса на единицу данных
  227.       //        if(temp > 1000)//если температура <0    1111 1111 1111 1000 = 65528
  228.       //    {
  229.       //        temp = 4096 - temp;
  230.       //      znak =  '-';
  231.       //    }else znak =  '+';
  232.  
  233.             temp = ds_buff[1];
  234.             temp = temp<<8;
  235.             temp |= ds_buff[0];
  236.             temp =temp>>4;//отбрасываем дробную чаcть
  237.  
  238.  
  239.             if(temp > 1000){//если температура <0
  240.             temp = 4096 - temp;
  241.             znak = '-';
  242.             char buffer[16];
  243.             snprintf(buffer,16,"Temperature %d\n",temp);
  244.             //snprintf(buffer,sizeof(buffer),"temp: %d",temp);
  245.             ST7920_SendString(2,0,buffer);
  246.             HAL_Delay(1000);
  247.         }
  248.             else {
  249.                 char buffer[20];
  250.                 snprintf(buffer,16,"Temperature %d\n",temp);
  251.                 ST7920_SendString(1,0,buffer);
  252.                 znak =  '+';
  253.                 HAL_Delay(1000);
  254.                 }
  255.  
  256.  
  257.  
  258.  
  259.       /////////////////////////////////////////////////////////////////////////
  260.       /////////////////////////////////////////////////////////////////////////
  261.     /* USER CODE END WHILE */
  262.  
  263.     /* USER CODE BEGIN 3 */
  264.   }
  265.   /* USER CODE END 3 */
  266. }
  267.  
  268. /**
  269.   * @brief System Clock Configuration
  270.   * @retval None
  271.   */
  272. void SystemClock_Config(void)
  273. {
  274.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  275.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  276.  
  277.   /** Initializes the CPU, AHB and APB busses clocks
  278.   */
  279.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  280.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  281.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  282.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  283.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  284.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  285.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  286.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  287.   {
  288.     Error_Handler();
  289.   }
  290.   /** Initializes the CPU, AHB and APB busses clocks
  291.   */
  292.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  293.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  294.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  295.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  296.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  297.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  298.  
  299.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  300.   {
  301.     Error_Handler();
  302.   }
  303. }
  304.  
  305. /* USER CODE BEGIN 4 */
  306.  
  307. /* USER CODE END 4 */
  308.  
  309. /**
  310.   * @brief  This function is executed in case of error occurrence.
  311.   * @retval None
  312.   */
  313. void Error_Handler(void)
  314. {
  315.   /* USER CODE BEGIN Error_Handler_Debug */
  316.   /* User can add his own implementation to report the HAL error return state */
  317.  
  318.   /* USER CODE END Error_Handler_Debug */
  319. }
  320.  
  321. #ifdef  USE_FULL_ASSERT
  322. /**
  323.   * @brief  Reports the name of the source file and the source line number
  324.   *         where the assert_param error has occurred.
  325.   * @param  file: pointer to the source file name
  326.   * @param  line: assert_param error line source number
  327.   * @retval None
  328.   */
  329. void assert_failed(uint8_t *file, uint32_t line)
  330. {
  331.   /* USER CODE BEGIN 6 */
  332.   /* User can add his own implementation to report the file name and line number,
  333.      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  334.   /* USER CODE END 6 */
  335. }
  336. #endif /* USE_FULL_ASSERT */
  337.  
  338. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  339.  
Advertisement
Add Comment
Please, Sign In to add comment