Advertisement
Guest User

Compas

a guest
May 24th, 2012
502
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.37 KB | None | 0 0
  1. #include <stm32f10x.h>
  2.  
  3. #define  DWLOS_C
  4. #include "DWLOS_config.h"
  5. #include "DWLOS.h"
  6.  
  7.  
  8.  
  9. void Idle (void)
  10.  { }
  11.  
  12.  
  13.  
  14. void Init_DWLOS (void)
  15.  {
  16.   uint8_t   index;
  17.  
  18.   for (index = 0; index < Task_Turn_Size; index ++)
  19.    {
  20.     Task_Turn [index] = &Idle;
  21.    }
  22.  
  23.   for (index = 0; index < Timer_Turn_Size; index ++)
  24.    {
  25.     (pTimer_Turn + index) -> Task = &Idle;
  26.     (pTimer_Turn + index) -> Time = 0;
  27.    }
  28.  
  29. #if      LOG_ACTIVE
  30.   Log_bank = 0;
  31.   Log_index = 0;
  32.  
  33.   Set_Timer (Log_Out, LOG_DL_INTERVAL);
  34. #endif
  35.  
  36.   LOG_ADD(PROG_START);
  37.  
  38.   RCC -> AHBENR |= RCC_AHBENR_DMA1EN;
  39.   RCC -> APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN | RCC_APB2ENR_AFIOEN;
  40.   RCC -> APB2ENR |= LED1_RCC | LED2_RCC | LED3_RCC | LED4_RCC;
  41.  
  42.  
  43.   // LED 1
  44.   LED1_GPIO &= ~(LED1_CNF);
  45.   LED1_GPIO |= LED1_MODE;
  46.   LED1_OFF;
  47.  
  48.   // LED 2
  49.   LED2_GPIO &= ~(LED2_CNF);
  50.   LED2_GPIO |= LED2_MODE;
  51.   LED2_OFF;
  52.  
  53.   // LED 3
  54.   LED3_GPIO &= ~(LED3_CNF);
  55.   LED3_GPIO |= LED3_MODE;
  56.   LED3_OFF;
  57.  
  58.   // LED 4
  59.   LED4_GPIO &= ~(LED4_CNF);
  60.   LED4_GPIO |= LED4_MODE;
  61.   LED4_OFF;
  62.  
  63.  
  64.  
  65. // RX = PA10
  66.   GPIOA -> CRH |= GPIO_CRH_CNF10_1;
  67.   GPIOA -> CRH &= ~GPIO_CRH_CNF10_0;
  68.   GPIOA -> CRH &= ~(GPIO_CRH_MODE10_1 | GPIO_CRH_MODE10_0);
  69.  
  70. // TX = PA9
  71.   GPIOA -> CRH |= GPIO_CRH_CNF9_1;
  72.   GPIOA -> CRH &= ~GPIO_CRH_CNF9_0;
  73.   GPIOA -> CRH |= GPIO_CRH_MODE9_1 | GPIO_CRH_MODE9_0;
  74.  
  75.  
  76.   NVIC_SetPriority (DMA1_Channel4_IRQn, USART_TX_PRIORITY); // USART1 TX
  77.   NVIC_EnableIRQ (DMA1_Channel4_IRQn);
  78.  
  79.   NVIC_SetPriority (DMA1_Channel5_IRQn, USART_RX_PRIORITY); // USART1 RX
  80.   NVIC_EnableIRQ (DMA1_Channel5_IRQn);
  81.  
  82.  
  83. //  DMA1 Channel4 -- USART.TX
  84.   USART1_Tx_DMA -> CCR &= ~DMA_CCR4_MEM2MEM;
  85.   USART1_Tx_DMA -> CCR |= DMA_CCR4_PL_1;
  86.   USART1_Tx_DMA -> CCR &= ~(DMA_CCR4_MSIZE_1 | DMA_CCR4_MSIZE_0);
  87.   USART1_Tx_DMA -> CCR &= ~(DMA_CCR4_PSIZE_1 | DMA_CCR4_PSIZE_0);
  88.   USART1_Tx_DMA -> CCR |= DMA_CCR4_MINC;
  89.   USART1_Tx_DMA -> CCR &= ~DMA_CCR4_PINC;
  90.   USART1_Tx_DMA -> CCR &= ~DMA_CCR4_CIRC;
  91.   USART1_Tx_DMA -> CCR |= DMA_CCR4_DIR;
  92.   USART1_Tx_DMA -> CPAR = USART1_BASE + 0x04;
  93.   USART1_Tx_DMA_IT_ON;
  94.  
  95.   USART1_Tx_DMA -> CMAR = (uint32_t) USART1_Tx_Buffer;
  96.   USART1_Tx_DMA -> CNDTR = 0; // USART1_Tx_Buffer_Size
  97.  
  98.  
  99. //  DMA1 Channel5 -- USART.RX
  100.   USART1_Rx_DMA -> CCR &= ~DMA_CCR5_MEM2MEM;
  101.   USART1_Rx_DMA -> CCR |= DMA_CCR5_PL_1;
  102.   USART1_Rx_DMA -> CCR &= ~(DMA_CCR5_MSIZE_1 | DMA_CCR5_MSIZE_0);
  103.   USART1_Rx_DMA -> CCR &= ~(DMA_CCR5_PSIZE_1 | DMA_CCR5_PSIZE_0);
  104.   USART1_Rx_DMA -> CCR |= DMA_CCR5_MINC;
  105.   USART1_Rx_DMA -> CCR &= ~DMA_CCR5_PINC;
  106.   USART1_Rx_DMA -> CCR &= ~DMA_CCR5_CIRC;
  107.   USART1_Rx_DMA -> CCR &= ~DMA_CCR5_DIR;
  108.   USART1_Rx_DMA -> CPAR = USART1_BASE + 0x04;
  109.   USART1_Rx_DMA_IT_ON;
  110.  
  111.   USART1_Rx_DMA -> CMAR = (uint32_t) USART1_Rx_Buffer;
  112.   USART1_Rx_DMA -> CNDTR = USART1_Rx_Buffer_size;
  113.  
  114.  
  115. //  USART1 Configuration
  116.   USART1 -> CR1 |= USART_CR1_UE;
  117. //  USART1 -> CR1 |= USART_CR1_TXEIE;
  118. //  USART1 -> CR1 |= USART_CR1_RXNEIE;
  119.   USART1 -> CR1 &= ~USART_CR1_M;
  120.   USART1 -> CR1 &= ~USART_CR1_PCE;
  121.   USART1 -> CR1 |= USART_CR1_TE | USART_CR1_RE;
  122.   USART1 -> CR3 |= USART_CR3_DMAT | USART_CR3_DMAR;
  123. //  USART1 -> BRR |= (USART_BRR_DIV_Mantissa & (117 << 4)) | (USART_BRR_DIV_Fraction & 3);  // 38.4k
  124.   USART1 -> BRR |= (USART_BRR_DIV_Mantissa & (39 << 4)) | (USART_BRR_DIV_Fraction & 1);     // 115.2k
  125. //  USART1 -> BRR |= (USART_BRR_DIV_Mantissa & (19 << 4)) | (USART_BRR_DIV_Fraction & 9);   // 230.4k
  126.  
  127.   USART1_Tx_DMA_OFF;
  128.   USART1_Rx_DMA_OFF;
  129.  }
  130.  
  131.  
  132.  
  133.  
  134. void Set_Task (pFnk TS)
  135.  {
  136.   uint8_t   index = 0;
  137.  
  138.   while (Task_Turn [index] != &Idle)
  139.    {
  140.     index ++;
  141.     if (index == Task_Turn_Size)
  142.      {
  143.       LOG_ADD(TASK_OVERFLOW);
  144.       return;
  145.      }
  146.    }
  147.  
  148.   Task_Turn [index] = TS;
  149.  }
  150.  
  151.  
  152. void Set_Timer (pFnk TS, uint16_t newTime)
  153.  {
  154.   uint8_t   index = 0;
  155.   uint8_t   Idle_i = 255;
  156.  
  157.   for (index = 0; index < Timer_Turn_Size; index ++)
  158.    {
  159.     if ((pTimer_Turn + index) -> Task == TS)
  160.      {
  161.       (pTimer_Turn + index) -> Time = newTime;
  162.       return;
  163.      }
  164.     else if (((pTimer_Turn + index) -> Task == &Idle) && (Idle_i == 255))
  165.      {
  166.       Idle_i = index;
  167.      }
  168.    }
  169.  
  170.   if (Idle_i != 255)
  171.    {
  172.     (pTimer_Turn + Idle_i) -> Task = TS;
  173.     (pTimer_Turn + Idle_i) -> Time = newTime;
  174.    }
  175.   else
  176.    {
  177.     LOG_ADD(TIMER_OVERFLOW);
  178.     return;
  179.    }
  180.  }
  181.  
  182.  
  183.  
  184. void Task_Manager (void)
  185.  {
  186.   uint8_t   index = 0;
  187.   pFnk      Task = &Idle;
  188.  
  189.  
  190.  
  191.   Task = Task_Turn [0];
  192.  
  193.   if (Task == &Idle)
  194.     (Idle)();
  195.  
  196.   else
  197.    {
  198.     for (index = 0; index < Task_Turn_Size; index ++)
  199.      {
  200.       Task_Turn [index] = Task_Turn [index + 1];
  201.      }
  202.  
  203.     Task_Turn [Task_Turn_Size - 1] = &Idle;
  204.     (Task)();
  205.    }
  206.  }
  207.  
  208.  
  209. void Timer_Manager (void)
  210.  {
  211.   uint8_t   index;
  212.  
  213.   for (index = 0; index < Timer_Turn_Size; index ++)
  214.    {
  215.     if ((pTimer_Turn + index) -> Task == &Idle)
  216.       continue;
  217.     if ((pTimer_Turn + index) -> Time != 1)
  218.       (pTimer_Turn + index) -> Time --;
  219.  
  220.     else
  221.      {
  222.       Set_Task ((pTimer_Turn + index) -> Task);
  223.       (pTimer_Turn + index) -> Task = &Idle;
  224.      }
  225.    }
  226.  }
  227.  
  228.  
  229. void Run_DWLOS (void)
  230.  {
  231.   /* Setup SysTick Timer for 1 msec interrupts  */
  232.   SysTick_Config (DWLOS_TIM_PRESCALER);
  233.  
  234.   LOG_ADD(RUN_OS);
  235.  }
  236.  
  237. void Stop_DWLOS (void)
  238.  {
  239. //  SysTick -> CTRL = ~(SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk);
  240.   SysTick -> CTRL = 0x00;
  241.  
  242.   LOG_ADD(STOP_OS);
  243.  }
  244.  
  245. void SysTick_Handler (void)
  246.  {
  247.   Timer_Manager ();
  248.  }
  249.  
  250.  
  251. void WDG_init (void)
  252.  {
  253.   // IWDG_WriteAccess_Enable
  254.   IWDG -> KR = ((uint16_t)0x5555);
  255.  
  256.   // Set Prescaler
  257.   IWDG -> PR = IWDG_PRESCALER;
  258.  
  259.   // Set Reload value
  260.   IWDG -> RLR = IWDG_RELOAD;
  261.  
  262.   // Update IWDG
  263.   WDG_reload ();
  264.  
  265.   // IWDG Enable
  266.   IWDG -> KR = ((uint16_t)0xCCCC);
  267.  }
  268.  
  269. void WDG_reload (void)
  270.  {
  271.   IWDG -> KR = ((uint16_t)0xAAAA);
  272.  
  273.   LOG_ADD(IWG_RELOAD);
  274.  }
  275.  
  276.  
  277. #if      LOG_ACTIVE
  278. void Log_Out (void)
  279.  {
  280.   if (Log_index > 0)
  281.    {
  282.     USART1_Tx_DMA_OFF;
  283.     USART1_Tx_DMA -> CMAR = (uint32_t) (pLog_arr + Log_bank);
  284.     USART1_Tx_DMA -> CNDTR = Log_index;
  285.     USART1_Tx_DMA_ON;
  286.  
  287.     Log_index = 0;
  288.     Log_bank = (Log_bank ? 0 : LOG_BANK_SIZE);
  289.    }
  290.  
  291.   Set_Timer (Log_Out, LOG_DL_INTERVAL);
  292.  }
  293.  
  294.  
  295. void Log_Add (uint8_t ch)
  296.  {
  297.   if (Log_index > (LOG_BANK_SIZE-5) && LOG_ACTIVE)
  298.    {
  299.     Log_Out ();
  300.    }
  301.  
  302.   if (Log_index == LOG_BANK_SIZE)
  303.     Log_index = 0;
  304.  
  305.   *(pLog_arr + Log_bank + Log_index) = ch;
  306.   Log_index ++;
  307.  }
  308. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement