Advertisement
Nikon27

Untitled

May 13th, 2019
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement