|
STM32F303RE и его таймеры. |
|
|
|
Jul 4 2017, 12:50
|
Профессионал
    
Группа: Участник
Сообщений: 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] - для короткого!
|
|
|
|
2 страниц
< 1 2
|
 |
Ответов
(15 - 22)
|
Jul 25 2017, 14:25
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(scifi @ Jul 25 2017, 19:19)  А почему вы спрашиваете? А если серьёзно, что строим? Космический корабль или соковыжималку? Я ж не телепат  хочу пульт ИР декодировать. сделать что то вроде cnt_val = TIMx->CCRx - prev_cnt_val; prev_cnt_val = TIMx->CNT; нужно следить за переполнением TIMx->CNT
|
|
|
|
|
Jul 25 2017, 15:10
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jul 25 2017, 15:59
|
Профессионал
    
Группа: Участник
Сообщений: 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 фронте возникнет переполнение.
|
|
|
|
|
Jul 25 2017, 16:44
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Jenya7 @ Jul 25 2017, 18:59)  что то я не понял. допустим время между фронтами 120 а период таймера 500. на 5 фронте возникнет переполнение. К сведению: если счётчик имеет тип, например, uint16_t, и период счётчика равен 2^16, то разность между двумя его значениями, вычисленная по правилам языка Си и приведённая к тому же типу uint16_t, равна числу отсчётов между ними, если этих отсчётов было менее периода счётчика. И переполнение счётчика на это никак не влияет. Домашнее задание: возьмите бумагу, карандаш и проверьте сами.
|
|
|
|
|
Jul 26 2017, 06:01
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jul 26 2017, 06:41
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|