реклама на сайте
подробности

 
 
> STM32F303RE и его таймеры.
Jenya7
сообщение Jul 4 2017, 12:50
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



В документации таймеры представлены так
Цитата
Advanced-control timers (TIM1/TIM8/TIM20)
General-purpose timers (TIM2/TIM3/TIM4)
Basic timers (TIM6/TIM7)
General-purpose timers (TIM15/TIM16/TIM17)

Насчет таймера 20 есть заметка
Цитата
TIM20 is available on STM32F303xD/E and STM32F398xE devices only

У меня таки девайс STM32F303xE - STM32F303RE. Однако компайлер ругается на TIM20.
И он не определен
CODE
#define TIM2 ((TIM_TypeDef *) TIM2_BASE)
#define TIM3 ((TIM_TypeDef *) TIM3_BASE)
#define TIM4 ((TIM_TypeDef *) TIM4_BASE)
#define TIM6 ((TIM_TypeDef *) TIM6_BASE)
#define TIM7 ((TIM_TypeDef *) TIM7_BASE)
#define RTC ((RTC_TypeDef *) RTC_BASE)
#define WWDG ((WWDG_TypeDef *) WWDG_BASE)
#define IWDG ((IWDG_TypeDef *) IWDG_BASE)
#define I2S2ext ((SPI_TypeDef *) I2S2ext_BASE)
#define SPI2 ((SPI_TypeDef *) SPI2_BASE)
#define SPI3 ((SPI_TypeDef *) SPI3_BASE)
#define I2S3ext ((SPI_TypeDef *) I2S3ext_BASE)
#define USART2 ((USART_TypeDef *) USART2_BASE)
#define USART3 ((USART_TypeDef *) USART3_BASE)
#define UART4 ((USART_TypeDef *) UART4_BASE)
#define UART5 ((USART_TypeDef *) UART5_BASE)
#define I2C1 ((I2C_TypeDef *) I2C1_BASE)
#define I2C2 ((I2C_TypeDef *) I2C2_BASE)
#define CAN1 ((CAN_TypeDef *) CAN1_BASE)
#define PWR ((PWR_TypeDef *) PWR_BASE)
#define DAC ((DAC_TypeDef *) DAC_BASE)
#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE)
#define COMP ((COMP_TypeDef *) COMP_BASE)
#define COMP1 ((COMP_TypeDef *) COMP1_BASE)
#define COMP2 ((COMP_TypeDef *) COMP2_BASE)
#define COMP3 ((COMP_TypeDef *) COMP3_BASE)
#define COMP4 ((COMP_TypeDef *) COMP4_BASE)
#define COMP5 ((COMP_TypeDef *) COMP5_BASE)
#define COMP6 ((COMP_TypeDef *) COMP6_BASE)
#define COMP7 ((COMP_TypeDef *) COMP7_BASE)
#define OPAMP ((OPAMP_TypeDef *) OPAMP_BASE)
#define OPAMP1 ((OPAMP_TypeDef *) OPAMP1_BASE)
#define OPAMP2 ((OPAMP_TypeDef *) OPAMP2_BASE)
#define OPAMP3 ((OPAMP_TypeDef *) OPAMP3_BASE)
#define OPAMP4 ((OPAMP_TypeDef *) OPAMP4_BASE)
#define EXTI ((EXTI_TypeDef *) EXTI_BASE)
#define TIM1 ((TIM_TypeDef *) TIM1_BASE)
#define SPI1 ((SPI_TypeDef *) SPI1_BASE)
#define TIM8 ((TIM_TypeDef *) TIM8_BASE)
#define USART1 ((USART_TypeDef *) USART1_BASE)
#define TIM15 ((TIM_TypeDef *) TIM15_BASE)
#define TIM16 ((TIM_TypeDef *) TIM16_BASE)
#define TIM17 ((TIM_TypeDef *) TIM17_BASE)
#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE)
#define DMA1 ((DMA_TypeDef *) DMA1_BASE)
#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE)
#define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE)
#define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE)
#define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE)
#define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE)
#define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE)
#define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE)
#define DMA2 ((DMA_TypeDef *) DMA2_BASE)
#define DMA2_Channel1 ((DMA_Channel_TypeDef *) DMA2_Channel1_BASE)
#define DMA2_Channel2 ((DMA_Channel_TypeDef *) DMA2_Channel2_BASE)
#define DMA2_Channel3 ((DMA_Channel_TypeDef *) DMA2_Channel3_BASE)
#define DMA2_Channel4 ((DMA_Channel_TypeDef *) DMA2_Channel4_BASE)
#define DMA2_Channel5 ((DMA_Channel_TypeDef *) DMA2_Channel5_BASE)
#define RCC ((RCC_TypeDef *) RCC_BASE)
#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE)
#define OB ((OB_TypeDef *) OB_BASE)
#define CRC ((CRC_TypeDef *) CRC_BASE)
#define TSC ((TSC_TypeDef *) TSC_BASE)
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
#define ADC1 ((ADC_TypeDef *) ADC1_BASE)
#define ADC2 ((ADC_TypeDef *) ADC2_BASE)
#define ADC3 ((ADC_TypeDef *) ADC3_BASE)
#define ADC4 ((ADC_TypeDef *) ADC4_BASE)
#define ADC1_2 ((ADC_Common_TypeDef *) ADC1_2_BASE)
#define ADC3_4 ((ADC_Common_TypeDef *) ADC3_4_BASE)

Куда исчез TIM20?

Сообщение отредактировал IgorKossak - Jul 4 2017, 18:42
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 22)
Jenya7
сообщение Jul 25 2017, 14:25
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(scifi @ Jul 25 2017, 19:19) *
А почему вы спрашиваете?
А если серьёзно, что строим? Космический корабль или соковыжималку? Я ж не телепат laughing.gif

хочу пульт ИР декодировать.
сделать что то вроде
cnt_val = TIMx->CCRx - prev_cnt_val;
prev_cnt_val = TIMx->CNT;
нужно следить за переполнением TIMx->CNT
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 25 2017, 15:10
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Jenya7 @ Jul 25 2017, 17:25) *
cnt_val = TIMx->CCRx - prev_cnt_val;
prev_cnt_val = TIMx->CNT;
нужно следить за переполнением TIMx->CNT
Вот только
CODE
auto Tmp = TIMx->CCRx;
cnt_val = Tmp - prev_cnt_val;
prev_cnt_val = Tmp;
Если время между фронтами не превышает периода таймера - следить за переполнениями не нужно. Если превышает - заводим дополнительный счетчик и увеличиваем его в прерывании по переполнению.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 25 2017, 15:14
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Сергей Борщ @ Jul 25 2017, 18:10) *
заводим дополнительный счетчик и увеличиваем его в прерывании по переполнению.

Там бывают варианты, когда один таймер тактируется сигналом переполнения другого. В этом случае и прерывание не нужно.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 25 2017, 15:59
Сообщение #19


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Jul 25 2017, 20:10) *
Вот только
Код
auto Tmp = TIMx->CCRx;
cnt_val = Tmp - prev_cnt_val;
prev_cnt_val = Tmp;
Если время между фронтами не превышает периода таймера - следить за переполнениями не нужно. Если превышает - заводим дополнительный счетчик и увеличиваем его в прерывании по переполнению.

что то я не понял. допустим время между фронтами 120 а период таймера 500. на 5 фронте возникнет переполнение.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 25 2017, 16:44
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Jenya7 @ Jul 25 2017, 18:59) *
что то я не понял. допустим время между фронтами 120 а период таймера 500. на 5 фронте возникнет переполнение.

К сведению: если счётчик имеет тип, например, uint16_t, и период счётчика равен 2^16, то разность между двумя его значениями, вычисленная по правилам языка Си и приведённая к тому же типу uint16_t, равна числу отсчётов между ними, если этих отсчётов было менее периода счётчика. И переполнение счётчика на это никак не влияет. Домашнее задание: возьмите бумагу, карандаш и проверьте сами.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 25 2017, 21:27
Сообщение #21


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Jenya7 @ Jul 25 2017, 18:59) *
допустим время между фронтами 120 а период таймера 500. на 5 фронте возникнет переполнение.
чему будет равна разница между значениями?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 26 2017, 06:01
Сообщение #22


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(scifi @ Jul 25 2017, 21:44) *
К сведению: если счётчик имеет тип, например, uint16_t, и период счётчика равен 2^16, то разность между двумя его значениями, вычисленная по правилам языка Си и приведённая к тому же типу uint16_t, равна числу отсчётов между ними, если этих отсчётов было менее периода счётчика. И переполнение счётчика на это никак не влияет. Домашнее задание: возьмите бумагу, карандаш и проверьте сами.

таки да.

Цитата(Сергей Борщ @ Jul 26 2017, 02:27) *
чему будет равна разница между значениями?

в случае переполнения максимального значения это работает. но в данном случае будет 65156. хотя нет 100. счетчик сделает roll over и продолжит считать. значение до 480, значение после 100. 100-480=65156.
0xFFFF - 65156 даст нам разницу.

Сообщение отредактировал Jenya7 - Jul 26 2017, 06:13
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 26 2017, 06:41
Сообщение #23


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Jenya7 @ Jul 26 2017, 09:01) *
0xFFFF - 65156 даст нам разницу.

как-то сложно все и цифры, которых не было в условии. Период 500, переполнение на пятом фронте - значит prev_cnt_val = 500-5=495, TIMx->CCRx = 120-5=115. Итого 115-495=-380. -380 mod 500 = 120. Чтобы упростить вычисление остатка от деления, целесообразно брать период кратный степени двойки, например, в вашем случае, 512. Тогда prev_cnt_val = 512-5=507, TIMx->CCRx = 120-5=115, 115-507 = -392 = 0xF...FE78, 0xF...FE78 & 0x1FF = 0x78 = 120.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01431 секунд с 7
ELECTRONIX ©2004-2016