|
STM32F103T8, Ride7, ШИМ на PB7 |
|
|
|
Aug 16 2010, 13:42
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930

|
Второй день маюсь. Не могу запустить ШИМ на ноге PB7. Что я делаю не так? Подскажите ,плиз!
Прикрепленные файлы
main.txt ( 1.33 килобайт )
Кол-во скачиваний: 77
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 28)
|
Aug 16 2010, 14:34
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
А включить таймер: Код RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; или Код RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE)... ?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 17 2010, 06:53
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930

|
Цитата(adnega @ Aug 17 2010, 12:46)  А в регистре RCC_APB2ENR бит AFIO_EN установлен? да
|
|
|
|
|
Aug 17 2010, 07:39
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Код #include "stm32f10x_map.h"
#define RCC_APB1ENR_TIM4EN ((u32)(2)) #define RCC_APB2ENR_IOPAEN ((u32)(2)) #define RCC_APB2ENR_IOPBEN ((u32)(3)) #define RCC_APB2ENR_AFIOEN ((u32)(0)) #define RCC_CFGR_ADCPRE ((u32)(14)) #define RCC_CFGR_PPRE1 ((u32)(8)) #define AF_PP_50 ((u32)(11)) #define CFG_PIN7 ((u32)(28)) #define TIM_CCER_CC1E ((u32)(0)) #define TIM_CCER_CC2E ((u32)(4)) #define OC_MODE_PWM1 ((u32)(6)) #define TIM_CCMR1_OC1M ((u32)(4)) #define TIM_CCMR1_OC2M ((u32)(12)) #define TIM_CR1_CEN ((u32)(0)) #define TIM_CR1_ARPE ((u32)(7))
int main() { RCC->AHBENR=0; RCC->APB1ENR= (1<<RCC_APB1ENR_TIM4EN); RCC->APB2ENR= (1<<RCC_APB2ENR_IOPAEN) |(1<<RCC_APB2ENR_IOPBEN) |(1<<RCC_APB2ENR_AFIOEN); RCC->CFGR= (3<<RCC_CFGR_ADCPRE) |(4<<RCC_CFGR_PPRE1);
GPIOB->CRL=(AF_PP_50<<CFG_PIN7); // T4_C2
TIM4->ARR=(12000000/75000)-1; // запись периода TIM4->PSC=0; // запись базы TIM4->CCR1=10; // длительность импульса DIM0 TIM4->CCR2=20; // длительность импульса DIM1 TIM4->CCER= (1<<TIM_CCER_CC1E) |(1<<TIM_CCER_CC2E); // разрешить первый и второй выходы сравнения TIM4->CCMR1= (OC_MODE_PWM1<<TIM_CCMR1_OC1M) // режим ШИМ для первого канала |(OC_MODE_PWM1<<TIM_CCMR1_OC2M); // режим ШИМ для второго канала TIM4->CNT=0; TIM4->CR2=0; TIM4->CR1= (1<<TIM_CR1_CEN) // разрешить счет |(1<<TIM_CR1_ARPE); // разрешить автоматическую перезагрузку
while(1); } В Keil даже симулируется... АХТУНГ! А есть ли четвертый таймер у 103T8?
|
|
|
|
|
Aug 17 2010, 08:03
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930

|
Цитата(AHTOXA @ Aug 17 2010, 13:49)  Нашёл ошибку: Код GPIOB->CRL=0x30000000;//альтерн.функция push-pull,PB7-50МГц, 0x3 - это просто output, а надо 0xB - альтернативный output. это я уже исправил. Все равно не помогает...
|
|
|
|
|
Aug 17 2010, 08:20
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(adnega @ Aug 17 2010, 13:39)  А есть ли четвертый таймер у 103T8? Вроде есть. Цитата(AndreyKeil @ Aug 17 2010, 14:03)  это я уже исправил. Все равно не помогает... В симуляторе или в реальном железе?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 17 2010, 08:42
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930

|
Цитата(AHTOXA @ Aug 17 2010, 14:20)  Вроде есть.
В симуляторе или в реальном железе? Не работает и в симуляторе, и в железе. Таймер4 есть.
|
|
|
|
|
Aug 17 2010, 09:03
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930

|
Цитата(AHTOXA @ Aug 17 2010, 14:55)  Покажите полный код, что есть сейчас. Вот
Прикрепленные файлы
mn.txt ( 9.57 килобайт )
Кол-во скачиваний: 133
|
|
|
|
|
Aug 17 2010, 09:23
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930

|
Цитата(AHTOXA @ Aug 17 2010, 15:14)  А куда делась строка Код RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); ? ...остальные: последний файл хеадер:
|
|
|
|
|
Aug 17 2010, 09:54
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
И, кстати, откуда вдруг появилась строка Код AFIO->MAPR|=0x00001000; ? Вам же не нужен ремап. Вы что, методом научного тыка пытаетесь запустить PWM?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 17 2010, 10:15
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930

|
Цитата(AHTOXA @ Aug 17 2010, 15:50)  Да не. Где вызов этой функции? В файле "stm32f10x_rcc" Цитата(AHTOXA) И, кстати, откуда вдруг появилась строка Код AFIO->MAPR|=0x00001000;
? Вам же не нужен ремап. Вы что, методом научного тыка пытаетесь запустить PWM? ...  я уж и не знаю что делать. Подозреваю, что что-то до настроек таймера не сделал. Цитата(adnega @ Aug 17 2010, 15:52)  Попробывал код из сообщения #8. Все работает и в симуляторе (Keil) и в железе (STM32F103T8U6)! здесь не полный код. Нет настроек каких-то,которые идут до таймера.
|
|
|
|
|
Aug 17 2010, 10:58
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(AndreyKeil @ Aug 17 2010, 14:15)  здесь не полный код. Нет настроек каких-то,которые идут до таймера. Здесь достаточный код для генерации ШИМ сигнала на ноге PB7 указанного МК) А Вы его уже запускали? Достаточно: 1. Включить тактовые частоты таймера, порта, альтернативных функций; 2. Настроить порт на альтернативную функцию; 3. Настроить таймер на генерацию ШИМ; 4. Зациклится на месте. 0. Не использовать библиотеку от ST (опционально)
|
|
|
|
|
Aug 17 2010, 11:30
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(AndreyKeil @ Aug 17 2010, 16:15)  В файле "stm32f10x_rcc" У-у-у, как всё запущено  В файле stm32f10x_rcc.c - не вызов, а определение этой функции. Давайте по порядку. Вот наш main(): Код void main() { // 1. Инициализируем клоки: RCC_Configuration();
// 2. Инициализируем контроллер прерываний: NVIC_Configuration();
// 3. Включаем порт B: RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
// 4. Включаем альтернативные функции: RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
// 5. Включаем таймер4: RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
// 6. Сконфигурируем ногу PB7 как альтернативный output: GPIOB->CRL=0xB0000000;
// 7. Теперь займёмся конфигурированием таймера: TIM4->CR1 = TIM_CR1_ARPE; // считаем вверх, автоперезагрузка, без делителя TIM4->CR2 = 0; // здесь ничего не нужно TIM4->ARR = 36; // период таймера TIM4->PSC = 0; // прескалер TIM4->EGR = TIM_EGR_UG; // обновим прескалер немедленно
// 8. А теперь сконфигурим 2й канал таймера: TIM4->CCER &= ~(TIM_CCER_CC2E | TIM_CCER_CC2P); // отключим вывод TIM4->CCR2 = 18; // период TIM4->CCMR1 = TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE; // PWM 1 (0x6000), предзагрузка; TIM4->CCER |= TIM_CCER_CC2E; // включаем вывод 2
// 9. И, наконец, запустим таймер: TIM4->CR1 |= TIM_CR1_CEN; } И всё!
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 17 2010, 20:15
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
А это - не то, что требуется? Код /******************************************************************************* * Function Name : RCC_SYSCLKConfig * Description : Configures the system clock (SYSCLK). * Input : - RCC_SYSCLKSource: specifies the clock source used as system * clock. This parameter can be one of the following values: * - RCC_SYSCLKSource_HSI: HSI selected as system clock * - RCC_SYSCLKSource_HSE: HSE selected as system clock * - RCC_SYSCLKSource_PLLCLK: PLL selected as system clock * Output : None * Return : None *******************************************************************************/ void RCC_SYSCLKConfig(u32 RCC_SYSCLKSource) { u32 tmpreg = 0;
/* Check the parameters */ assert(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource));
tmpreg = RCC->CFGR;
/* Clear SW[1:0] bits */ tmpreg &= CFGR_SW_Mask;
/* Set SW[1:0] bits according to RCC_SYSCLKSource value */ tmpreg |= RCC_SYSCLKSource;
/* Store the new value */ RCC->CFGR = tmpreg; }
--------------------
ASB
|
|
|
|
|
Aug 18 2010, 02:34
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
Цитата(Aleksandr Baranov @ Aug 17 2010, 16:15)  А это - не то, что требуется? Код /******************************************************************************* * Function Name : RCC_SYSCLKConfig * Description : Configures the system clock (SYSCLK). * Input : - RCC_SYSCLKSource: specifies the clock source used as system * clock. This parameter can be one of the following values: * - RCC_SYSCLKSource_HSI: HSI selected as system clock * - RCC_SYSCLKSource_HSE: HSE selected as system clock * - RCC_SYSCLKSource_PLLCLK: PLL selected as system clock * Output : None * Return : None *******************************************************************************/ void RCC_SYSCLKConfig(u32 RCC_SYSCLKSource) { u32 tmpreg = 0;
/* Check the parameters */ assert(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource));
tmpreg = RCC->CFGR;
/* Clear SW[1:0] bits */ tmpreg &= CFGR_SW_Mask;
/* Set SW[1:0] bits according to RCC_SYSCLKSource value */ tmpreg |= RCC_SYSCLKSource;
/* Store the new value */ RCC->CFGR = tmpreg; } И еще кусок из void RCC_DeInit(void): Код /* Set HSION bit */ RCC->CR |= (u32)0x00000001;
/* Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0] bits*/ RCC->CFGR &= 0xF8FF0000; /* Reset HSEON, CSSON and PLLON bits */ RCC->CR &= 0xFEF6FFFF;
--------------------
ASB
|
|
|
|
|
Aug 18 2010, 07:45
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930

|
Решил оставить в покое ШИМ и выдать простой меандр на ту же ножку PB7. Сконфигурил ее на выход и вот что получилось: ..и все равно не работает
Прикрепленные файлы
Aok_mn.txt ( 7.43 килобайт )
Кол-во скачиваний: 97
|
|
|
|
|
Aug 18 2010, 18:15
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930

|
Нашел ошибку У меня была строчка: GPIOB->CRL|=0xB0000000; //выход 50МГц, общее назначение вывода После сброса в регистре GPIOB_CRL не нулевое значение,поэтому я получал не то что хотел. Правильное значение: GPIOB->CRL=0xB0000000; //выход 50МГц, альтернативная функция push-pull. После этой строчки ШИМ появился. Большое спасибо всем ответившим за помощь!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|