0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 13
1

STM32F030C6T6 Режиме захвата

19.11.2023, 18:11. Показов 605. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!
Сразу прошу не посылать в бескрайние просторы интернета. Изучал и данный раздел в котором размещаю эту тему.
Прошу, помогите! Сил нен уже.
Попалось устройство в котором необходимо реализован генератор прямоугольных импульсов с изменяющейся частотой (датчик), которую необходимо измерять. Схемотехнически устройство реализовано так, что сигнал поступает на PA4(TIM14_CH1). Порядок частот - мегагерцы.
Для проверки я взял частоту из ремапа от MCO.
И вот теперь, как я только не пробовал частоту выше 187,5 кГц не получается измерить. Не считает переполнения, почему понять не могу. Не силен в работе с прерываниями. Вообще с микроконтроллерами дел почти не имел. Получалось, но были задачки простые.
Понимаю, что что-то не так, но разобраться не получается.
Прошу помогите.
Делал в STM32CubeIDE.
Текст программы:
main.c
C
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
 
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
 
/* USER CODE END Includes */
 
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
 
/* USER CODE END PTD */
 
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define IDLE   0
#define DONE   1
#define F_CLK  48000000UL
/* USER CODE END PD */
 
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
 
/* USER CODE END PM */
 
/* Private variables ---------------------------------------------------------*/
 
/* USER CODE BEGIN PV */
 
/* USER CODE END PV */
 
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
 
/* USER CODE END PFP */
 
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
 
volatile uint8_t gu8_State = IDLE;
volatile uint8_t gu8_MSG[35] = {'\0'};
volatile uint32_t gu32_T1 = 0;
volatile uint32_t gu32_T2 = 0;
volatile uint32_t gu32_Ticks = 0;
volatile uint16_t gu16_TIM14_OVC = 0;
volatile uint32_t gu32_Freq = 0;
 
/* USER CODE END 0 */
 
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
 
  /* USER CODE END 1 */
 
  /* MCU Configuration--------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */
 
  /* Configure the system clock */
  SystemClock_Config();
 
  /* USER CODE BEGIN SysInit */
 
  /* USER CODE END SysInit */
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM14_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
 
  // Работаем с таймером
  __HAL_TIM_CLEAR_IT(&htim14, TIM_IT_UPDATE);//снимаем флаг
 
  HAL_TIM_Base_Start_IT(&htim14); // Запуск таймера для получения прерывания PeriodElapsedCallback
  HAL_TIM_IC_Start_IT(&htim14, TIM_CHANNEL_1); //Включаем канал 1 таймера 14 на работу в режиме Input Capture
 
  HAL_Delay(100); //Задержка для HAL_TIM_PeriodElapsedCallback
 
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
 
/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
 
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
 
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
 
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_RCC_MCOConfig(RCC_MCO, RCC_MCO1SOURCE_HSE, RCC_MCODIV_8);
}
 
/* USER CODE BEGIN 4 */
 
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef* htim)
{
    if(gu8_State == IDLE)
    {
        gu32_T1 = TIM14->CCR1; // Записываем значение CNT первого фронта
        gu16_TIM14_OVC = 0;
        gu8_State = DONE;
    }
    else if(gu8_State == DONE)
    {
        gu32_T2 = TIM14->CCR1; // Записываем значение CNT второго фронта
        gu32_Ticks = (gu32_T2 + (gu16_TIM14_OVC * 65536)) - gu32_T1; // Разница между двумя фронтами
        gu32_Freq = (uint32_t)(F_CLK/gu32_Ticks); // Частота следования импульсов
        if(gu32_Freq != 0)
        {
          sprintf(gu8_MSG, "Frequency = %lu Hz\n\r", gu32_Freq); // Вывод измеренной частоты в UART
          HAL_UART_Transmit(&huart1, gu8_MSG, sizeof(gu8_MSG), 100);
        }
        gu8_State = IDLE;
    }
}
 
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim)
{
    gu16_TIM14_OVC++;
}
 
/* USER CODE END 4 */
 
/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}
 
#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
stm32f0xx_it.c
C
1
2
3
4
5
6
7
8
9
10
void TIM14_IRQHandler(void)
{
  /* USER CODE BEGIN TIM14_IRQn 0 */
 
  /* USER CODE END TIM14_IRQn 0 */
  HAL_TIM_IRQHandler(&htim14);
  /* USER CODE BEGIN TIM14_IRQn 1 */
 
  /* USER CODE END TIM14_IRQn 1 */
}
Скриншоты результата (конфигурация и терминал) во вложениях.
Прошу понять и простить и помочь советом если не сложно. Спасибо.
P.S. В Keil таже программа позволила считать то 375 кГц
Миниатюры
STM32F030C6T6 Режиме захвата   STM32F030C6T6 Режиме захвата   STM32F030C6T6 Режиме захвата  

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2023, 18:11
Ответы с готовыми решениями:

Таймер в режиме захвата
Доброго времени суток! Написал программу для захвата сигнала для stm32f103. Измеряю ширину...

Каскадное включение таймеров в режиме захвата
кто нибудь делал? никак не могу найти подобное все что видел то увеличение разрядности таймера в...

[РЕШЕНО] f030 таймер в режиме захвата
В очередной раз столкнулся с непонятками. Есть вот такой сигнал: Это сигнал датчика семейства...

Таймер в режиме захвата. Не могу понять что не так
Мучаю stmf429I-disco. Простая задача: TIM3 генерирует ШИМ-сигнал, TIM4 считает период следований...

32
Модератор
Эксперт по электронике
8876 / 6651 / 912
Регистрация: 14.02.2011
Сообщений: 23,418
19.11.2023, 19:47 2
Цитата Сообщение от dm_sinner Посмотреть сообщение
MX_TIM14_Init();
это где?
0
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 13
19.11.2023, 20:58  [ТС] 3
Вот инициализация таймера
C
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
/* TIM14 init function */
void MX_TIM14_Init(void)
{
 
  /* USER CODE BEGIN TIM14_Init 0 */
 
  /* USER CODE END TIM14_Init 0 */
 
  TIM_IC_InitTypeDef sConfigIC = {0};
 
  /* USER CODE BEGIN TIM14_Init 1 */
 
  /* USER CODE END TIM14_Init 1 */
  htim14.Instance = TIM14;
  htim14.Init.Prescaler = 0;
  htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim14.Init.Period = 65535;
  htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim14) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_IC_Init(&htim14) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
  sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  sConfigIC.ICFilter = 0;
  if (HAL_TIM_IC_ConfigChannel(&htim14, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIMEx_RemapConfig(&htim14, TIM_TIM14_MCO) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM14_Init 2 */
 
  /* USER CODE END TIM14_Init 2 */
}
0
Модератор
Эксперт по электронике
8876 / 6651 / 912
Регистрация: 14.02.2011
Сообщений: 23,418
20.11.2023, 06:55 4
Цитата Сообщение от dm_sinner Посмотреть сообщение
Вот инициализация таймера
Не вижу инициализацию прерываний
1
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 13
20.11.2023, 13:54  [ТС] 5
Содержимое файла tim.c сгенерированного CubeIDE.
Вроде как MX_TIM14Init() вызывает HAL_TIM_Base_MspInit()
Вот я и не понимаю как правильно проинициализировать и обработать прерывания. Вроде как у 14 таймера одно глобальное. Тут к сожалению я уже запутался.
C
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
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    tim.c
  * @brief   This file provides code for the configuration
  *          of the TIM instances.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "tim.h"
 
/* USER CODE BEGIN 0 */
 
/* USER CODE END 0 */
 
TIM_HandleTypeDef htim14;
 
/* TIM14 init function */
void MX_TIM14_Init(void)
{
 
  /* USER CODE BEGIN TIM14_Init 0 */
 
  /* USER CODE END TIM14_Init 0 */
 
  TIM_IC_InitTypeDef sConfigIC = {0};
 
  /* USER CODE BEGIN TIM14_Init 1 */
 
  /* USER CODE END TIM14_Init 1 */
  htim14.Instance = TIM14;
  htim14.Init.Prescaler = 0;
  htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim14.Init.Period = 65535;
  htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim14) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_IC_Init(&htim14) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
  sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  sConfigIC.ICFilter = 0;
  if (HAL_TIM_IC_ConfigChannel(&htim14, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIMEx_RemapConfig(&htim14, TIM_TIM14_MCO) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM14_Init 2 */
 
  /* USER CODE END TIM14_Init 2 */
 
}
 
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
 
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(tim_baseHandle->Instance==TIM14)
  {
  /* USER CODE BEGIN TIM14_MspInit 0 */
 
  /* USER CODE END TIM14_MspInit 0 */
    /* TIM14 clock enable */
    __HAL_RCC_TIM14_CLK_ENABLE();
 
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**TIM14 GPIO Configuration
    PA4     ------> TIM14_CH1
    */
    GPIO_InitStruct.Pin = GPIO_PIN_4;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF4_TIM14;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
    /* TIM14 interrupt Init */
    HAL_NVIC_SetPriority(TIM14_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM14_IRQn);
  /* USER CODE BEGIN TIM14_MspInit 1 */
 
  /* USER CODE END TIM14_MspInit 1 */
  }
}
 
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{
 
  if(tim_baseHandle->Instance==TIM14)
  {
  /* USER CODE BEGIN TIM14_MspDeInit 0 */
 
  /* USER CODE END TIM14_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_TIM14_CLK_DISABLE();
 
    /**TIM14 GPIO Configuration
    PA4     ------> TIM14_CH1
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4);
 
    /* TIM14 interrupt Deinit */
    HAL_NVIC_DisableIRQ(TIM14_IRQn);
  /* USER CODE BEGIN TIM14_MspDeInit 1 */
 
  /* USER CODE END TIM14_MspDeInit 1 */
  }
}
 
/* USER CODE BEGIN 1 */
 
/* USER CODE END 1 */
0
175 / 160 / 29
Регистрация: 14.02.2013
Сообщений: 1,365
20.11.2023, 15:54 6
dm_sinner, почему думаешь что STM32F030C6T6 сможет в CubeIDE обработать с выше 187,5 кГц?
0
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 13
20.11.2023, 17:25  [ТС] 7
Я пробовал ту же программу, только обработку прерывания засунул перед IRQHandler и тсчитало 375кГц. Так как один раз срабатывало переполнение. При отладке алгоритм работает правильно. Но в реале в прерывания переполнения не заходит. Тут проблема видимо в обработке прерываний и правилтноц последовательности. Захват срабатывает и перехватывает и переполнения не считает. Импульсы считает но не заходит в обработчик от переполнения, где подсчет переполнений ведется.
0
175 / 160 / 29
Регистрация: 14.02.2013
Сообщений: 1,365
20.11.2023, 17:58 8
dm_sinner, почитай
https://istarik.ru/blog/stm32/118.html
1
Маздаененавистник
430 / 586 / 77
Регистрация: 23.11.2021
Сообщений: 3,252
Записей в блоге: 4
20.11.2023, 19:58 9
Ну зачем там прерывания, если у таймеров есть и счетный вход, и вход compare-capture? [censored] портянки не читал, т.к. ничего в этой жути все равно не понять. Достаточно правильный код написать. Без этой дряни.
В простейшем случае, если импульсы - обычный меандр с 50% заполнением, достаточно их воткнуть на счетный вход и считать количество колебаний за определенное время (для этого нужно использовать связь со второго таймера; можно вообще вторым таймером при помощи DMA куда-то в буфер сохранять текущее значение CNT, а потом перезапускать ведомый таймер). Так как таймеры там всего-то 16-битные, то дальше 65535 досчитать не удастся → нужно перестраивать частоту ведущего таймера. Скажем, начать с малых времен - если насчитываем слишком мало, то увеличивать частоту вдвое, потом - еще раз вдвое, и так до тех пор, пока CNT ведомого не будет в интервале 20000..40000 - по этому числу и вычисляем частоту. Точность получим не хуже 0.01%.
1
175 / 160 / 29
Регистрация: 14.02.2013
Сообщений: 1,365
20.11.2023, 20:19 10
Eddy_Em, верно. Автор напихал в колбек переменных как фантиков, а ведь у этих несчастных STM очень медленная скорость работы с памятью.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef* htim)
{
    if(gu8_State == IDLE)
    {
        gu32_T1 = TIM14->CCR1; // Записываем значение CNT первого фронта
        gu16_TIM14_OVC = 0;
        gu8_State = DONE;
    }
    else if(gu8_State == DONE)
    {
        gu32_T2 = TIM14->CCR1; // Записываем значение CNT второго фронта
        gu32_Ticks = (gu32_T2 + (gu16_TIM14_OVC * 65536)) - gu32_T1; // Разница между двумя фронтами
        gu32_Freq = (uint32_t)(F_CLK/gu32_Ticks); // Частота следования импульсов
        if(gu32_Freq != 0)
        {
          sprintf(gu8_MSG, "Frequency = %lu Hz\n\r", gu32_Freq); // Вывод измеренной частоты в UART
          HAL_UART_Transmit(&huart1, gu8_MSG, sizeof(gu8_MSG), 100);
        }
        gu8_State = IDLE;
    }
}
1
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 13
20.11.2023, 22:27  [ТС] 11
Читал, и вроде как понятно, но что делать когда у тебя только один General-purpose таймер TIM14?

Добавлено через 2 минуты
Всем спасибо, ваши подсказки наталкивают на мысль. Буду разбираться. Напомню что у меня только один таймер, это General-purpose TIM14. Я так понял там не все фишки о которых вы пишите можно реализовать
0
Маздаененавистник
430 / 586 / 77
Регистрация: 23.11.2021
Сообщений: 3,252
Записей в блоге: 4
20.11.2023, 22:37 12
Цитата Сообщение от dm_sinner Посмотреть сообщение
когда у тебя только один General-purpose таймер TIM14
А куда остальные девались? Все заняты? В этом случае стоит выбрать другой микроконтроллер. TIM14 даже DMA пинать не умеет - нафиг этот график? А на прерывания такие накладные расходы, что даже на несчастной сотне килогерц МК будет большую часть времени в прерывании сидеть…

Не по теме:

Судя по стилю программирования, вы, батенька, или пытаетесь "галопом по Европам" войти в МК (не бывает такого!), или даже этого не пытаетесь!

0
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 13
21.11.2023, 11:54  [ТС] 13
Уважаемые форумчане. Спасибо за ваши ответы из которых я понял, что я ничего не знаю, не понимаю, пытаюсь "галопом по европам" войти в мир МК и т.п. Но дело в том, что я не пытаюсь войти в мир МК, по крайней мере сейчас. Сейчас мне необходимо решить конкретную задачу на конкретной железке на которой стоит конкретный микроконтроллер. Сигнал приходит на ножку pa4 которая подключена к TIM14_CH1. Или есть возможность завести сигнал на другие таймеры? Я просил совета как можно выйти из положения. Или не смогу я решить задачу? А то, что нужно сначала пойти учиться я знаю. Но времени нет заново все осваивать. К сожалению. От доброго совета не откажусь. Что дурак знаю сам. Спасибо
0
Маздаененавистник
430 / 586 / 77
Регистрация: 23.11.2021
Сообщений: 3,252
Записей в блоге: 4
21.11.2023, 12:33 14
Лучший ответ Сообщение было отмечено dm_sinner как решение

Решение

Цитата Сообщение от dm_sinner Посмотреть сообщение
как можно выйти из положения

Не по теме:

Дать по голове разработчику и заставить все переделывать нормально.
А вообще, очень интересненько получается: кто-то тяп-ляп что-то нарисовал и слился, а ТСа, похоже, заперли в подвале, морят голодом и заставляют криво спроектированную железку заставить работать, не давая ему права хотя бы дорожки подрезать скальпелем и перепаять жилками МГТФ так, как надо!



В общем, если нет схемотехника, то лучше сразу отказаться от выполнения этой задачи. Либо самому придется еще и схемы рисовать, платы разводить, паять прототипы…
Ну и да, если не хочется понимать, как там что работает, то лучше вообще уйти из этой области! Уж за использование HAL я своих студентов больно бью!
1
175 / 160 / 29
Регистрация: 14.02.2013
Сообщений: 1,365
21.11.2023, 12:34 15
Лучший ответ Сообщение было отмечено dm_sinner как решение

Решение

dm_sinner, в STM32CubeIDE переход по вектору прерывания происходит через жирную функцию которая тратит ресурсы МК на саму себя. По сути если бы перейти в прерывания как то сразу и в нем остановить регистр таймера потом просто поднять флаг и уже по этому флагу провести все расчёты в основном цикле программы.
1
175 / 160 / 29
Регистрация: 14.02.2013
Сообщений: 1,365
21.11.2023, 15:01 16
Есть mikroC PRO for ARM демо бесплатно. В ней есть ассистент создания точки входа прерывания по вектору без всякого мусора .
STM32F030C6T6 Режиме захвата

STM32F030C6T6 Режиме захвата


В
C
1
2
3
4
void Timer_14() iv IVT_INT_TIM14 ics ICS_AUTO 
{
 
}
Как раз только флагами дрыгать, остальную математику уже выполнять в
C
1
2
3
4
5
6
7
void main() 
{
while(1)
{
 
}
}
1
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 13
21.11.2023, 17:14  [ТС] 17
Спасибо. Может буду брать скальпель в руки Это будет наиболее простое решение. А разобраться конечно очень хочется. Просто не ожидал, что в моем распоряжении будет только 14й таймер . Спасибо.

Добавлено через 2 минуты
Товарищи, всем спасибо за помощь и подсказки. Буду пробовать решать задачу. Как решу отпишусь. Кстати пробовал реализовать код из RM. Тоже самое как и на HAL. Странно.
0
Маздаененавистник
430 / 586 / 77
Регистрация: 23.11.2021
Сообщений: 3,252
Записей в блоге: 4
21.11.2023, 17:58 18
dm_sinner, на сайте ST есть сниппеты для F0, сам пользуюсь (ну и у меня или других можно подсмотреть). Честная инициализация и работа с регистрами без убогих прослоек.
А то, что ST свой HAL продвигает, связано лишь с упертым мнением забугорных "товарищей", что каждый работник должен иметь крайне узкую специализацию и не лезть в поле другого (иначе он "лишает того работы"). Поэтому разработчик под МК обязан быть полным нулем в программировании и вместо решения задачи наиболее логичным способом, пользоваться чужими прослойками (которые сильно усложняют разработку, а тем более дальнейшую поддержку кода + заставляют под простые задачи выбирать значительно более дорогие МК).
0
175 / 160 / 29
Регистрация: 14.02.2013
Сообщений: 1,365
21.11.2023, 18:15 19
Eddy_Em, Но самое интересное ST обязана выпустить плагин, а лучше программку для конфигурации клока.
0
Маздаененавистник
430 / 586 / 77
Регистрация: 23.11.2021
Сообщений: 3,252
Записей в блоге: 4
21.11.2023, 18:43 20

Не по теме:

Цитата Сообщение от VladimirU Посмотреть сообщение
обязана
С чего бы гости понаехали?
ST обязана сопровождать свою продукцию подробной документацией. Всë — больше ничего она не обязана! А все эти [censored] (увы, меня тут банят за называние слов своими именами), что она впаривает, я считаю, мягко говоря, вредительством.



А, сорян, не понял сарказма…
0
21.11.2023, 18:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2023, 18:43
Помогаю со студенческими работами здесь

Таймер в режиме захвата
Пытаюсь запустить таймер в режиме захвата. Так как железа нету пока пользуюсь протеусом/иаром для...

Настройка таймера в режиме захвата STM32
Здравствуйте! Есть датчик холла, необходимо измерить частоту импульсов. Хочу настроить таймер 4 на...

Режим захвата
Подскажите, пожалуйста, доступен ли модуль захвата при работе Таймера1 (атмега328р)? Будет ли...

Режим захвата
Здравствуйте. В приложении режимы работы Таймера1 Atmega8. 1) В чем разница между режимами 10...

Почему не работает виртуальный компорт в режиме отладки, а в нормальном режиме работет
Процессор stm32f205. Подключаю плату (собственной разработки) к компу, определяется виртуальный...

Два роутера в режиме моста + usb камера в режиме флешки
Всем привет :-) вообщем у меня есть два роутера : zyxel keenetic 4g ii и huawei af23 и камера...

Различные значения ComboBox в режиме отладки и в режиме обычного запуска
public partial class MainWindow : Window { Random rnd; List<int> _lst; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru