Цитата(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);
}
}