|
ШИМ в STM32F4 |
|
|
|
Aug 13 2012, 11:45
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 11-08-12
Пользователь №: 73 098

|
Всем привет!Битый час сижу и не могу настроить ШИМ( Пытаюсь настроить шим на ноге РА2, вроде все сделал как в даташите, но............. Код //***********TIM2*************** RCC->APB1ENR |=RCC_APB1ENR_TIM2EN; // тактирование таймера GPIOA->MODER |=0x4; TIM2->CR1 |= TIM_CR1_CMS; // выравнивание по центру TIM2->PSC = 16000-1; TIM2->ARR = 0xFF; // счетный регистр (период шима) TIM2->CCMR2 |= TIM_CCMR2_OC3CE; // ! TIM2->CCMR2 |= TIM_CCMR2_OC3M; // инвертированный шим TIM2->CCER |= TIM_CCER_CC3E; // разрешаем таймеру использование ШИМ TIM2->CR1 |= TIM_CR1_CEN; // запуск таймера TIM2->CR1 |= TIM_CR1_ARPE; // разрешаем перезагрузку ARR TIM2->CCR3 =0x1F; Я правильно понимаю?, чтобы запустить шим на ноге РА2(канал СН3) мне нужно работать с регистроми CCMR2, ну и CCR3 !
Сообщение отредактировал stm32f4 - Aug 13 2012, 11:47
|
|
|
|
|
 |
Ответов
|
Aug 13 2012, 15:22
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 11-08-12
Пользователь №: 73 098

|
Цитата(sidy @ Aug 13 2012, 19:21)  Тактирование порта GPIOA разрешено? угу)
|
|
|
|
|
Aug 13 2012, 15:33
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(stm32f4 @ Aug 13 2012, 19:22)  угу) Да ну! Можете прокомментировать назначение строчки Код GPIOA->MODER |=0x4; ? По-моему, ни к PA2, ни к выбору альтернативной функции она отношения не имеет...
|
|
|
|
|
Aug 13 2012, 16:11
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 11-08-12
Пользователь №: 73 098

|
Цитата(adnega @ Aug 13 2012, 19:33)  Да ну! Можете прокомментировать назначение строчки Код GPIOA->MODER |=0x4; ? По-моему, ни к PA2, ни к выбору альтернативной функции она отношения не имеет... ну что вы  я, конечно, совсем новичок, но тактирование порта я включать умею) Код RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; ну а по поводу регистра MODER я, таким образом, хотел наложить маску, дабы определить ногу PA2 как выход- хотя тут да!!!! протупил xDDD нужно было наложить 0х10 )Спасибо большое за замечание) Кстати по поводу регистра MODER, я в даташите не нашел указаний по поводу конфигурации ног порта, т.е ШИМ должен работать при любой конфигурации регистра MODER.
|
|
|
|
|
Aug 13 2012, 16:35
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(stm32f4 @ Aug 13 2012, 20:11)  ну что вы  я, конечно, совсем новичок, но тактирование порта я включать умею) Код RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; ну а по поводу регистра MODER я, таким образом, хотел наложить маску, дабы определить ногу PA2 как выход- хотя тут да!!!! протупил xDDD нужно было наложить 0х10 )Спасибо большое за замечание) Кстати по поводу регистра MODER, я в даташите не нашел указаний по поводу конфигурации ног порта, т.е ШИМ должен работать при любой конфигурации регистра MODER. Вы же аппаратный ШИМ от таймера решили задействовать? Тогда Вам нужно "Alternate function mode", а это маска (2 << (2 * 2)) == 0x20. И не забудьте GPIOA->AFRL = (1 << (2 * 4)) == 0x100. Рекомендую прочитать/посмотреть datasheet (DS) в районе 58 страницы. И Reference manual (RM) в районе 139 страницы (и ниже). PS. Советую неспеша разобраться с предметной областью самостоятельно, а не заводить "лишние" темы на форуме. Вопросы лучше задавать конкретные: хочу сделать то-то, делаю так-то, не получаетя. Проверьте досконально свой код на предмет опечаток, описок, соответствия DS и RM. До ШИМа каких-нить успехов достигли? Ну, там, светодиоды позажигать получилось ли...
|
|
|
|
|
Aug 14 2012, 09:24
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 11-08-12
Пользователь №: 73 098

|
Цитата(adnega @ Aug 13 2012, 20:35)  Вы же аппаратный ШИМ от таймера решили задействовать? Тогда Вам нужно "Alternate function mode", а это маска (2 << (2 * 2)) == 0x20. И не забудьте GPIOA->AFRL = (1 << (2 * 4)) == 0x100. Рекомендую прочитать/посмотреть datasheet (DS) в районе 58 страницы. И Reference manual (RM) в районе 139 страницы (и ниже).
PS. Советую неспеша разобраться с предметной областью самостоятельно, а не заводить "лишние" темы на форуме. Вопросы лучше задавать конкретные: хочу сделать то-то, делаю так-то, не получаетя. Проверьте досконально свой код на предмет опечаток, описок, соответствия DS и RM.
До ШИМа каких-нить успехов достигли? Ну, там, светодиоды позажигать получилось ли... Спасибо большое за дельные советы)Да я хочу задействовать аппаратный ШИМ. До ШИМ-а я вдоволь наигрался с светодиодами,более менее разобрался с некоторой периферией DAC, ADC, DMA, с некоторыми таймерами и прерываниями! Возвращаясь к настройке шим, я учел все ваши замечания и все равно-ничего( не могу понять что не так((( этж ШИМ проще некуда. вот весь листинг моего бреда, может вы найдете чтониб подозрительное! Код #include "stm32f4xx.h"
#define Led_Orange_On (GPIOD->BSRRL = GPIO_BSRR_BS_13) #define Led_Orange_Off (GPIOD->BSRRH = GPIO_BSRR_BS_13) #define Led_Green_On (GPIOD->BSRRL = GPIO_BSRR_BS_12) #define Led_Green_Off (GPIOD->BSRRH = GPIO_BSRR_BS_12) #define Led_Red_On (GPIOD->BSRRL = GPIO_BSRR_BS_14) #define Led_Red_Off (GPIOD->BSRRH = GPIO_BSRR_BS_14) #define Led_Blue_On (GPIOD->BSRRL = GPIO_BSRR_BS_15) #define Led_Blue_Off (GPIOD->BSRRH = GPIO_BSRR_BS_15)
static __IO uint32_t TimingDelay; static __IO uint32_t i; static __IO uint32_t dac; static __IO uint32_t dac_i; static __IO uint32_t value; //============================================================================== void SysTick_Handler (void) { if (TimingDelay) { TimingDelay--; } }
//============================================================================== void Delay_mS(uint32_t nTime) { TimingDelay = nTime;
while(TimingDelay); } void EXTI0_IRQHandler() { GPIOD->ODR^= (GPIO_BSRR_BS_13|GPIO_BSRR_BS_14|GPIO_BSRR_BS_15|GPIO_BSRR_BS_12); EXTI->PR|=0x01; //Очищаем флаг dac=dac+0x1F; DAC->DHR12R1 = dac; // загрузка данных в ЦАП1 DAC->SWTRIGR |= DAC_SWTRIGR_SWTRIG1; // программное события запуска }
void TIM7_IRQHandler() { TIM7->SR&= ~TIM_SR_UIF; //Сбрасываем флаг UIF GPIOD->ODR^=GPIO_BSRR_BS_13; //Инвертируем состояние светодиодов }
//============================================================================= //============================================================================= int main(void) {
SysTick_Config(SystemCoreClock/3000); while(1)
{ //***********GPIOA************** RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // GPIOA->MODER =0x0; //Input (reset state) GPIOA->OSPEEDR =0xFF; //100 MHz
//***********EXTI*************** SYSCFG->EXTICR[1] = 0x0; //перые 4 ноги для прерываний, порта А EXTI->IMR |=(EXTI_IMR_MR0); //разрешаем прерывание для нулевой ноги EXTI_IMR_MR0=1 EXTI->RTSR |=(EXTI_RTSR_TR0); //прерывания по спаду
//************NVIC************** // NVIC->ISER[0] |=(1<<6); //6 settable EXTI0 Line0 interrupt // NVIC->IP[1] =0xF000; //установка приоритета 15 для 6-й Position NVIC_EnableIRQ(EXTI0_IRQn); NVIC_SetPriority(EXTI0_IRQn,1);
//***********GPIOD************** RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; GPIOD->MODER =0x55000000; GPIOD->OSPEEDR =0xFFFF0000; //100 MHz GPIOD->ODR = 0xFFFF;
//***********DAC**************** RCC->APB1ENR |= RCC_APB1ENR_DACEN; // вкл. тактирование ЦАП DAC->CR |= DAC_CR_TEN1; // включение запуска от события, по умолчанию таймер 6 DAC->CR |= DAC_CR_MAMP1; // амплитуда на максимум DAC->CR |= DAC_CR_WAVE1_1; // вкл. генератор треуг. сигн. // DAC->CR |= DAC_CR_WAVE1_0; // вкл. генератор шума DAC->CR |= DAC_CR_EN1; // вкл. ЦАП 1
//***********TIM6*************** RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; // тактирование таймера TIM6->PSC = 0; // предделитель TIM6->ARR = 0xF; // переполнение TIM6->DIER |= TIM_DIER_UIE; // прерывание по переполнению // TIM6->DIER |= TIM_DIER_UDE; // влк. запуск ПДП TIM6->CR2 |= TIM_CR2_MMS_1; // ЦАП будет запускаться по переполнению TIM6->CR1 |= TIM_CR1_CEN; // запуск счета //****************************** //***********TIM7*************** RCC->APB1ENR |= RCC_APB1ENR_TIM7EN; // тактирование таймера TIM7->PSC = 16000-1; // предделитель TIM7->ARR = 1000; // переполнение TIM7->DIER |= TIM_DIER_UIE; // прерывание по переполнению // TIM7->DIER |= TIM_DIER_UDE; // влк. запуск ПДП //* TIM7->CR2 |= TIM_CR2_MMS_1; // ЦАП будет запускаться по переполнению TIM7->CR1 |= TIM_CR1_CEN; // запуск счета NVIC_EnableIRQ(TIM7_IRQn); //***********TIM2*************** RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // тактирование таймера GPIOA->MODER |= 0x20; // Alternate function mode GPIOA->AFR[1] |= (1 << (2 * 4)); // TIM2->CR1 |= TIM_CR1_CMS; // выравнивание по центру TIM2->PSC = 16000-1; TIM2->ARR = 1000; // счетный регистр (период шима) TIM2->CCMR2 |= TIM_CCMR2_OC3CE; // ! TIM2->CCMR2 |= TIM_CCMR2_OC3M; // инвертированный шим TIM2->CCER |= TIM_CCER_CC3E; // разрешаем таймеру использование ШИМ TIM2->CR1 |= TIM_CR1_CEN; // запуск таймера TIM2->CR1 |= TIM_CR1_ARPE; // разрешаем перезагрузку ARR TIM2->CCR3 =500;
//***********TIM12*************** RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; RCC->APB1ENR |= RCC_APB1ENR_TIM12EN; // тактирование таймера GPIOB->MODER |= (1<<(14*2+1)); // Alternate function mode GPIOB->AFR[2] |= (1 << (6 * 4)); // TIM12->PSC = 0x00A7; TIM12->ARR = 0x0FFF; // счетный регистр (период шима) TIM12->CCR1 = 0x050; TIM12->CCMR1 |= TIM_CCMR1_OC1M; // инвертированный шим TIM12->CCER |= TIM_CCER_CC1E; // разрешаем таймеру использование ШИМ TIM12->CR1 |= TIM_CR1_CEN; // запуск таймера
//****************************** uint32_t pwm[]={0,0,6553,13107,19660,26214,32768,39321,45875,52428,58982,65535}; while(i<6) { TIM2->CCR2=0x0F;
Led_Orange_On; Delay_mS(20);
Led_Orange_Off; Led_Red_On; Delay_mS(20);
Led_Red_Off; Led_Blue_On; Delay_mS(20);
Led_Blue_Off; Led_Green_On; Delay_mS(20);
Led_Green_Off; i++; }
while(i>0) {
Led_Green_On; Delay_mS(20);
Led_Green_Off; Led_Blue_On; Delay_mS(20);
Led_Blue_Off; Led_Red_On; Delay_mS(20);
Led_Red_Off; Led_Orange_On; Delay_mS(20);
Led_Orange_Off; i--; }
Delay_mS(9000); }
}
Сообщение отредактировал stm32f4 - Aug 14 2012, 09:26
|
|
|
|
Сообщений в этой теме
stm32f4 ШИМ в STM32F4 Aug 13 2012, 11:45 adnega КодGPIOA->AFR[1]
Нужно GPIOA->AFR[... Aug 14 2012, 09:39 stm32f4 Цитата(adnega @ Aug 14 2012, 13:39) КодGP... Aug 14 2012, 10:23  adnega Цитата(stm32f4 @ Aug 14 2012, 14:23) Воу,... Aug 14 2012, 11:25   stm32f4 Цитата(adnega @ Aug 14 2012, 15:25) Это н... Aug 14 2012, 12:58    adnega Цитата(stm32f4 @ Aug 14 2012, 16:58) Ого,... Aug 14 2012, 16:27     stm32f4 Цитата(adnega @ Aug 14 2012, 20:27) Может... Aug 15 2012, 10:50 BlackOps тут небольшой вопрос хотел бы уточнить, чтоб новой... Aug 23 2012, 05:11 BlackOps мне кажется что клок таймера ТИМ3 = клок периферии... Aug 23 2012, 06:23 adnega Цитата(BlackOps @ Aug 23 2012, 10:23) мне... Aug 23 2012, 07:08 BlackOps ясно, спасибо. Aug 23 2012, 07:13
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|