summaryrefslogtreecommitdiff
path: root/app/led_driver/led_driver_config.c
blob: 3b2b08121d9d06920c9d32fb56aaf2012e4bb40b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include "led_driver_config.h"

static void LED_TIMConfig ( void );
static void LED_SPIConfig ( void );

// ----------------------------------------------------------------------------
// Подготовка железа, прерываний и тд для работы с RGB светодиодиками
// ----------------------------------------------------------------------------
void LED_Driver_Config ( void )
{
  LED_TIMConfig ();
  LED_SPIConfig ();
}


// ----------------------------------------------------------------------------
//
// ----------------------------------------------------------------------------
static void LED_TIMConfig ( void )
{
  NVIC_InitTypeDef         NVIC_InitStructure;
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  /* LED_TIMx clock enable */
  LED_RCC_APBxPeriphClockCmd ( LED_TIM_RCC, ENABLE );

  /* Enable the LED_TIMx gloabal Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel         = LED_TIM_IRQx;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 2;                               // Установим приоритет ниже, чем у модуля NixieDriver
  NVIC_InitStructure.NVIC_IRQChannelCmd      = ENABLE;
  NVIC_Init ( &NVIC_InitStructure );

  /* -----------------------------------------------------------------------
   In this example TIM7 counter clock (TIM7CLK) is set to APB1 clock (PCLK1), since
   APB1 prescaler is set to 1 and TIM7 prescaler is set to 0.

  In this example TIM7 input clock (TIM7CLK) is set to APB1 clock (PCLK1),
  since APB1 prescaler is set to 1.
  TIM7CLK = PCLK1 = HCLK = SystemCoreClock

  With Prescaler set to 479 and Period to 24999, the TIM7 counter is updated each 250 ms
  (i.e. and interrupt is generated each 250 ms)
     TIM7 counter clock = TIM7CLK /((Prescaler + 1)*(Period + 1))
                        = 48 MHz / ((25000)*(480))
                        = 4 Hz
     ==> TIM7 counter period = 250 ms

  Note:
  SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f0xx.c file.
  Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate()
  function to update SystemCoreClock variable value. Otherwise, any configuration
  based on this variable will be incorrect.
  ----------------------------------------------------------------------- */

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period        = 1000;                               // Это миксросекунды //24999
  TIM_TimeBaseStructure.TIM_Prescaler     = (SystemCoreClock/1000000)-1;        //479;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;
  TIM_TimeBaseInit ( LED_TIMx, &TIM_TimeBaseStructure );

  /* LED_TIMx Interrupts enable */
  TIM_ITConfig ( LED_TIMx, TIM_IT_Update, ENABLE );

  /* LED_TIMx enable counter */
  TIM_Cmd ( LED_TIMx, ENABLE );
}


// ----------------------------------------------------------------------------
//
// ----------------------------------------------------------------------------
static void LED_SPIConfig ( void )
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  SPI_InitTypeDef   SPI_InitStructure;
  NVIC_InitTypeDef  NVIC_InitStructure;

  /* Enable the SPI periph */
  LED_SPIx_RCC_APBxPeriphClockCmd ( LED_SPIx_CLK, ENABLE );

  /* Enable SCK, MOSI, MISO and NSS GPIO clocks */
  RCC_AHBPeriphClockCmd ( LED_SPIx_SCK_GPIO_CLK     |
                          LED_SPIx_MOSI_GPIO_CLK    |
                          LED_SPIx_ST_GPIO_CLK,
                          ENABLE );

  GPIO_PinAFConfig ( LED_SPIx_SCK_GPIO_PORT,  LED_SPIx_SCK_SOURCE,  LED_SPIx_SCK_AF  );
  GPIO_PinAFConfig ( LED_SPIx_MOSI_GPIO_PORT, LED_SPIx_MOSI_SOURCE, LED_SPIx_MOSI_AF );

  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;

  /* SPI SCK pin configuration */
  GPIO_InitStructure.GPIO_Pin = LED_SPIx_SCK_PIN;
  GPIO_Init ( LED_SPIx_SCK_GPIO_PORT, &GPIO_InitStructure );

  /* SPI MOSI pin configuration */
  GPIO_InitStructure.GPIO_Pin = LED_SPIx_MOSI_PIN;
  GPIO_Init ( LED_SPIx_MOSI_GPIO_PORT, &GPIO_InitStructure );

  /* GPIO ST pin configuration */
  GPIO_InitStructure.GPIO_Pin   = LED_SPIx_ST_PIN;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
  GPIO_Init ( LED_SPIx_ST_GPIO_PORT, &GPIO_InitStructure );

  /* SPI configuration -------------------------------------------------------*/
  SPI_I2S_DeInit ( LED_SPIx );
  SPI_InitStructure.SPI_Direction         = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_DataSize          = SPI_DataSize_16b;
  SPI_InitStructure.SPI_CPOL              = SPI_CPOL_Low;
  SPI_InitStructure.SPI_CPHA              = SPI_CPHA_1Edge;
  SPI_InitStructure.SPI_NSS               = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
  SPI_InitStructure.SPI_FirstBit          = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial     = 7;
  SPI_InitStructure.SPI_Mode              = SPI_Mode_Master;
  SPI_Init ( LED_SPIx, &SPI_InitStructure );

  /* Enable the SPI peripheral */
  SPI_Cmd ( LED_SPIx, ENABLE );

  /* Configure the SPI interrupt priority */
  NVIC_InitStructure.NVIC_IRQChannel         = LED_SPIx_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd      = ENABLE;
  NVIC_Init ( &NVIC_InitStructure );

  /* Enable the Rx buffer not empty interrupt */
  SPI_I2S_ITConfig ( LED_SPIx, SPI_I2S_IT_RXNE, ENABLE );

  LED_ST_PIN_RESET;
}