Nikon27

DS18b20

May 13th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.25 KB | None | 0 0
  1. /*
  2.  * This example demonstrates using timers to capture input
  3.  * signal
  4.  */
  5. #include <stdio.h>
  6. #include "stm32f0xx_ll_rcc.h"
  7. #include "stm32f0xx_ll_system.h"
  8. #include "stm32f0xx_ll_bus.h"
  9. #include "stm32f0xx_ll_gpio.h"
  10. #include "stm32f0xx_ll_tim.h"
  11.  
  12. //RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
  13.  
  14. #define PORT GPIOC
  15.  
  16. //RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
  17. //GPIOC->CRL &= ~GPIO_CRL_MODE7;
  18. /*GPIOC->CRL &= ~GPIO_CRL_CNF7;
  19. GPIOC->CRL |= GPIO_CRL_MODE7_1;
  20. GPIOC->CRL |= GPIO_CRL_CNF7_0;*/
  21. //GPIOC->ODR |= 1<<7;
  22. /**
  23.   * System Clock Configuration
  24.   * The system Clock is configured as follow :
  25.   *    System Clock source            = PLL (HSI/2)
  26.   *    SYSCLK(Hz)                     = 48000000
  27.   *    HCLK(Hz)                       = 48000000
  28.   *    AHB Prescaler                  = 1
  29.   *    APB1 Prescaler                 = 1
  30.   *    HSI Frequency(Hz)              = 8000000
  31.   *    PLLMUL                         = 12
  32.   *    Flash Latency(WS)              = 1
  33.   */
  34. static void rcc_config()
  35. {
  36.     /* Set FLASH latency */
  37.     LL_FLASH_SetLatency(LL_FLASH_LATENCY_1);
  38.  
  39.     /* Enable HSI and wait for activation*/
  40.     LL_RCC_HSI_Enable();
  41.     while (LL_RCC_HSI_IsReady() != 1);
  42.  
  43.     /* Main PLL configuration and activation */
  44.     LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI_DIV_2,
  45.                                 LL_RCC_PLL_MUL_12);
  46.  
  47.     LL_RCC_PLL_Enable();
  48.     while (LL_RCC_PLL_IsReady() != 1);
  49.  
  50.     /* Sysclk activation on the main PLL */
  51.     LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
  52.     LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
  53.     while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL);
  54.  
  55.     /* Set APB1 prescaler */
  56.     LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
  57.  
  58.     /* Update CMSIS variable (which can be updated also
  59.      * through SystemCoreClockUpdate function) */
  60.     SystemCoreClock = 48000000;
  61. }
  62.  
  63. /*
  64.  * Clock on GPIOC and set two led pins
  65.  */
  66. static void gpio_config(void)
  67. {
  68.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOC);
  69.     LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_8, LL_GPIO_MODE_OUTPUT);
  70.         LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_9, LL_GPIO_MODE_OUTPUT);
  71.     LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_12, LL_GPIO_MODE_OUTPUT);
  72.     LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_11, LL_GPIO_MODE_OUTPUT);
  73.     LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_7, LL_GPIO_MODE_INPUT);
  74.     //LL_GPIO_SetPinPull(GPIOB, LL_GPIO_PIN_7, LL_GPIO_PULL_UP);
  75.     return;
  76. }
  77.  
  78. static void timers_config(void)
  79. {
  80.     RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
  81.     RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
  82.     TIM2->PSC = 8000-1;
  83.     TIM2->CR1 = TIM_CR1_OPM;
  84.     TIM3->PSC = 8-1;
  85.     TIM3->ARR = 1000;
  86.     TIM3->CR1 = TIM_CR1_CEN;
  87. }
  88.  
  89. /*static void port_config(void)
  90. {
  91.     RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
  92.     GPIOB->CRH &= ~GPIO_CRH_MODE7;
  93.     GPIOB->CRH &= ~GPIO_CRL_CNF7;
  94.     GPIOB->CRH |= GPIO_CRL_MODE7_1;
  95.     GPIOB->CRH |= GPIO_CRL_CNF7_0;
  96.     GPIOB->ODR |= 1<<7;
  97. }*/
  98.  
  99. /*static void timers_config(void)
  100. {
  101.     LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);
  102.     LL_TIM_SetPrescaler(TIM3, 47999);
  103.     LL_TIM_SetAutoReload(TIM3, 999);
  104.     LL_TIM_SetCounterMode(TIM3, LL_TIM_COUNTERMODE_UP);
  105.     LL_TIM_EnableIT_UPDATE(TIM3);
  106.     LL_TIM_EnableCounter(TIM3);
  107.     NVIC_EnableIRQ(TIM3_IRQn);
  108.     NVIC_SetPriority(TIM3_IRQn, 0);
  109.     return;
  110. }*/
  111.  
  112. void TIM2_IRQHandler(void)
  113. {
  114.     LL_GPIO_TogglePin(GPIOC, LL_GPIO_PIN_8);
  115.     LL_TIM_ClearFlag_UPDATE(TIM3);
  116. }
  117.  
  118. uint8_t ds_reset_pulse(uint16_t PinMask)
  119. {
  120.     uint16_t result;
  121.     //if((GPIOC->IDR & PinMask)==0) return 2; //проверить линию на отсутствие замыкания
  122.     PORT->ODR &= ~PinMask; //потянуть шину к земле
  123.     TIM3->CNT=0;
  124.     while(TIM3->CNT<480){}; //ждать 480 микросекунд
  125.     PORT->ODR |= PinMask; //отпустить шину
  126.     while(TIM3->CNT<550){}; //ждать 70 микросекунд
  127.     result = PORT->IDR & PinMask; //прочитать шину
  128.     while(TIM3->CNT<960){}; //дождаться окончания инициализации
  129.     if(result) return 1; //датчик не обнаружен
  130.     return 0; //датчик обнаружен
  131. }
  132.  
  133. void ds_write_bit(uint8_t bit,uint16_t PinMask)
  134. {
  135.     TIM3->CNT=0;
  136.     PORT->ODR &= ~PinMask; //потянуть шину к земле
  137.     while(TIM3->CNT<2){}; //ждать 1 микросекунду
  138.     if(bit) PORT->ODR |= PinMask; //если передаем 1, то отпускаем шину
  139.     while(TIM3->CNT<60){}; //задержка 60 микросекунд
  140.     PORT->ODR |= PinMask; //отпускаем шину
  141. }
  142.  
  143. void ds_write_byte(uint8_t byte, uint16_t PinMask)
  144. {
  145.     uint8_t i;
  146.     for(i=0;i<8;i++) ds_write_bit(byte&(1<<i), PinMask);
  147. }
  148.  
  149. uint16_t ds_read_bit(uint16_t PinMask)
  150. {
  151.     uint16_t result;
  152.     TIM3->CNT=0;
  153.     PORT->ODR &= ~PinMask; //потянуть шину к земле
  154.     while(TIM3->CNT<2){};
  155.     PORT->ODR |= PinMask; //отпускаем шину
  156.     while(TIM3->CNT<15){}; //задержка 15 микросекунд
  157.     result = PORT->IDR & PinMask; //прочитать шину
  158.     while(TIM3->CNT<60){}; //оставшееся время
  159.     return result; //возвратить результат
  160. }
  161.  
  162. uint8_t ds_read_byte(uint16_t PinMask)
  163. {
  164.     uint8_t i,result = 0;
  165.     for(i=0;i<8;i++)
  166.     if(ds_read_bit(PinMask)) result |= 1<<i;
  167.     return result;
  168. }
  169.  
  170. uint8_t ds_start_convert_single(uint8_t PinNumb)
  171. {
  172.     uint8_t result;
  173.     result = ds_reset_pulse(1<<PinNumb); //послать импульс сброса
  174.     if(result) return result; //если ошибка - возвращаем ее код
  175.     ds_write_byte(0xCC,1<<PinNumb); //разрешить доступ к датчику не используя адрес
  176.     ds_write_byte(0x44,1<<PinNumb); //запустить преобразование
  177.     return 0;
  178. }
  179.  
  180. uint8_t ds_read_data_single(uint8_t *buff, uint8_t PinNumb)
  181. {
  182.     uint8_t result,i;
  183.     result = ds_reset_pulse(1<<PinNumb); //послать импульс сброса
  184.     if(result) return result; //если ошибка - возвращаем ее код
  185.     ds_write_byte(0xCC,1<<PinNumb); //разрешить доступ к датчику не используя адрес
  186.     ds_write_byte(0xBE,1<<PinNumb); //запрос 9 байт памяти
  187.     for( i=0; i<8; i++)
  188.     buff[i] = ds_read_byte(1<<PinNumb); //прочитать 9 байт
  189.     return 0;
  190. }
  191.  
  192. uint8_t ds_read_data_single2(uint8_t *buff, uint8_t PinNumb)
  193. {
  194.     uint8_t crc = 0;
  195.     uint8_t data;
  196.     uint8_t i,j;
  197.     uint8_t tmp;
  198.  
  199.     tmp = ds_reset_pulse(1<<PinNumb); //послать импульс сброса
  200.     if(tmp) return tmp; //если ошибка - возвращаем ее код
  201.     ds_write_byte(0xCC,1<<PinNumb); //разрешить доступ к датчику не используя адрес
  202.  
  203.     ds_write_byte(0xBE,1<<PinNumb); //запрос 9 байт памяти
  204.  
  205.     //прочитать 8 байт и вычислить CRC
  206.     for( i=0; i<8; i++)
  207.     {
  208.         data = ds_read_byte(1<<PinNumb); //прочитать очередной байт
  209.         buff[i] = data; //сохранить его в массиве
  210.  
  211.         //вычисление CRC - обрабатываем каждый бит принятого байта
  212.         for( j=0; j<8; j++)
  213.         {
  214.             tmp = (crc ^ data) & 0x01;
  215.             if (tmp==0x01) crc = crc ^ 0x18;
  216.             crc = (crc >> 1) & 0x7F;
  217.             if (tmp==0x01) crc = crc | 0x80;
  218.             data = data >> 1;
  219.         }
  220.     }
  221.  
  222.     data = ds_read_byte(1<<PinNumb); //прочитать CRC датчика
  223.     if(crc==data) return 0; //если CRC совпали - значит ошибки нет
  224.     return 3; //CRC не совпали, ошибка принятых данных
  225. }
  226.  
  227. signed int ds_read_temperature(uint8_t PinNumb)
  228. {
  229.     signed int integer = 0;
  230.     signed int frac;
  231.     signed int result;
  232.     uint8_t buff[8];
  233.  
  234.     //прочитать данные из датчика
  235.     if(ds_read_data_single(&buff[0],PinNumb)) return 1280;
  236.  
  237.     frac = buff[0] & 0x0f; //получить дробную часть
  238.     integer = (buff[0]>>4) | ((buff[1] & 0x0f)<<4); //получить целую часть
  239.  
  240.     //если температура отрицательная
  241.     if(integer<0)
  242.     {
  243.         integer = 0 - integer - 1;
  244.         result = integer; //учитываем целую часть
  245.         frac = frac | 0xf0;
  246.         frac = 0 - frac ;
  247.     }
  248.     //если температура положительная
  249.     else result = integer; //учитываем целую часть
  250.  
  251.     result = result + (frac/16); //учитываем дробную часть
  252.  
  253.     return result;
  254. }
  255.  
  256. static void delayt(void)
  257. {
  258.     TIM2->CNT = 0;
  259.     while(TIM2->CNT < 1000){};
  260. }
  261.  
  262. __attribute__((naked)) static void delay(void)
  263. {
  264.     asm ("push {r7, lr}");
  265.     asm ("ldr r6, [pc, #8]");
  266.     asm ("sub r6, #1");
  267.     asm ("cmp r6, #0");
  268.     asm ("bne delay+0x4");
  269.     asm ("pop {r7, pc}");
  270.     asm (".word 0x927C0"); //6000000
  271. }
  272.  
  273. void delay_ms(uint16_t value)
  274. {
  275.     TIM2->ARR = value;
  276.     TIM2->CNT = 0;
  277.     TIM2->CR1 = TIM_CR1_CEN;
  278.     while((TIM2->SR & TIM_SR_UIF) == 0){}
  279.     TIM2->SR &= ~TIM_SR_UIF;
  280. }
  281.  
  282. __attribute__((naked)) static void delay1(void)
  283. {
  284.     asm ("push {r7, lr}");
  285.     asm ("ldr r6, [pc, #8]");
  286.     asm ("sub r6, #1");
  287.     asm ("cmp r6, #0");
  288.     asm ("bne delay+0x4");
  289.     asm ("pop {r7, pc}");
  290.     asm (".word 0x5B8D80"); //6000000
  291. }
  292. /*
  293.  * Configure timer to input capture mode
  294.  */
  295. int main(void)
  296. {
  297.         rcc_config();
  298.         gpio_config();
  299.     timers_config();
  300.     //port_config();   
  301.         signed int result, i;
  302.     uint8_t buff[9];
  303.     signed int p = 0;
  304.     uint8_t frac = 0, integer = 0;
  305.     while(1)
  306.     {
  307.         ds_reset_pulse(1<<7);
  308.         ds_write_byte(0xCC,1<<7);
  309.         ds_write_byte(0x44,1<<7);  
  310.         //LL_GPIO_WriteOutputPort(GPIOC, LL_GPIO_PIN_12);
  311.         //если поменять местами delay и включение диода, то ничего не сработает. почему?
  312.         //LL_GPIO_WriteOutputPort(GPIOC, LL_GPIO_PIN_12);
  313.         delay_ms(1000);
  314.         /*ds_reset_pulse(1<<7);
  315.         ds_write_byte(0xCC,1<<7);
  316.         ds_write_byte(0xBE,1<<7);
  317.         for(i=0;i<9;i++)
  318.             buff[i] = ds_read_byte(1<<7);
  319.         frac = buff[0] & 0x0f;
  320.         integer = (buff[0]>>4) | ((buff[1] & 0x0f)<<4);*/
  321.         result = ds_read_temperature(7);
  322.         if (result < 100){
  323.             LL_GPIO_WriteOutputPort(GPIOC, LL_GPIO_PIN_12);
  324.         }else{
  325.             LL_GPIO_WriteOutputPort(GPIOC, LL_GPIO_PIN_9);//оказывается больше 100, что если я работаю с набором функций, которые закомментированы, что если единой.
  326.         }
  327.         p++;
  328.     }  
  329.     return 0;
  330. }
Add Comment
Please, Sign In to add comment