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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
#include "nixie_driver_config.h"
static void NixieDriver_TIMConfig ( void );
static void NixieDriver_SPIConfig ( void );
void NixieDriverConfig ( void )
{
NixieDriver_TIMConfig ();
NixieDriver_SPIConfig ();
}
// ----------------------------------------------------------------------------
// Конфигурируем таймер на 100 мкс. В прерывании каждые 100 мкс будет
// проворачиваться механизм динамической индикации ламп Nixie
// ----------------------------------------------------------------------------
static void NixieDriver_TIMConfig ( void )
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* NIX_DRIVER_TIMx clock enable */
NIX_DRIVER_RCC_APBxPeriphClockCmd ( NIX_DRIVER_TIM_RCC, ENABLE );
/* Enable the NIX_DRIVER_TIMx gloabal Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = NIX_DRIVER_TIM_IRQx;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
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 = 100; // Это миксросекунды //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 ( NIX_DRIVER_TIMx, &TIM_TimeBaseStructure );
/* NIX_DRIVER_TIMx Interrupts enable */
TIM_ITConfig ( NIX_DRIVER_TIMx, TIM_IT_Update, ENABLE );
/* NIX_DRIVER_TIMx enable counter */
TIM_Cmd ( NIX_DRIVER_TIMx, ENABLE );
}
// ----------------------------------------------------------------------------
//
// ----------------------------------------------------------------------------
static void NixieDriver_SPIConfig ( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the SPI periph */
NIX_SPIx_RCC_APBxPeriphClockCmd ( NIX_SPIx_CLK, ENABLE );
/* Enable SCK, MOSI, MISO and NSS GPIO clocks */
RCC_AHBPeriphClockCmd ( NIX_SPIx_SCK_GPIO_CLK |
NIX_SPIx_MOSI_GPIO_CLK |
NIX_SPIx_ST_GPIO_CLK |
NIX_GPIOx_TUB_P1_GPIO_CLK |
NIX_GPIOx_TUB_P2_GPIO_CLK,
ENABLE );
GPIO_PinAFConfig ( NIX_SPIx_SCK_GPIO_PORT, NIX_SPIx_SCK_SOURCE, NIX_SPIx_SCK_AF );
GPIO_PinAFConfig ( NIX_SPIx_MOSI_GPIO_PORT, NIX_SPIx_MOSI_SOURCE, NIX_SPIx_MOSI_AF );
//GPIO_PinAFConfig ( NIX_SPIx_ST_GPIO_PORT, NIX_SPIx_ST_SOURCE, NIX_SPIx_ST_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 = NIX_SPIx_SCK_PIN;
GPIO_Init ( NIX_SPIx_SCK_GPIO_PORT, &GPIO_InitStructure );
/* SPI MOSI pin configuration */
GPIO_InitStructure.GPIO_Pin = NIX_SPIx_MOSI_PIN;
GPIO_Init ( NIX_SPIx_MOSI_GPIO_PORT, &GPIO_InitStructure );
/* GPIO ST pin configuration */
GPIO_InitStructure.GPIO_Pin = NIX_SPIx_ST_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_Init ( NIX_SPIx_ST_GPIO_PORT, &GPIO_InitStructure );
// Пины управления точками на лампах (не хватило ног сдвиговых редисок)
/* GPIO tub_dp1 pin configuration */
GPIO_InitStructure.GPIO_Pin = NIX_GPIOx_TUB_DP1_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 ( NIX_GPIOx_TUB_DP1_PORT, &GPIO_InitStructure );
/* GPIO tub_dp2 pin configuration */
GPIO_InitStructure.GPIO_Pin = NIX_GPIOx_TUB_DP2_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 ( NIX_GPIOx_TUB_DP2_PORT, &GPIO_InitStructure );
/* SPI configuration -------------------------------------------------------*/
SPI_I2S_DeInit ( NIX_SPIx );
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
//SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
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_NSS = SPI_NSS_Hard;
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 ( NIX_SPIx, &SPI_InitStructure );
/* Enable the SPI peripheral */
SPI_Cmd ( NIX_SPIx, ENABLE );
/* Configure the SPI interrupt priority */
NVIC_InitStructure.NVIC_IRQChannel = NIX_SPIx_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init ( &NVIC_InitStructure );
// /* Enable the Tx buffer empty interrupt */
SPI_I2S_ITConfig ( NIX_SPIx, SPI_I2S_IT_TXE, ENABLE );
NIX_DRIVER_RESET_ST_PIN;
NIX_DRIVER_RESET_TUB_DP1_PIN;
NIX_DRIVER_RESET_TUB_DP2_PIN;
}
|