main.c


1
#define TI_1ms          1
2
#define TI_10ms         (TI_1ms * 10)
3
#define TI_100ms        (TI_10ms * 10)
4
#define TI_1s           (TI_100ms * 10)
5
6
7
#define true    1
8
#define false   0
9
10
11
12
/* Includes ------------------------------------------------------------------*/
13
#include "stm32l4xx_hal.h"
14
//#include "usb_device.h"
15
16
17
TIM_HandleTypeDef htim2;
18
19
20
uint8_t IN_BYTE, led_status, fft_status;
21
volatile uint16_t timer_led, fft_timer;
22
23
24
void SystemClock_Config(void);
25
static void MX_GPIO_Init(void);
26
static void MX_TIM2_Init(void);
27
28
29
30
void USB_SendInteger(long value)
31
{
32
    char i[20];
33
  itoa(value, i, 10);
34
  CDC_Transmit_FS(i, strlen(i));
35
}
36
37
38
39
int main(void)
40
{
41
    HAL_Init();
42
43
    SystemClock_Config();
44
    MX_GPIO_Init();
45
//    MX_USB_DEVICE_Init();
46
47
48
    //switch in circle on
49
    HAL_GPIO_WritePin(GPIOB, (GPIO_PIN_2), GPIO_PIN_SET);
50
 //   HAL_Delay(300);   //fehler
51
    HAL_GPIO_WritePin(GPIOE, (GPIO_PIN_8), GPIO_PIN_SET);
52
 //   HAL_Delay(300);   //fehler
53
54
55
    MX_TIM2_Init(); //now starts interrupt for timer
56
57
58
    while (1)
59
    {
60
        /*
61
        if (VCP_read(&IN_BYTE, 1))
62
        {
63
            if (IN_BYTE == 's')
64
            {
65
                CDC_Transmit_FS("FFT starts... Please wait\n");
66
67
                CDC_Transmit_FS("FFT-Time with DSP: ");
68
                USB_SendInteger(fft_timer);
69
                CDC_Transmit_FS("\n\n", strlen("\n\n"));
70
            }
71
            else
72
                CDC_Transmit_FS("STM32-Discovery Board for Testing DSP-FFT Performance. Start with sending a 's'\n\n", strlen("STM32-Discovery Board for Testing DSP-FFT Performance. Start with sending a 's'\n\n"));
73
74
75
            IN_BYTE = 0;
76
        }
77
        */
78
79
80
        if (led_status == 2)
81
        {
82
            CDC_Transmit_FS("Button-Pressed-Interrupt\n", strlen("Button-Pressed-Interrupt\n"));
83
            led_status = 0;
84
85
            timer_led = (TI_100ms * 2);
86
        }
87
88
89
        if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1))    HAL_GPIO_WritePin(GPIOB, (GPIO_PIN_2), GPIO_PIN_RESET);
90
        else                                        HAL_GPIO_WritePin(GPIOB, (GPIO_PIN_2), GPIO_PIN_SET);
91
    }
92
}
93
94
95
void SystemClock_Config(void)
96
{
97
    RCC_OscInitTypeDef RCC_OscInitStruct;
98
    RCC_ClkInitTypeDef RCC_ClkInitStruct;
99
    RCC_PeriphCLKInitTypeDef PeriphClkInit;
100
101
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_MSI;
102
    RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
103
    RCC_OscInitStruct.MSIState = RCC_MSI_ON;
104
    RCC_OscInitStruct.MSICalibrationValue = 0;
105
    RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
106
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
107
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
108
    RCC_OscInitStruct.PLL.PLLM = 1;
109
    RCC_OscInitStruct.PLL.PLLN = 40;
110
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
111
    RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
112
    RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
113
    HAL_RCC_OscConfig(&RCC_OscInitStruct);
114
115
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
116
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
117
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
118
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
119
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
120
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
121
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
122
123
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;
124
    PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLLSAI1;
125
    PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_MSI;
126
    PeriphClkInit.PLLSAI1.PLLSAI1M = 1;
127
    PeriphClkInit.PLLSAI1.PLLSAI1N = 24;
128
    PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7;
129
    PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2;
130
    PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2;
131
    PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_48M2CLK;
132
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
133
134
    __HAL_RCC_PWR_CLK_ENABLE();
135
    HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
136
137
    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
138
139
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
140
141
    HAL_RCCEx_EnableMSIPLLMode();
142
143
    /* SysTick_IRQn interrupt configuration */
144
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
145
}
146
147
/* TIM2 init function */
148
static void MX_TIM2_Init(void)
149
{
150
    htim2.Instance = TIM2;
151
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
152
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4;
153
    htim2.Init.Prescaler = 400;
154
    htim2.Init.Period = 200;          //~every ms interrupt! Needable for time
155
    htim2.Init.RepetitionCounter = 0;
156
157
    HAL_NVIC_SetPriority(TIM2_IRQn, 0, 1);
158
    HAL_NVIC_EnableIRQ(TIM2_IRQn);
159
160
//    HAL_TIM_Base_Init(&htim2);        //fehler
161
//    HAL_TIM_Base_Start_IT(&htim2);    //fehler
162
}
163
164
165
static void MX_GPIO_Init(void)
166
{
167
    GPIO_InitTypeDef GPIO_InitStruct;
168
169
    /* GPIO Ports Clock Enable */
170
    __HAL_RCC_GPIOA_CLK_ENABLE();
171
    __HAL_RCC_GPIOB_CLK_ENABLE();
172
    __HAL_RCC_GPIOC_CLK_ENABLE();
173
    __HAL_RCC_GPIOD_CLK_ENABLE();
174
    __HAL_RCC_GPIOE_CLK_ENABLE();
175
    __HAL_RCC_GPIOH_CLK_ENABLE();
176
177
178
    //led 1 und 2 as output
179
    /*Configure GPIO pins : all LEDs */
180
    GPIO_InitStruct.Pin = GPIO_PIN_2;
181
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
182
    GPIO_InitStruct.Pull = GPIO_NOPULL;
183
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
184
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
185
186
187
    GPIO_InitStruct.Pin = GPIO_PIN_8;
188
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
189
    GPIO_InitStruct.Pull = GPIO_NOPULL;
190
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
191
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
192
193
194
    /*Configure GPIO pin : PA0 */
195
    GPIO_InitStruct.Pin = GPIO_PIN_0;
196
    GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;    //GPIO_MODE_IT_RISING
197
    GPIO_InitStruct.Pull = GPIO_PULLDOWN;
198
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
199
200
    /* EXTI interrupt init*/
201
    HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
202
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);
203
204
205
    /*Configure GPIO pin : PA1 */
206
    GPIO_InitStruct.Pin = GPIO_PIN_1;
207
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
208
    GPIO_InitStruct.Pull = GPIO_PULLDOWN;
209
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
210
211
212
    //*Configure GPIO pins : PA10 PA11 PA12 */ //for USB
213
    GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
214
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
215
    GPIO_InitStruct.Pull = GPIO_NOPULL;
216
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
217
    GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
218
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
219
}
220
221
222
void EXTI0_IRQHandler(void)
223
{
224
    if (led_status == 1)
225
    {
226
       HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);
227
       led_status = 2;
228
    }
229
230
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
231
}
232
233
234
void TIM2_IRQHandler(void)
235
{
236
    HAL_TIM_IRQHandler(&htim2);
237
238
239
    if (timer_led)   timer_led--;
240
241
242
    //auswertung
243
    if (!timer_led)
244
    {
245
        timer_led = (TI_100ms * 5);
246
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);
247
    }
248
249
    if (!timer_led && !led_status)   led_status = 1;
250
}
251
252
253
#ifdef USE_FULL_ASSERT
254
void assert_failed(uint8_t* file, uint32_t line)
255
{
256
}
257
#endif