Implement a secure ICS protocol targeting LoRa Node151 microcontroller for controlling irrigation.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

168 lines
4.1 KiB

  1. /*-
  2. * Copyright 2021 John-Mark Gurney.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. * 1. Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * 2. Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. *
  13. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  14. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  15. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  16. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  17. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  18. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  19. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  20. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  21. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  22. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  23. * SUCH DAMAGE.
  24. *
  25. */
  26. #include <string.h>
  27. #include <misc.h>
  28. #include <sysinit.h>
  29. #include <main.h>
  30. static void
  31. c13led(void)
  32. {
  33. GPIO_InitTypeDef GPIO_InitStruct;
  34. __HAL_RCC_GPIOA_CLK_ENABLE();
  35. __HAL_RCC_GPIOB_CLK_ENABLE();
  36. __HAL_RCC_GPIOC_CLK_ENABLE();
  37. GPIO_InitStruct = (GPIO_InitTypeDef){
  38. .Pin = GPIO_PIN_3,
  39. .Mode = GPIO_MODE_OUTPUT_PP,
  40. .Pull = GPIO_NOPULL,
  41. .Speed = GPIO_SPEED_FREQ_LOW,
  42. };
  43. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  44. GPIO_InitStruct = (GPIO_InitTypeDef){
  45. .Pin = GPIO_PIN_13,
  46. .Mode = GPIO_MODE_OUTPUT_PP,
  47. .Pull = GPIO_NOPULL,
  48. .Speed = GPIO_SPEED_FREQ_LOW,
  49. };
  50. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  51. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
  52. }
  53. SYSINIT_VF(c13led, SI_SUB_HAL, SI_ORDER_SECOND, c13led);
  54. static TIM_HandleTypeDef htim2;
  55. /* 36.2.2 Step 1 */
  56. void
  57. HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
  58. {
  59. }
  60. #define PERIOD_VALUE (700 - 1)
  61. void
  62. tim2ch4(void)
  63. {
  64. GPIO_InitTypeDef GPIO_InitStruct;
  65. uint32_t uhPrescalerValue;
  66. /*
  67. * various parts from F1's
  68. * Projects/STM3210E_EVAL/Examples/TIM/TIM_PWMOutput/Src/main.c
  69. */
  70. uhPrescalerValue = (uint32_t)(SystemCoreClock / 2000000) - 1;
  71. /* 36.2.2 Step 2a */
  72. __HAL_RCC_TIM2_CLK_ENABLE();
  73. /* 36.2.2 Step 2b */
  74. __HAL_RCC_GPIOA_CLK_ENABLE();
  75. GPIO_InitStruct = (GPIO_InitTypeDef){
  76. .Pin = GPIO_PIN_3,
  77. .Mode = GPIO_MODE_AF_PP,
  78. .Pull = GPIO_NOPULL,
  79. .Speed = GPIO_SPEED_FREQ_LOW,
  80. };
  81. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  82. /* 36.2.2 Step 4 */
  83. htim2 = (TIM_HandleTypeDef){
  84. .Instance = TIM2,
  85. /* TIM_Base_InitTypeDef */
  86. .Init.Prescaler = uhPrescalerValue,
  87. .Init.Period = PERIOD_VALUE,
  88. .Init.CounterMode = TIM_COUNTERMODE_UP,
  89. .Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE,
  90. };
  91. HAL_TIM_PWM_Init(&htim2);
  92. }
  93. SYSINIT_VF(tim2ch4, SI_SUB_HAL, SI_ORDER_THIRD, tim2ch4);
  94. int
  95. main(void)
  96. {
  97. debug_printf("starting...\n");
  98. #if 0
  99. /* toggle on LED */
  100. for (;;) {
  101. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
  102. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
  103. HAL_Delay(250);
  104. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
  105. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
  106. HAL_Delay(250);
  107. }
  108. #else
  109. /* PA3 TIM2_CH4 */
  110. TIM_OC_InitTypeDef oconfig;
  111. oconfig = (TIM_OC_InitTypeDef){
  112. .OCMode = TIM_OCMODE_PWM1,
  113. .OCPolarity = TIM_OCPOLARITY_HIGH,
  114. .OCFastMode = TIM_OCFAST_DISABLE,
  115. .OCNPolarity = TIM_OCNPOLARITY_HIGH,
  116. .OCNIdleState = TIM_OCNIDLESTATE_RESET,
  117. .OCIdleState = TIM_OCIDLESTATE_RESET,
  118. .Pulse = PERIOD_VALUE, // OFF
  119. };
  120. HAL_TIM_PWM_ConfigChannel(&htim2, &oconfig, TIM_CHANNEL_4);
  121. HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);
  122. for (int i = 0;; i = (i + 1) % 3) {
  123. switch (i) {
  124. case 0:
  125. TIM2->CCR4 = PERIOD_VALUE;
  126. break;
  127. case 1:
  128. TIM2->CCR4 = PERIOD_VALUE / 2;
  129. break;
  130. case 2:
  131. TIM2->CCR4 = 0;
  132. break;
  133. }
  134. #if 0
  135. HAL_Delay(100);
  136. #else
  137. HAL_Delay(35);
  138. #endif
  139. }
  140. HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_4);
  141. #endif
  142. }