Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
1

STM32F051R8T6 - Режим захвата

06.05.2016, 12:52. Просмотров 1063. Ответов 5
Метки нет (Все метки)

Ранее была реализована процедуры обработки посылки по "воздуху" от датчика, при помощи базового таймера и прерывания. Сейчас хотелось бы усвоить, как правильно реализовать тоже самое но при помощи режима захвата. Выкладываю часть программа, отвечающая за захват, при дебагинге обнаружил что в CCR1 данные о приходе импульса не записываются, импульс подается на канал 1 таймера TIM3 (вывод PA6). Что в коде может быть не так?

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
volatile unsigned int capture1, capture2, capture_period;
volatile int capture_ready; 
int n=0;
 
void tim_cc(void)
{
    RCC->APB1ENR|=RCC_APB1ENR_TIM3EN;
    TIM3->PSC=47;
    TIM3->ARR=65535;
    TIM3->CCMR1|=TIM_CCMR1_CC1S_0;
    TIM3->CCMR1|=(TIM_CCMR1_IC1F_0|TIM_CCMR1_IC1F_1);
    TIM3->CCMR1|=TIM_CCMR1_CC1S_0;//Выбор*активного*входа. TIM_Channel1
    TIM3->CCMR1|=(TIM_CCMR1_IC1F_0|TIM_CCMR1_IC1F_1);
    TIM3->CCER&=~TIM_CCER_CC1P;//По*переднему*фронту***положительный*перепад*импульса
    TIM3->CCMR1&=~TIM_CCMR1_IC1PSC;//Предделитель*отключен
    TIM3->CCER|=TIM_CCER_CC1E;//Разрешен*захват*значения*счетчика*в*регистр*TIM3_CCR1
    TIM3->DIER|=TIM_DIER_CC1IE;//Разрешена*генерация*прерывания*при*захвате
    TIM3->CR1|=TIM_CR1_CEN;//Запускаем*счет*таймера
    TIM3->DIER |= TIM_DIER_UIE; //разрешаем прерывание от таймера
 
    NVIC_SetPriority(TIM3_IRQn , 2);
    NVIC_EnableIRQ(TIM3_IRQn);
 
}
 
void TIM3_IRQHandler(void)
{
    if(!n)
        {
        capture1=TIM3->CCR1;
        n=~n;
        }
    else
        {
        capture2=TIM3->CCR1;
        n=~n;
        }
    TIM3->SR &= ~(TIM_SR_CC1OF | TIM_SR_CC1IF); /* Clear the flags */   
}
Хотелось бы хотя бы просто измерять периоды (для начала)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2016, 12:52
Ответы с готовыми решениями:

Таймер счетчик, режим захвата
Здравствуйте, помогите решить задачку. Настраиваю таймер 3 на захват...

Таймер режим захвата помогите разобраться
Здравствуйте! В общем хоть подать шим сигнал на вход МК, но если честно не...

STM32f051r8t6 +UART
Здравствуйте, Коллеги. Не так давно начал изучение микроконтроллера STM32. У...

Питание STM32F051R8T6 и её обвязка
Привет всем! Есть вопрос, строил одну приблуду на базе STM32F0DISCOVERY с...

STM32F051R8T6 + NOKIA 1202, NOKIA1616 (EXAMPLE)
Подключил дисплейчик привожу код, кому то пригодится. Подключен к SPI1. CS и...

5
Voland_
1689 / 1034 / 97
Регистрация: 04.01.2010
Сообщений: 3,484
06.05.2016, 14:09 2
позволю предположить, что строчка:
C
1
TIM3->CCER&=~TIM_CCER_CC1P;//По*переднему*фронту***положительный*перепад*импульса
делает не совсем то, что ожидается.
И да, я не совсем понял где у вас происходит инициализация ножки МК.
И еще непонятно зачем вы дублируете запись в CMR1 два раза. В этом есть какой-то специальный смысел?

ЗЫ: и я бы использовал структуры из SDK для инита таймера. Там уже давно выверены все нужные для его работы параметры. К чему по 10 раз перепроверять значение регистров из мануала, которые вам нужно выставить?
1
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
06.05.2016, 14:50  [ТС] 3
Выверяю для того чтобы лучше понять правильность своих действий. Насчет инициализации ножки, как правильно ее инициализировать?

C++
1
2
3
4
5
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
Или как альтернативную функцию. насчет, вроде все правильно - захват по фронту.
C++
1
TIM3->CCER&=~TIM_CCER_CC1P;//По*переднему*фронту***положительный*перепад*импульса
По-поводу задублированности - моя не внимательность!

Добавлено через 12 минут
Разобрался, будут дальше вопросы - задам. Огромное спасибо за наводку!

C++
1
2
3
4
5
6
    GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
0
Voland_
1689 / 1034 / 97
Регистрация: 04.01.2010
Сообщений: 3,484
06.05.2016, 18:56 4
Цитата Сообщение от GaFBich Посмотреть сообщение
захват по фронту.
это я у вас тоже в коментах вычитал. Просто мне непонятным стала именно операция исключения маски битов REG &=~BIT ...) которая должна как раз выключать что-то... а она у вас включает. Рыться в даташите нет интереса. Раз работает, значит все ОК ).
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
08.05.2016, 23:09  [ТС] 5
Помоги разобраться с возникшей проблемой, настраивал периферию при помощи Stm32Cube. Устройство работает от частоты 48MHz. подаю меандр на ножку PA8 (TIM1 канал 1) c частотой 2.6kHz (период 380мкс), не могу измерить данный период. Захват по фронту. Ниже привожу код и данные при отладке:

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
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx_hal.h"
 
/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim1;
 
UART_HandleTypeDef huart1;
 
volatile unsigned long capture1,capture2,capture_period;
int n=0;
 
union
{
    unsigned long cap;
    unsigned char data[2];
}pack;
 
 
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
 
/* USER CODE END PV */
 
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM1_Init(void);
static void MX_USORT1_UART_Init(void);
 
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
 
 
 
int main(void)
{
 
 
 
  /* MCU Configuration----------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* Configure the system clock */
  SystemClock_Config();
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_USORT1_UART_Init();
 
  while (1)
  {
 
  }
 
 
}
 
/** System Clock Configuration
*/
void SystemClock_Config(void)
{
 
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;
 
  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;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);
 
  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;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
 
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USORT1;
  PeriphClkInit.Usart1ClockSelection = RCC_USORT1CLKSOURCE_PCLK1;
  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
 
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
 
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
 
  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
 
/* TIM1 init function */
void MX_TIM1_Init(void)
{
 
  TIM_SlaveConfigTypeDef sSlaveConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_IC_InitTypeDef sConfigIC;
 
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 47;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 65535;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  HAL_TIM_Base_Init(&htim1);
 
  HAL_TIM_IC_Init(&htim1);
 
  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
  sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
  sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
  sSlaveConfig.TriggerFilter = 0;
  HAL_TIM_SlaveConfigSynchronization(&htim1, &sSlaveConfig);
 
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
 
  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
  sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  sConfigIC.ICFilter = 0;
  HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_1);
    TIM1->CCMR1|=(1<<5)|(1<<4);
    TIM1->CCER&=~TIM_CCER_CC1P;
    TIM1->CCER|=TIM_CCER_CC1E;
    TIM1->DIER|=TIM_DIER_CC1IE;
    TIM1->CR1|=TIM_CR1_CEN;
}
 
/* USORT1 init function */
void MX_USORT1_UART_Init(void)
{
 
  huart1.Instance = USORT1;
  huart1.Init.BaudRate = 9600;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  HAL_UART_Init(&huart1);
 
}
 
void MX_GPIO_Init(void)
{
 
  GPIO_InitTypeDef GPIO_InitStruct;
 
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOF_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
 
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET);
 
  /*Configure GPIO pins : PC8 PC9 */
  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  
      /**TIM1 GPIO Configuration    
    PA8     ------> TIM1_CH1 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
    /* Peripheral interrupt init */
    HAL_NVIC_SetPriority(TIM1_CC_IRQn, 2, 0);
    HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);
 
}
 
 
void TIM1_CC_IRQHandler(void)
{
    
    
    if(!n)
    {
        HAL_NVIC_DisableIRQ(TIM1_CC_IRQn);
        capture1=HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_1);
        n=~n;
    }
    else
    {
        HAL_NVIC_DisableIRQ(TIM1_CC_IRQn);
        capture2=HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_1);
        if(capture2>capture1)capture_period=capture2-capture1;
            else capture_period=capture1-capture2;
        pack.cap=capture_period;
 
        n=~n;
        TIM1->SR &= ~(TIM_SR_CC1OF | TIM_SR_CC1IF); /* Clear the flags */
    }
 
        HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);
        HAL_TIM_IRQHandler(&htim1);
}
0
Миниатюры
STM32F051R8T6 - Режим захвата  
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
08.05.2016, 23:54  [ТС] 6
Проблема была в
C++
1
2
3
4
5
  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
  sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
  sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
  sSlaveConfig.TriggerFilter = 0;
  HAL_TIM_SlaveConfigSynchronization(&htim1, &sSlaveConfig);
Исключил из кода - все нормально!
0
08.05.2016, 23:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2016, 23:54

STM32F0DISCOVERY (STM32F051R8T6) настройка таймера и реализации такта в 1 мкс
Необходимо настроить таймер и получить временную границу между тиками таймера в...

STM32F0DISCOVERY (STM32F051R8T6) Внешнее прерывание на PA1
Проблема с настройкой внешнего прерывания на PA1 Настройки прерывания: ...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru