ขาย IC MC3PHACVPE MOTOR CONTROL SPEED CONTROL Tel 0838349010 สอบถามได้ครับ
3 phase motor control หรือที่เรื่อง Inverter
3 phase motor control หรือที่เรื่อง Inverter
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
Show posts Menu
#include"stm32f4xx.h"
void clock()
{
RCC->CFGR = 0;
RCC->CR = 0;
RCC->CFGR |= (RCC_CFGR_PPRE1_0|RCC_CFGR_PPRE1_DIV2|RCC_CFGR_PPRE2_DIV2);
RCC->CR |= RCC_CR_HSEON; // select HSE Xtal is main clock
while (!(RCC->CR & 0x00020000));// wait time to Xtal osc stability
RCC->PLLCFGR = (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0 |RCC_PLLCFGR_PLLSRC_HSE);
RCC->PLLCFGR |= (RCC_PLLCFGR_PLLN_8 |RCC_PLLCFGR_PLLN_6 |RCC_PLLCFGR_PLLN_4|RCC_PLLCFGR_PLLM_3);
RCC->CR |= RCC_CR_PLLON; // PLL On
while(!(RCC->CR & 0x02000000)); // Pll Stable
FLASH->ACR = 0x00000605; // Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // System PLL On
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait Pll On
}
int main(void)
{
clock();
/*---------STEP 1 Select TIMx_CH (See Data sheet Pin)--------------*/
/*--Example Select TIM3_CH1(GPIOC6),TIM3_CH2(GPIOC7),TIM3_CH3(GPIOC8),TIM3_CH4(GPIO9)--*/
/*---------STEP 2 Set GPIOx,TIMx and Open clock module--------------*/
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; // Open Clock GPIOC
// Select Pin Output (GPIOC.6,GPIOC.7,GPIOC.8,GPIOC.9)
GPIOC->MODER |= GPIO_MODER_MODER6_1|GPIO_MODER_MODER7_1|
GPIO_MODER_MODER8_1|GPIO_MODER_MODER9_1;
// Speed Pin Output (GPIOC.6,GPIOC.7,GPIOC.8,GPIOC.9)
GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6_0|GPIO_OSPEEDER_OSPEEDR7_0|
GPIO_OSPEEDER_OSPEEDR8_0|GPIO_OSPEEDER_OSPEEDR9_0;
GPIOC->PUPDR |= 0x00055000;
/*---------STEP 3 Set Alternate function Pin GPIO--------------*/
// Byte Low Function select (GPIOC.6,GPIOC.7) is AF2 of Timer3 Control Bit
GPIOC->AFR[0] |= 0x22000000;
// Byte High Function select (GPIOC.8,GPIOC.9)is AF2 of Timer3 Control Bit
GPIOC->AFR[1] |= 0x00000022;
/*---------STEP 4 Set TIMER--------------*/
RCC->APB1ENR |= (1<<1); // Open clock Timer3
TIM3->PSC = 100; // Prescale Fs/100 (Set Frequency PWM)
TIM3->ARR = 1000; // Counter/Resolution/(Set Frequency PWM)
//Resolution PWM *...ARR = 1000, PWM = 1000 Step
//Resolution PWM *...ARR = 100, PWM = 100 Step
//Resolution PWM *...ARR = 50, PWM = 50 Step
TIM3->EGR |= 1; // Up Counter
/*---------STEP 5 Set Wave form PWM at register CCMRx --------------*/
// Timer 3 Gen PWM comparator
TIM3->CCMR1 |= 0x6060; // Set PWM channel 1 and PWM Channel 2
TIM3->CCMR2 |= 0x6060; // Set PWM channel 3 and PWM Channel 4
/*---------STEP 6 Set Duty PWM --------------*/
TIM3->CCR1 = 800; // Set Duty PWM1 ( CCR1 <= ARR )
TIM3->CCR2 = 400; // Set Duty PWM2 ( CCR2 <= ARR )
TIM3->CCR3 = 200; // Set Duty PWM3 ( CCR3 <= ARR )
TIM3->CCR4 = 100; // Set Duty PWM4 ( CCR1 <= ARR )
TIM3->CCER |= 0x1111; // Enable PWM1,PWM2,PWM3,andPWM4
TIM3->CR1 |= 1; // Enable TIM3
while(1)
{
//code Program
}
}
#include"stm32f4xx.h"
void clock()
{
RCC->CFGR = 0;
RCC->CR = 0;
RCC->CFGR |= (RCC_CFGR_PPRE1_0|RCC_CFGR_PPRE1_DIV2|RCC_CFGR_PPRE2_DIV2);
RCC->CR |= RCC_CR_HSEON;
while (!(RCC->CR & 0x00020000));
RCC->PLLCFGR = (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0 |RCC_PLLCFGR_PLLSRC_HSE);
RCC->PLLCFGR |= (RCC_PLLCFGR_PLLN_8 |RCC_PLLCFGR_PLLN_6 |RCC_PLLCFGR_PLLN_4);
RCC->CR |= RCC_CR_PLLON;
while(!(RCC->CR & 0x02000000));
FLASH->ACR = 0x00000605;
RCC->CFGR |= 0x00000002;
while ((RCC->CFGR & 0x0000000F) != 0x0000000A);
}
void Set_GPIO()
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // Open Clock GPIOD
GPIOD->MODER |= GPIO_MODER_MODER15_1|GPIO_MODER_MODER14_1|
GPIO_MODER_MODER13_1|GPIO_MODER_MODER12_1;
GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR15_0|GPIO_OSPEEDER_OSPEEDR14_0|
GPIO_OSPEEDER_OSPEEDR13_0|GPIO_OSPEEDER_OSPEEDR12_0;
GPIOD->PUPDR |= 0x55000000;
GPIOD->AFR[0] |= 0;
GPIOD->AFR[1] |= 0x22220000;
}
void delay(long signed int sn)
{
while(sn--);
}
int main(void)
{
int Ln;
clock();
Set_GPIO();
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN ;
TIM4->PSC = 200; // Prescale Fs/100 (Set Frequency PWM)
TIM4->ARR = 100; // Counter/Resolution/(Set Frequency PWM)
TIM4->EGR |= 1; // Up Counter
TIM4->CCMR1 |= 0x6060; // Set PWM channel 1 and PWM Channel 2
TIM4->CCMR2 |= 0x6060; // Set PWM channel 3 and PWM Channel 4
TIM4->CCR1 = 0; // Set Duty PWM1 ( CCR1 <= ARR )
TIM4->CCR2 = 0; // Set Duty PWM2 ( CCR2 <= ARR )
TIM4->CCR3 = 0; // Set Duty PWM3 ( CCR3 <= ARR )
TIM4->CCR4 = 0; // Set Duty PWM4 ( CCR1 <= ARR )
TIM4->CCER |= 0x1111; // Enable PWM1,PWM2,PWM3,andPWM4
TIM4->CR1 |= 1; // Enable TIM4
while(1)
{
for(Ln=0;Ln<100;Ln++)
{
TIM4->CCR1 = Ln; // Set Duty PWM1 ( CCR1 <= ARR )
TIM4->CCR2 = Ln; // Set Duty PWM2 ( CCR2 <= ARR )
TIM4->CCR3 = Ln; // Set Duty PWM3 ( CCR3 <= ARR )
TIM4->CCR4 = Ln; // Set Duty PWM4 ( CCR1 <= ARR )
delay(40000);
}
for(Ln=100;Ln>0;Ln--)
{
TIM4->CCR1 = Ln; // Set Duty PWM1 ( CCR1 <= ARR )
TIM4->CCR2 = Ln; // Set Duty PWM2 ( CCR2 <= ARR )
TIM4->CCR3 = Ln; // Set Duty PWM3 ( CCR3 <= ARR )
TIM4->CCR4 = Ln; // Set Duty PWM4 ( CCR1 <= ARR )
delay(120000);
}
}
}
#include"stm32f4xx.h"
void clock()
{
RCC->CFGR = 0;
RCC->CR = 0;
RCC->CFGR |= (RCC_CFGR_PPRE1_0|RCC_CFGR_PPRE1_DIV2|RCC_CFGR_PPRE2_DIV2);
RCC->CR |= RCC_CR_HSEON;
while (!(RCC->CR & 0x00020000));
RCC->PLLCFGR = (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0 |RCC_PLLCFGR_PLLSRC_HSE);
RCC->PLLCFGR |= (RCC_PLLCFGR_PLLN_8 |RCC_PLLCFGR_PLLN_6 |RCC_PLLCFGR_PLLN_4);
RCC->CR |= RCC_CR_PLLON;
while(!(RCC->CR & 0x02000000));
FLASH->ACR = 0x00000605;
RCC->CFGR |= 0x00000002;
while ((RCC->CFGR & 0x0000000F) != 0x0000000A);
}
void Set_GPIO()
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // Open Clock GPIOD
GPIOD->MODER |= GPIO_MODER_MODER15_1|GPIO_MODER_MODER14_1|
GPIO_MODER_MODER13_1|GPIO_MODER_MODER12_1;
GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR15_0|GPIO_OSPEEDER_OSPEEDR14_0|
GPIO_OSPEEDER_OSPEEDR13_0|GPIO_OSPEEDER_OSPEEDR12_0;
GPIOD->PUPDR |= 0x55000000;
GPIOD->AFR[0] |= 0;
GPIOD->AFR[1] |= 0x22220000;
}
void delay(long signed int sn)
{
while(sn--);
}
int main(void)
{
clock();
Set_GPIO();
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN ;
TIM4->PSC = 200; // Prescale Fs/100 (Set Frequency PWM)
TIM4->ARR = 100; // Counter/Resolution/(Set Frequency PWM)
TIM4->EGR |= 1; // Up Counter
TIM4->CCMR1 |= 0x6060; // Set PWM channel 1 and PWM Channel 2
TIM4->CCMR2 |= 0x6060; // Set PWM channel 3 and PWM Channel 4
TIM4->CCR1 = 0; // Set Duty PWM1 ( CCR1 <= ARR )
TIM4->CCR2 = 0; // Set Duty PWM2 ( CCR2 <= ARR )
TIM4->CCR3 = 0; // Set Duty PWM3 ( CCR3 <= ARR )
TIM4->CCR4 = 0; // Set Duty PWM4 ( CCR1 <= ARR )
TIM4->CCER |= 0x1111; // Enable PWM1,PWM2,PWM3,andPWM4
TIM4->CR1 |= 1; // Enable TIM4
while(1)
{
for(TIM4->CCR1=0;TIM4->CCR1<100;TIM4->CCR1++) {delay(30000);}
for(TIM4->CCR2=0;TIM4->CCR2<100;TIM4->CCR2++) {delay(30000);}
for(TIM4->CCR3=0;TIM4->CCR3<100;TIM4->CCR3++) {delay(30000);}
for(TIM4->CCR4=0;TIM4->CCR4<100;TIM4->CCR4++) {delay(30000);}
for(TIM4->CCR1=100;TIM4->CCR1>0;TIM4->CCR1--) {delay(30000);}
for(TIM4->CCR2=100;TIM4->CCR2>0;TIM4->CCR2--) {delay(30000);}
for(TIM4->CCR3=100;TIM4->CCR3>0;TIM4->CCR3--) {delay(30000);}
for(TIM4->CCR4=100;TIM4->CCR4>0;TIM4->CCR4--) {delay(30000);}
}
}
#include"stm32f4xx.h"
void clock()
{
RCC->CFGR = 0;
RCC->CR = 0;
RCC->CFGR |= (RCC_CFGR_HPRE_DIV1|RCC_CFGR_PPRE1_DIV4|RCC_CFGR_PPRE2_DIV2);
RCC->CR |= RCC_CR_HSEON; // select HSE Xtal is main clock
while (!(RCC->CR & 0x00020000));// wait time to Xtal osc stability
RCC->PLLCFGR = (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0 |RCC_PLLCFGR_PLLSRC_HSE);
RCC->PLLCFGR |= (RCC_PLLCFGR_PLLN_8 |RCC_PLLCFGR_PLLN_6 |RCC_PLLCFGR_PLLN_4);
RCC->CR |= RCC_CR_PLLON; // PLL On
while(!(RCC->CR & 0x02000000)); // Pll Stable
FLASH->ACR = 0x00000605; // Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // System PLL On
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait Pll On
}
void Set_GPIO()
{
// Set Speed GPIOD is 100Mhz
GPIOD->OSPEEDR = 0xFFFF;
// Open clock to GPIOD
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIOCEN|RCC_AHB1ENR_GPIODEN;
// Set GPIO D.15,D.14,D.13,D.12 D.5 is Output
GPIOD->MODER = 0x55000400;
GPIOD->ODR = 0;
GPIOC->PUPDR = 0;
GPIOC->MODER = 0x00000300;
GPIOD->ODR = 0x20;
}
void adc_1(void)
{
//ADC configuration
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
ADC->CCR = ADC_CCR_ADCPRE_1;
ADC1->CR2 = ADC_CR2_ADON|ADC_CR2_EXTSEL|ADC_CR2_EXTEN;
ADC1->SQR3 = 14; //channel number 14 PC4 first conversion
}
void DAC_1(void)
{
RCC->APB1ENR |= RCC_APB1ENR_DACEN; // Open clock to Dac
DAC->CR |= DAC_CR_EN1|DAC_CR_EN2; // used Dac1 and Dac2
GPIOA->MODER |= 0x00000f00; // PA04, PA05 are analog outputs
}
void Tim2(long signed PSC2,long signed ARR2)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN ;
TIM2->PSC = PSC2;
TIM2->ARR = ARR2;
TIM2->SR &= ~TIM_SR_UIF ;
TIM2->DIER |= TIM_DIER_UIE ;
NVIC_EnableIRQ(TIM2_IRQn);
}
void TIM2_IRQHandler(void)
{
TIM2->SR = 0;
GPIOD->ODR ^= 0x20;
}
int main()
{
unsigned adc1;
clock();
Set_GPIO();
adc_1();
DAC_1();
Tim2(5000,500);
TIM2->CR1 = TIM_CR1_CEN;
while(1)
{
ADC1->CR2 |= ADC_CR2_SWSTART;
while((ADC1->SR & ADC_SR_EOC )==0);
ADC1->SR = 0;
adc1 = ADC1->DR;
DAC->DHR12R1 = adc1; //channel1 12bit shift to right
DAC->DHR12R2 = adc1; //channel2 12bit shift to right
if(adc1>800)
GPIOD->ODR |= 0x1000;
else
GPIOD->ODR &= 0xE0F0;
if(adc1>1600)
GPIOD->ODR |= 0x2000;
else
GPIOD->ODR &= 0xD0F0;
if(adc1>2400)
GPIOD->ODR |= 0x4000;
else
GPIOD->ODR &= 0xB0F0;
if(adc1>3200)
GPIOD->ODR |= 0x8000;
else
GPIOD->ODR &= 0x70F0;
}
}
#include"stm32f4xx.h"
unsigned int An[] = {0,71,142,214,285,356,428,499,569,640,711,781,851,921,990,1059,1128,1197,1265,1333,1400,1467,
1534,1600,1665,1730,1795,1859,1922,1985,2047,2109,2170,2230,2289,2348,2407,2464,2521,2577,2632,2686,2740,2792,2844,
2895,2945,2994,3043,3090,3136,3182,3226,3270,3312,3354,3394,3434,3472,3510,3546,3581,3615,3648,3680,3711,3740,3769,
3796,3823,3848,3871,3894,3916,3936,3955,3973,3990,4005,4019,4032,4044,4055,4064,4072,4079,4085,4089,4092,4094,4095,
4094,4092,4089,4085,4079,4072,4064,4055,4044,4032,4019,4005,3990,3973,3955,3936,3916,3894,3871,3848,3823,3796,
3769,3740,3711,3680,3648,3615,3581,3546,3510,3472,3434,3394,3354,3312,3270,3226,3182,3136,3090,3043,2994,2945,2895,
2844,2792,2740,2686,2632,2577,2521,2464,2407,2348,2289,2230,2170,2109,2047,1985,1922,1859,1795,1730,1665,1600,1534,
1467,1400,1333,1265,1197,1128,1059,990,921,851,781,711,640,569,499,428,356,285,214,142,71,0};
unsigned int Cn = 0;
void clock()
{
RCC->CFGR = 0;
RCC->CR = 0;
RCC->CFGR |= (RCC_CFGR_HPRE_DIV1|RCC_CFGR_PPRE1_DIV4|RCC_CFGR_PPRE2_DIV2);
RCC->CR |= RCC_CR_HSEON; // select HSE Xtal is main clock
while (!(RCC->CR & 0x00020000));// wait time to Xtal osc stability
RCC->PLLCFGR = (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0 |RCC_PLLCFGR_PLLSRC_HSE);
RCC->PLLCFGR |= (RCC_PLLCFGR_PLLN_8 |RCC_PLLCFGR_PLLN_6 |RCC_PLLCFGR_PLLN_4);
RCC->CR |= RCC_CR_PLLON; // PLL On
while(!(RCC->CR & 0x02000000)); // Pll Stable
FLASH->ACR = 0x00000605; // Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // System PLL On
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait Pll On
}
void delay(long signed count)
{
while(count--);
}
void Set_GPIO()
{
// Set Speed GPIOD is 100Mhz
GPIOD->OSPEEDR = 0xFFFF;
// Open clock to GPIOD
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIOCEN|RCC_AHB1ENR_GPIODEN;
// Set GPIO D.15,D.14,D.13,D.12 D.5 is Output
GPIOD->MODER = 0x55000400;
GPIOD->ODR = 0;
GPIOC->PUPDR = 0 ;
GPIOC->MODER = 0x00000300;
GPIOD->ODR = 0x20;
}
void DAC_1(void)
{
RCC->APB1ENR |= RCC_APB1ENR_DACEN;
DAC->CR |= DAC_CR_EN1|DAC_CR_EN2;
DAC->CR |= (DAC_CR_MAMP1_3|DAC_CR_MAMP1_2);
DAC->CR |= (DAC_CR_MAMP2_3|DAC_CR_MAMP2_2);
GPIOA->MODER |= 0x00000f00; // PA04, PA05 are analog outputs
}
void Tim2(long signed PSC2,long signed ARR2)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN ;
TIM2->PSC = PSC2;
TIM2->ARR = ARR2;
TIM2->SR &= ~TIM_SR_UIF ;
TIM2->DIER |= TIM_DIER_UIE ;
NVIC_EnableIRQ(TIM2_IRQn);
}
void TIM2_IRQHandler(void)
{
TIM2->SR = 0;
if(Cn<179)
{
DAC->DHR12R1 = An[Cn];
DAC->DHR12R2 = 0;
Cn += 1;
}
else
{
DAC->DHR12R2 = An[Cn-179];
DAC->DHR12R1 = 0;
Cn += 1;
if(Cn>355)
Cn = 0;
}
;
}
int main()
{
clock();
Set_GPIO();
DAC_1();
Tim2(0,42);
TIM2->CR1 = TIM_CR1_CEN;
while(1)
{
}
}
#include"stm32f4xx.h"
unsigned int An[] = {0,71,142,214,285,356,428,499,569,640,711,781,851,921,990,1059,1128,1197,1265,1333,1400,1467,
1534,1600,1665,1730,1795,1859,1922,1985,2047,2109,2170,2230,2289,2348,2407,2464,2521,2577,2632,2686,2740,2792,2844,
2895,2945,2994,3043,3090,3136,3182,3226,3270,3312,3354,3394,3434,3472,3510,3546,3581,3615,3648,3680,3711,3740,3769,
3796,3823,3848,3871,3894,3916,3936,3955,3973,3990,4005,4019,4032,4044,4055,4064,4072,4079,4085,4089,4092,4094,4095,
4094,4092,4089,4085,4079,4072,4064,4055,4044,4032,4019,4005,3990,3973,3955,3936,3916,3894,3871,3848,3823,3796,
3769,3740,3711,3680,3648,3615,3581,3546,3510,3472,3434,3394,3354,3312,3270,3226,3182,3136,3090,3043,2994,2945,2895,
2844,2792,2740,2686,2632,2577,2521,2464,2407,2348,2289,2230,2170,2109,2047,1985,1922,1859,1795,1730,1665,1600,1534,
1467,1400,1333,1265,1197,1128,1059,990,921,851,781,711,640,569,499,428,356,285,214,142,71,0};
unsigned int Cn = 0;
void clock()
{
RCC->CFGR = 0;
RCC->CR = 0;
RCC->CFGR |= (RCC_CFGR_HPRE_DIV1|RCC_CFGR_PPRE1_DIV4|RCC_CFGR_PPRE2_DIV2);
RCC->CR |= RCC_CR_HSEON; // select HSE Xtal is main clock
while (!(RCC->CR & 0x00020000));// wait time to Xtal osc stability
RCC->PLLCFGR = (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0 |RCC_PLLCFGR_PLLSRC_HSE);
RCC->PLLCFGR |= (RCC_PLLCFGR_PLLN_8 |RCC_PLLCFGR_PLLN_6 |RCC_PLLCFGR_PLLN_4);
RCC->CR |= RCC_CR_PLLON; // PLL On
while(!(RCC->CR & 0x02000000)); // Pll Stable
FLASH->ACR = 0x00000605; // Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // System PLL On
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait Pll On
}
void delay(long signed count)
{
while(count--);
}
void Set_GPIO()
{
// Set Speed GPIOD is 100Mhz
GPIOD->OSPEEDR = 0xFFFF;
// Open clock to GPIOD
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIOCEN|RCC_AHB1ENR_GPIODEN;
// Set GPIO D.15,D.14,D.13,D.12 D.5 is Output
GPIOD->MODER = 0x55000400;
GPIOD->ODR = 0;
GPIOC->PUPDR = 0 ;
GPIOC->MODER = 0x00000300;
GPIOD->ODR = 0x20;
}
void DAC_1(void)
{
RCC->APB1ENR |= RCC_APB1ENR_DACEN;
DAC->CR |= DAC_CR_EN1|DAC_CR_EN2;
DAC->CR |= (DAC_CR_MAMP1_3|DAC_CR_MAMP1_2);
DAC->CR |= (DAC_CR_MAMP2_3|DAC_CR_MAMP2_2);
GPIOA->MODER |= 0x00000f00; // PA04, PA05 are analog outputs
}
void Tim2(long signed PSC2,long signed ARR2)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN ;
TIM2->PSC = PSC2;
TIM2->ARR = ARR2;
TIM2->SR &= ~TIM_SR_UIF ;
TIM2->DIER |= TIM_DIER_UIE ;
NVIC_EnableIRQ(TIM2_IRQn);
}
void TIM2_IRQHandler(void)
{
TIM2->SR = 0;
if(Cn<179)
{
DAC->DHR12R1 = 2047+((An[Cn])/2);
DAC->DHR12R2 = DAC->DHR12R1;
Cn += 1;
}
else
{
DAC->DHR12R1 = 2047-((An[Cn-179])/2);
DAC->DHR12R2 = DAC->DHR12R1;
Cn += 1;
if(Cn>355)
Cn = 0;
}
;
}
int main()
{
clock();
Set_GPIO();
DAC_1();
Tim2(0,42);
TIM2->CR1 = TIM_CR1_CEN;
while(1)
{
}
}
[/b]
#include"stm32f4xx.h"
unsigned int An[] = {0,71,142,214,285,356,428,499,569,640,711,781,851,921,990,1059,1128,1197,1265,1333,1400,1467,
1534,1600,1665,1730,1795,1859,1922,1985,2047,2109,2170,2230,2289,2348,2407,2464,2521,2577,2632,2686,2740,2792,2844,
2895,2945,2994,3043,3090,3136,3182,3226,3270,3312,3354,3394,3434,3472,3510,3546,3581,3615,3648,3680,3711,3740,3769,
3796,3823,3848,3871,3894,3916,3936,3955,3973,3990,4005,4019,4032,4044,4055,4064,4072,4079,4085,4089,4092,4094,4095,
4094,4092,4089,4085,4079,4072,4064,4055,4044,4032,4019,4005,3990,3973,3955,3936,3916,3894,3871,3848,3823,3796,
3769,3740,3711,3680,3648,3615,3581,3546,3510,3472,3434,3394,3354,3312,3270,3226,3182,3136,3090,3043,2994,2945,2895,
2844,2792,2740,2686,2632,2577,2521,2464,2407,2348,2289,2230,2170,2109,2047,1985,1922,1859,1795,1730,1665,1600,1534,
1467,1400,1333,1265,1197,1128,1059,990,921,851,781,711,640,569,499,428,356,285,214,142,71,0};
unsigned int Cn = 0;
void clock()
{
RCC->CFGR = 0;
RCC->CR = 0;
RCC->CFGR |= (RCC_CFGR_HPRE_DIV1|RCC_CFGR_PPRE1_DIV4|RCC_CFGR_PPRE2_DIV2);
RCC->CR |= RCC_CR_HSEON; // select HSE Xtal is main clock
while (!(RCC->CR & 0x00020000));// wait time to Xtal osc stability
RCC->PLLCFGR = (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0 |RCC_PLLCFGR_PLLSRC_HSE);
RCC->PLLCFGR |= (RCC_PLLCFGR_PLLN_8 |RCC_PLLCFGR_PLLN_6 |RCC_PLLCFGR_PLLN_4);
RCC->CR |= RCC_CR_PLLON; // PLL On
while(!(RCC->CR & 0x02000000)); // Pll Stable
FLASH->ACR = 0x00000605; // Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // System PLL On
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait Pll On
}
void delay(long signed count)
{
while(count--);
}
void Set_GPIO()
{
// Set Speed GPIOD is 100Mhz
GPIOD->OSPEEDR = 0xFFFF;
// Open clock to GPIOD
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIOCEN|RCC_AHB1ENR_GPIODEN;
// Set GPIO D.15,D.14,D.13,D.12 D.5 is Output
GPIOD->MODER = 0x55000400;
GPIOD->ODR = 0;
GPIOC->PUPDR = 0 ;
GPIOC->MODER = 0x00000300;
GPIOD->ODR = 0x20;
}
void DAC_1(void)
{
RCC->APB1ENR |= RCC_APB1ENR_DACEN;
DAC->CR |= DAC_CR_EN1|DAC_CR_EN2;
DAC->CR |= (DAC_CR_MAMP1_3|DAC_CR_MAMP1_2);
DAC->CR |= (DAC_CR_MAMP2_3|DAC_CR_MAMP2_2);
GPIOA->MODER |= 0x00000f00; // PA04, PA05 are analog outputs
}
void Tim2(long signed PSC2,long signed ARR2)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN ;
TIM2->PSC = PSC2;
TIM2->ARR = ARR2;
TIM2->SR &= ~TIM_SR_UIF ;
TIM2->DIER |= TIM_DIER_UIE ;
NVIC_EnableIRQ(TIM2_IRQn);
}
void TIM2_IRQHandler(void)
{
TIM2->SR = 0;
if(Cn<179)
{
DAC->DHR12R1 = 2047+((An[Cn])/2);
DAC->DHR12R2 = 2047-((An[Cn])/2);
Cn += 1;
}
else
{
DAC->DHR12R1 = 2047-((An[Cn-179])/2);
DAC->DHR12R2 = 2047+((An[Cn-179])/2);
Cn += 1;
if(Cn>355)
Cn = 0;
}
;
}
int main()
{
clock();
Set_GPIO();
DAC_1();
Tim2(0,42);
TIM2->CR1 = TIM_CR1_CEN;
while(1)
{
}
}
#include"stm32f4xx.h"
int in = 0;
int b[]={0x8020,0x4020,0x2020,0x1020,0x20,0};
void clock(void)
{
RCC->CFGR = 0;
RCC->CR = 0;
RCC->CFGR |= 0x00009400;
RCC->CR |= RCC_CR_HSEON; // HSE Xtal On
while (!(RCC->CR & 0x00020000)); // wait Xtal osc stability
RCC->PLLCFGR = 0x07405408; // Set PLL M=8, N=336, P=2 ve Q=7
RCC->CR |= RCC_CR_PLLON; // PLL On
while(!(RCC->CR & 0x02000000)) // wait Pll on
FLASH->ACR = 0x00000605; // Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // System PLL On
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait Pll On
}
void delay(long signed count) // ฟังก์ชันหน่วงเวลา
{
while(count--);
}
void Set_GPIO()
{
// Set Speed GPIOD is 100Mhz
GPIOD->OSPEEDR = 0xFFFF;
// Open clock to GPIOD
RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN);
// Set GPIO D.15,D.14,D.13,D.12 is Output
GPIOD->MODER = (GPIO_OSPEEDER_OSPEEDR15_0 |GPIO_OSPEEDER_OSPEEDR14_0 |
GPIO_OSPEEDER_OSPEEDR13_0 |GPIO_OSPEEDER_OSPEEDR12_0 |
GPIO_OSPEEDER_OSPEEDR5_0);
GPIOA->PUPDR |= 0xFC;
GPIOA->MODER |= 0xFC; // Input รับค่า
}
void EXTI0_IRQHandler(void) // .....ลูปการเกิด interrupt External 0
{
EXTI->PR = EXTI_PR_PR0; //เคลียร์ค่าอินเตอร์รัป
GPIOD->ODR = b[in];
in = in+1;
if(in>5)
in = 0;
delay(1000); // หน่วงเวลาสำหรับ หน้าสำผัสสวิตสวิงเวลา กด-ปล่อย
}
int main(void)
{
clock();
Set_GPIO();
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN ; // ป้อนคล็อกให้กับระบบ External interrupt
EXTI->FTSR = EXTI_FTSR_TR0; // ตั้งให้รับการตรวจสอบขอบขาลงในช่องที่เลือก ทำงาน
EXTI->IMR = EXTI_IMR_MR0; // กำหนดช่องที่เลือกให้ทำงาน
NVIC_EnableIRQ(EXTI0_IRQn); // สั่งให้ Interrupt ทำงาน
while(1)
{
;
}
}
#include"stm32f4xx.h"
void clock(void)
{
RCC->CFGR = 0;
RCC->CR = 0;
RCC->CFGR |= 0x00009400;
RCC->CR |= RCC_CR_HSEON; // HSE Xtal On
while (!(RCC->CR & 0x00020000)); // wait Xtal osc stability
RCC->PLLCFGR = 0x07405408; // Set PLL M=8, N=336, P=2 ve Q=7
RCC->CR |= RCC_CR_PLLON; // PLL On
while(!(RCC->CR & 0x02000000)) // wait Pll on
FLASH->ACR = 0x00000605; // Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // System PLL On
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait Pll On
}
void GPIO(void)
{
// Set Speed GPIOD is 100Mhz
GPIOD->OSPEEDR = 0xFFFF;
// Open clock to GPIOD
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN|RCC_AHB1ENR_GPIODEN;
// Set GPIO D.15,D.14,D.13,D.12,D5 is Output
GPIOD->MODER = 0x55000400;
GPIOD->ODR = 0x20;
GPIOC->MODER |= 0x000003FF; // Set PC.0,PC.1,PC.2,PC.3,PC.4 is Analog input
//ch10->ADC1,ch11->ADC2,ch12->ADC3,
GPIOC->PUPDR = 0;
}
void adc1(void)
{
//ADC configuration
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN|RCC_APB2ENR_ADC2EN; // Open clock ADC1,ADC2
RCC->APB2ENR |= RCC_APB2ENR_ADC3EN; // Open clock ADC3
ADC->CCR = ADC_CCR_ADCPRE_1; // Prescale ADC
ADC1->CR2 = ADC_CR2_ADON|ADC_CR2_EXTSEL|ADC_CR2_EXTEN; // Set SWSTART Trig
ADC2->CR2 = ADC_CR2_ADON|ADC_CR2_EXTSEL|ADC_CR2_EXTEN; // Set SWSTART Trig
ADC3->CR2 = ADC_CR2_ADON|ADC_CR2_EXTSEL|ADC_CR2_EXTEN; // Set SWSTART Trig
}
int main()
{
clock();
GPIO();
adc1();
ADC1->SQR3 = 10; // ADC1--> CH10 PC.0
ADC2->SQR3 = 11; // ADC2--> CH11 PC.1
ADC3->SQR3 = 12; // ADC2--> CH12 PC.2
while(1)
{
ADC1->CR2 |= ADC_CR2_SWSTART; // ADC1 Tgir
ADC2->CR2 |= ADC_CR2_SWSTART; // ADC2 Tgir
ADC3->CR2 |= ADC_CR2_SWSTART; // ADC3 Tgir
while((ADC1->SR & ADC_SR_EOC )==0); //wait ADC1
while((ADC2->SR & ADC_SR_EOC )==0); //wait ADC2
while((ADC3->SR & ADC_SR_EOC )==0); //wait ADC3
ADC1->SR = 0;
ADC2->SR = 0;
ADC3->SR = 0;
if(ADC1->DR>2000) // ADC1
GPIOD->ODR |= 0x8020;
else
GPIOD->ODR &= 0x7F2F;
if(ADC2->DR>2000) // ADC2
GPIOD->ODR |= 0x4020;
else
GPIOD->ODR &= 0xBF2F;
if(ADC3->DR>2000) // ADC3
GPIOD->ODR |= 0x2020;
else
GPIOD->ODR &= 0xDF2F;
}
}
#include"stm32f4xx.h"
void clock(void)
{
RCC->CFGR = 0;
RCC->CR = 0;
RCC->CFGR |= 0x00009400;
RCC->CR |= RCC_CR_HSEON; // HSE Xtal On
while (!(RCC->CR & 0x00020000)); // wait Xtal osc stability
RCC->PLLCFGR = 0x07405408; // Set PLL M=8, N=336, P=2 ve Q=7
RCC->CR |= RCC_CR_PLLON; // PLL On
while(!(RCC->CR & 0x02000000)) // wait Pll on
FLASH->ACR = 0x00000605; // Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // System PLL On
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait Pll On
}
void GPIO(void)
{
// Set Speed GPIOD is 100Mhz
GPIOD->OSPEEDR = 0xFFFF;
// Open clock to GPIOD
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN|RCC_AHB1ENR_GPIODEN;
// Set GPIO D.15,D.14,D.13,D.12,D5 is Output
GPIOD->MODER = 0x55000400;
GPIOD->ODR = 0x20;
GPIOC->MODER |= 0x000003FF;
// Set PC.0,PC.1,PC.2,PC.3,PC.4 is Analog input
// ch10,ch11,ch12,ch13,ch14
GPIOC->PUPDR = 0;
}
void adc1(void)
{
//ADC configuration
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // Open clock ADC1
ADC->CCR = ADC_CCR_ADCPRE_1; //Prescale ADC
ADC1->CR2 = ADC_CR2_ADON|ADC_CR2_EXTSEL|ADC_CR2_EXTEN; // Set SWSTART Trig
ADC1->SQR3 = 14; //channel number 14 PC4 first conversion
}
int main()
{
clock();
GPIO();
adc1();
while(1)
{
ADC1->SQR3 = 14; // channel 14 input Analog
ADC1->CR2 |= ADC_CR2_SWSTART;
while((ADC1->SR & ADC_SR_EOC )==0);
ADC1->SR = 0;
if(ADC1->DR>2000)
GPIOD->ODR |= 0x8020;
else
GPIOD->ODR &= 0x7F2F;
ADC1->SQR3 = 13; // channel 13 input Analog
ADC1->CR2 |= ADC_CR2_SWSTART;
while((ADC1->SR & ADC_SR_EOC )==0);
ADC1->SR = 0;
if(ADC1->DR>2000)
GPIOD->ODR |= 0x4020;
else
GPIOD->ODR &= 0xBF2F;
ADC1->SQR3 = 12; // channel 12 input Analog
ADC1->CR2 |= ADC_CR2_SWSTART;
while((ADC1->SR & ADC_SR_EOC )==0);
ADC1->SR = 0;
if(ADC1->DR>2000)
GPIOD->ODR |= 0x2020;
else
GPIOD->ODR &= 0xDF2F;
ADC1->SQR3 = 11; // channel 11 input Analog
ADC1->CR2 |= ADC_CR2_SWSTART;
while((ADC1->SR & ADC_SR_EOC )==0);
ADC1->SR = 0;
if(ADC1->DR>2000)
GPIOD->ODR |= 0x1020;
else
GPIOD->ODR &= 0xEF2F;
ADC1->SQR3 = 10; // channel 10 input Analog
ADC1->CR2 |= ADC_CR2_SWSTART;
while((ADC1->SR & ADC_SR_EOC )==0);
ADC1->SR = 0;
if(ADC1->DR>2000)
GPIOD->ODR &= 0xFFDF;
else
GPIOD->ODR |= 0x20;
}
}
#include"stm32f4xx.h"
void clock(void)
{
RCC->CFGR = 0;
RCC->CR = 0;
RCC->CFGR |= 0x00009400;
RCC->CR |= RCC_CR_HSEON; // HSE Xtal On
while (!(RCC->CR & 0x00020000)); // wait Xtal osc stability
RCC->PLLCFGR = 0x07405408; // Set PLL M=8, N=336, P=2 ve Q=7
RCC->CR |= RCC_CR_PLLON; // PLL On
while(!(RCC->CR & 0x02000000)) // wait Pll on
FLASH->ACR = 0x00000605; // Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // System PLL On
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait Pll On
}
void GPIO(void)
{
// Set Speed GPIOD is 100Mhz
GPIOD->OSPEEDR = 0xFFFF;
// Open clock to GPIOD
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN|RCC_AHB1ENR_GPIODEN;
// Set GPIO D.15,D.14,D.13,D.12,D5 is Output
GPIOD->MODER = 0x55000400;
GPIOD->ODR = 0x20;
GPIOC->MODER |= 0x00000300; // เลือก PC.4 เป็นรับสัญญาณอะนาล็อก ตรงกับช่อง 14
GPIOC->PUPDR = 0;
}
void adc1(void)
{
//ADC configuration
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // Open clock ADC1
ADC->CCR = ADC_CCR_ADCPRE_1; // Prescale ADC
ADC1->CR2 = ADC_CR2_ADON|ADC_CR2_EXTSEL|ADC_CR2_EXTEN; // Set SWSTART Trig;
ADC1->SQR3 = 14; //เลือกช่องรับสัญญาณอะนาล็อกช่อง 14 (เปลี่ยนแปลงช่องได้)
}
int main()
{
clock(); // เซ็ทค็อก
GPIO(); // เซ็ทขา อินพุตอะนาล็อก เอาท์พุทดิจิตอล
adc1(); // เซ็ทการทำงานของ ADC1
while(1)
{
ADC1->CR2 |= ADC_CR2_SWSTART; // กระตุ้นให้ ADC1 ทำงาน
while((ADC1->SR & ADC_SR_EOC )==0); // รอ ADC1 ทำการแปลงสัญญาณให้เสร็จ
ADC1->SR = 0; // เคลียร์ค่าการแจ้งสภาวะทำงาน ADC1เสร็จภารกิจ
if(ADC1->DR<800)
GPIOD->ODR = 0x1020;
if((ADC1->DR<1600)&&(ADC1->DR>=800))
GPIOD->ODR = 0x2020;
if((ADC1->DR<2400)&&(ADC1->DR>=1600))
GPIOD->ODR = 0x4020;
if((ADC1->DR<3200)&&(ADC1->DR>=2400))
GPIOD->ODR = 0x8020;
if(ADC1->DR>3200)
GPIOD->ODR = 0;
}
}
#include"stm32f4xx.h"
void clock(void)
{
RCC->CFGR = 0;
RCC->CR = 0;
// RCC->CFGR = (RCC_CFGR_HPRE_DIV2|RCC_CFGR_PPRE1_DIV2|RCC_CFGR_PPRE2_DIV1|RCC_CFGR_SW_PLL|RCC_CFGR_SWS_PLL);
RCC->CFGR |= 0x00009400;
RCC->CR |= RCC_CR_HSEON; // HSE Xtal On
while (!(RCC->CR & 0x00020000)); // wait Xtal osc stability
RCC->PLLCFGR = 0x07405408; // Set PLL M=8, N=336, P=2 ve Q=7
RCC->CR |= RCC_CR_PLLON; // PLL On
while(!(RCC->CR & 0x02000000)) // wait Pll on
FLASH->ACR = 0x00000605; // Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // System PLL On
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait Pll On
}
void GPIO(void)
{
// Set Speed GPIOD is 100Mhz
GPIOD->OSPEEDR = 0xFFFF;
// Open clock to GPIOD
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN|RCC_AHB1ENR_GPIODEN;
// Set GPIO D.15,D.14,D.13,D.12,D5 is Output
GPIOD->MODER = 0x55000400;
GPIOD->ODR = 0x20;
GPIOC->MODER |= 0x00000300; // Set PC.4 is Analog input
GPIOC->PUPDR = 0;
}
void adc1(void)
{
//ADC configuration
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // Open clock ADC1
ADC1->CR1 |= ADC_CR1_EOCIE; // Interrupt ADC
ADC1->CR2 |= ADC_CR2_ADON|ADC_CR2_EXTSEL|ADC_CR2_EXTEN; // SWSTART Trig
NVIC_EnableIRQ(ADC_IRQn); // Interrupt Enable
}
void ADC_IRQHandler(void)
{
ADC1->SR = 0; // Clear Interrupt ADC
if(ADC1->DR<800)
GPIOD->ODR = 0x1020;
if((ADC1->DR<1600)&&(ADC1->DR>=800))
GPIOD->ODR = 0x2020;
if((ADC1->DR<2400)&&(ADC1->DR>=1600))
GPIOD->ODR = 0x4020;
if((ADC1->DR<3200)&&(ADC1->DR>=2400))
GPIOD->ODR = 0x8020;
if(ADC1->DR>3200)
GPIOD->ODR = 0;
ADC1->CR2 |= ADC_CR2_SWSTART; // Start ADC Convert
}
int main()
{
clock();
GPIO();
adc1();
ADC1->SQR3 = 14; //channel number 14 PC4
ADC1->CR2 |= ADC_CR2_SWSTART; // Start ADC
while(1)
{
// Code Program
}
}
#include"stm32f4xx.h"
unsigned int Cn = 0; // Counter
unsigned int Av = 0; // Average Value
unsigned int Dn[999]; // Keep Data 0...999 Point
long signed int Total = 0; // 32bit value
void clock(void)
{
RCC->CFGR = 0;
RCC->CR = 0;
// RCC->CFGR = (RCC_CFGR_HPRE_DIV2|RCC_CFGR_PPRE1_DIV2|RCC_CFGR_PPRE2_DIV1|RCC_CFGR_SW_PLL|RCC_CFGR_SWS_PLL);
RCC->CFGR |= 0x00009400;
RCC->CR |= RCC_CR_HSEON; // HSE Xtal On
while (!(RCC->CR & 0x00020000)); // wait Xtal osc stability
RCC->PLLCFGR = 0x07405408; // Set PLL M=8, N=336, P=2 ve Q=7
RCC->CR |= RCC_CR_PLLON; // PLL On
while(!(RCC->CR & 0x02000000)) // wait Pll on
FLASH->ACR = 0x00000605; // Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // System PLL On
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait Pll On
}
void GPIO(void)
{
// Set Speed GPIOD is 100Mhz
GPIOD->OSPEEDR = 0xFFFF;
// Open clock to GPIOD
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN|RCC_AHB1ENR_GPIODEN;
// Set GPIO D.15,D.14,D.13,D.12,D5 is Output
GPIOD->MODER = 0x55000400;
GPIOD->ODR = 0x20;
GPIOC->MODER |= 0x00000300; // Set PC.4 is Analog input
GPIOC->PUPDR = 0;
}
void adc1(void)
{
//ADC configuration
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // Open clock ADC1
ADC1->CR1 |= ADC_CR1_EOCIE; // Interrupt ADC
ADC1->CR2 |= ADC_CR2_ADON|ADC_CR2_EXTSEL|ADC_CR2_EXTEN; // SWSTART Trig
NVIC_EnableIRQ(ADC_IRQn); // Interrupt Enable
}
void ADC_IRQHandler(void)
{
ADC1->SR = 0; // Clear Interrupt ADC
Dn[Cn] = ADC1->DR; // Storage Value Point
Av = (Av+ADC1->DR)/2; // Average and Storage Value
Total = Total+Dn[Cn]; // Storage sum Value
Cn += 1; // Increment pointer
if(Cn>999)
{
Cn = 0;
Total = Total/1000; // Average sum Value
DAC->DHR12R1 = Av; // Show Dc Average DAC1
DAC->DHR12R2 = Total;// Show Dc Average sum Value DAC2
}
ADC1->CR2 |= ADC_CR2_SWSTART; // Start ADC Convert
}
void DAC_1(void)
{
RCC->APB1ENR |= RCC_APB1ENR_DACEN;
DAC->CR |= DAC_CR_EN1|DAC_CR_EN2;
DAC->CR |= (DAC_CR_MAMP1_3|DAC_CR_MAMP1_2);
DAC->CR |= (DAC_CR_MAMP2_3|DAC_CR_MAMP2_2);
GPIOA->MODER |= 0x00000f00; // PA04, PA05 are analog outputs
}
int main()
{
clock();
GPIO();
adc1();
DAC_1();
ADC1->SQR3 = 14; //channel number 14 PC4
ADC1->CR2 |= ADC_CR2_SWSTART; // Start ADC
while(1)
{
// Code Program
}
}
#include"stm32f4xx.h"
void clock()
{
RCC->CFGR = 0;
RCC->CR = 0;
RCC->CFGR |= (RCC_CFGR_PPRE1_0|RCC_CFGR_PPRE1_DIV2|RCC_CFGR_PPRE2_DIV2);
RCC->CR |= RCC_CR_HSEON; // select HSE Xtal is main clock
while (!(RCC->CR & 0x00020000));// wait time to Xtal osc stability
RCC->PLLCFGR = (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0
|RCC_PLLCFGR_PLLSRC_HSE);
RCC->PLLCFGR |= (RCC_PLLCFGR_PLLN_8 |RCC_PLLCFGR_PLLN_6 |RCC_PLLCFGR_PLLN_4);
RCC->CR |= RCC_CR_PLLON; // PLL On
while(!(RCC->CR & 0x02000000)); // Pll Stable
FLASH->ACR = 0x00000605; // Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // System PLL
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait Pll
}
void Tim1(long signed PSC1,long signed ARR1)
{
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN
TIM1->ARR = ARR1; // ค่านับเก็บได้ 16bit ค่า
TIM1->PSC = PSC1; // ค่าปรีสเกล ปรับได้ 16 bit ค่า
TIM1->SR &= ~TIM_SR_UIF ;
TIM1->DIER |= TIM_DIER_UIE ;
NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
}
void Tim2(long signed PSC2,long signed ARR2)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN ;
TIM2->ARR = ARR2; // ค่านับเก็บได้ 16/32bit ค่า
TIM2->PSC = PSC2; // ค่าปรีสเกล ปรับได้ 16 bit ค่า
TIM2->SR &= ~TIM_SR_UIF ;
TIM2->DIER |= TIM_DIER_UIE ;
NVIC_EnableIRQ(TIM2_IRQn);
}
void Tim3(long signed PSC3,long signed ARR3)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN ;
TIM3->ARR = ARR3; // ค่านับเก็บได้ 16bit ค่า
TIM3->PSC = PSC3; // ค่าปรีสเกล ปรับได้ 16 bit ค่า
TIM3->SR &= ~TIM_SR_UIF ;
TIM3->DIER |= TIM_DIER_UIE ;
NVIC_EnableIRQ(TIM3_IRQn);
}
void Tim4(long signed PSC4,long signed ARR4)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN ;
TIM4->ARR = ARR4; // ค่านับเก็บได้ 16bit ค่า
TIM4->PSC = PSC4; // ค่าปรีสเกล ปรับได้ 16 bit ค่า
TIM4->SR &= ~TIM_SR_UIF ;
TIM4->DIER |= TIM_DIER_UIE ;
NVIC_EnableIRQ(TIM4_IRQn);
}
void Tim5(long signed PSC5,long signed ARR5)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM5EN ;
TIM5->ARR = ARR5; // ค่านับเก็บได้ 16bit ค่า
TIM5->PSC = PSC5; // ค่าปรีสเกล ปรับได้ 16 bit ค่า
TIM5->SR &= ~TIM_SR_UIF ;
TIM5->DIER |= TIM_DIER_UIE ;
NVIC_EnableIRQ(TIM5_IRQn);
}
void Set_GPIO()
{
// Set Speed GPIOD is 100Mhz
GPIOD->OSPEEDR = 0xFFFF;
// Open clock to GPIOD
RCC->AHB1ENR |= 0x08;
// Set GPIO D.15,D.14,D.13,D.12,D.5 is Output
GPIOD->MODER = 0x55000400;
GPIOD->ODR = 0x20; // ให้ LED ดับหมด หมายเหตุ LED D.5 แอททีฟ โล
}
//....................Loop Timer1........................................
void TIM1_UP_TIM10_IRQHandler(void)
{
TIM1->SR &= 0;
GPIOD->ODR ^=0x20;
}
//....................Loop Timer2........................................
void TIM2_IRQHandler(void)
{
TIM2->SR &= 0;
GPIOD->ODR ^=0x8000;
}
//....................Loop Timer3........................................
void TIM3_IRQHandler(void)
{
TIM3->SR &= 0;
GPIOD->ODR ^=0x4000;
}
//....................Loop Timer4........................................
void TIM4_IRQHandler(void)
{
TIM4->SR &= 0;
GPIOD->ODR ^=0x2000;
}
//....................Loop Timer5........................................
void TIM5_IRQHandler(void)
{
TIM1->SR &= 0;
GPIOD->ODR ^=0x1000;
}
int main(void)
{
clock();
Set_GPIO();
Tim1(5000,2000); // Bus Clock 84Mhz (5000 ค่าปรีสเกลหรือตัวหาร , 2000 ค่าตัวนับ)
Tim2(5000,2000); // Bus Clock 42Mhz (5000 ค่าปรีสเกลหรือตัวหาร , 2000 ค่าตัวนับ)
Tim3(5000,4000); // Bus Clock 42Mhz (5000 ค่าปรีสเกลหรือตัวหาร , 4000 ค่าตัวนับ)
Tim4(5000,8000); // Bus Clock 42Mhz (5000 ค่าปรีสเกลหรือตัวหาร , 8000 ค่าตัวนับ)
Tim5(5000,16000); // Bus Clock 42Mhz (5000 ค่าปรีสเกลหรือตัวหาร , 16000 ค่าตัวนับ)
TIM1->CR1 = TIM_CR1_CEN; // Timer1 ทำงาน
TIM2->CR1 = TIM_CR1_CEN; // Timer2 ทำงาน
TIM3->CR1 = TIM_CR1_CEN; // Timer3 ทำงาน
TIM4->CR1 = TIM_CR1_CEN; // Timer4 ทำงาน
TIM5->CR1 = TIM_CR1_CEN; // Timer5 ทำงาน
while(1)
{
;
}
}
#include"stm32f4xx.h"
void clock()
{
RCC->CFGR = 0;
RCC->CR = 0;
RCC->CFGR |= (RCC_CFGR_PPRE1_0|RCC_CFGR_PPRE1_DIV2|RCC_CFGR_PPRE2_DIV2);
RCC->CR |= RCC_CR_HSEON; // select HSE Xtal is main clock
while (!(RCC->CR & 0x00020000));// wait time to Xtal osc stability
RCC->PLLCFGR = (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0
|RCC_PLLCFGR_PLLSRC_HSE);
RCC->PLLCFGR |= (RCC_PLLCFGR_PLLN_8 |RCC_PLLCFGR_PLLN_6 |RCC_PLLCFGR_PLLN_4
|RCC_PLLCFGR_PLLM_3);
RCC->CR |= RCC_CR_PLLON; // PLL On
while(!(RCC->CR & 0x02000000)); // Pll Stable
FLASH->ACR = 0x00000605; // Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // System PLL
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait Pll
}
void Tim1(long signed PSC1,long signed ARR1)
{
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN ;
TIM1->ARR = ARR1; // ค่านับเก็บได้ 16bit ค่า
TIM1->PSC = PSC1; // ค่าปรีสเกล ปรับได้ 16 bit ค่า
TIM1->SR &= ~TIM_SR_UIF ;
TIM1->DIER |= TIM_DIER_UIE ;
NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
}
void Set_GPIO()
{
// Set Speed GPIOD is 100Mhz
GPIOD->OSPEEDR = 0xFFFF;
// Open clock to GPIOD
RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN);
// Set GPIO D.15,D.14,D.13,D.12 is Output
GPIOD->MODER = (GPIO_OSPEEDER_OSPEEDR15_0 |GPIO_OSPEEDER_OSPEEDR14_0 |
GPIO_OSPEEDER_OSPEEDR13_0 |GPIO_OSPEEDER_OSPEEDR12_0);
}
void TIM1_UP_TIM10_IRQHandler(void) // ลูปการเกิดเหตุการอินเตอร์รัป
{
TIM1->SR & = 0; //เคลียร์ค่ารีจีสเตอร์ อินเตอร์รัป
GPIOD->ODR ^= 0xF000; // Code ทำงาน กลับสภาวะ LED
}
int main(void)
{
clock();
Set_GPIO();
Tim1(5000,3000); // ตั้งค่า ปรีสเกลหาร และ ค่านับ ปรับเปลี่ยนค่า หลักพัน ดูการกระพริบ LED
TIM1->CR1 = TIM_CR1_CEN; // เปิดการอินเตอร์รัป Timer1
while(1)
{
;
}
}
#include"stm32f4xx.h"
void clock()
{
RCC->CFGR = 0;
RCC->CR = 0;
RCC->CFGR |= (RCC_CFGR_PPRE1_0|RCC_CFGR_PPRE1_DIV2|RCC_CFGR_PPRE2_DIV2);
RCC->CR |= RCC_CR_HSEON; // select HSE Xtal is main clock
while (!(RCC->CR & 0x00020000));// wait time to Xtal osc stability
RCC->PLLCFGR = (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0
|RCC_PLLCFGR_PLLSRC_HSE);
RCC->PLLCFGR |= (RCC_PLLCFGR_PLLN_8 |RCC_PLLCFGR_PLLN_6 |RCC_PLLCFGR_PLLN_4
|RCC_PLLCFGR_PLLM_3);
RCC->CR |= RCC_CR_PLLON; // PLL On
while(!(RCC->CR & 0x02000000)); // Pll Stable
FLASH->ACR = 0x00000605; // Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // System PLL
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait Pll
}
void Set_GPIO()
{
// Set Speed GPIOD is 100Mhz
GPIOD->OSPEEDR = 0xFFFF;
// Open clock to GPIOD
RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN);
// Set GPIO D.15,D.14,D.13,D.12 is Output
GPIOD->MODER = (GPIO_OSPEEDER_OSPEEDR15_0 |GPIO_OSPEEDER_OSPEEDR14_0 |
GPIO_OSPEEDER_OSPEEDR13_0 |GPIO_OSPEEDER_OSPEEDR12_0);
// Set GPIOA is input
GPIOA->PUPDR |= 0xFC; Pa.0 is input
GPIOA->MODER |= 0xFC;
}
int main(void)
{
clock();
Set_GPIO();
while(1)
{
if(GPIOA->IDR & GPIO_IDR_IDR_0) // ถ้า PA.0 เป็น 1 :LED ติดหมดสี่ดวง
GPIOD->ODR = 0xF000;
if(!(GPIOA->IDR & GPIO_IDR_IDR_0)) // ถ้า PA.0 เป็น 0 :LED ดับหมดสี่ดวง
GPIOD->ODR = 0;
}
}
#include"stm32f4xx.h"
void delay(long signed count) // ฟังก์ชันหน่วงเวลา
{
while(count--);
}
void clock() // ฟังก์ชัน ฐานเวลา
{
RCC->CFGR = RCC_CFGR_HPRE_DIV1|RCC_CFGR_PPRE1_DIV4|RCC_CFGR_PPRE2_DIV2 ;
RCC->CR = 0;
RCC->CR |= RCC_CR_HSEON; // ให้ HSE Xtal เป็น ฐานเวลาหลัก
while (!(RCC->CR & 0x00020000));// รอเวลาให้ Xtal osc ทำงาน
RCC->PLLCFGR = (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0
|RCC_PLLCFGR_PLLSRC_HSE);
RCC->PLLCFGR |= (RCC_PLLCFGR_PLLN_8 |RCC_PLLCFGR_PLLN_6 |RCC_PLLCFGR_PLLN_4);
// เซ็ทค่าความถี่ และตัวคูณต่าง ดูข้อมูลใน Ref-manual stm32f407xx
// หัวข้อการเซ็ทอัป system clock
RCC->CR |= RCC_CR_PLLON; // สั่งให้ตัวคูณ PLL ทำงาน
while (!(RCC->CR & 0x02000000)); // รอจนกว่า PLL พร้อมทำงาน
FLASH->ACR = 0x00000605; // จัดเวลา Flash ROM is 5 Wait state
RCC->CFGR |= 0x00000002; // เลือกสัญญาณหลัก System PLL On
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // รอระบบ Wait system Pll พร้อมทำงาน
}
int main(void) // ฟังก์ชันโปรแกรมหลัก
{
clock();
GPIOD->OSPEEDR = 0xFFFF; // Set Speed GPIOD is 100Mhz
RCC->AHB1ENR |= 0x08; // Open clock to GPIOD
GPIOD->MODER = (GPIO_OSPEEDER_OSPEEDR15_0 |GPIO_OSPEEDER_OSPEEDR14_0 |
GPIO_OSPEEDER_OSPEEDR13_0 |GPIO_OSPEEDER_OSPEEDR12_0);
// Set GPIO D.15,D.14,D.13,D.12 is Output
while(1) // ลูปวนค่าไม่รู้จบ
{
GPIOD->ODR ^= 0xF000; // กลับค่าจากค่าเดิมก่อนหน้านี้
delay(50000000);
}
}
#include"stm32f4xx.h"
void Set_GPIO()
{
// Set Speed GPIOD is 100Mhz
GPIOD->OSPEEDR = 0xFFFF;
// Open clock to GPIOD
RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN);
// Set GPIO D.15,D.14,D.13,D.12 is Output
GPIOD->MODER = (GPIO_OSPEEDER_OSPEEDR15_0 |GPIO_OSPEEDER_OSPEEDR14_0 |
GPIO_OSPEEDER_OSPEEDR13_0 |GPIO_OSPEEDER_OSPEEDR12_0);
// Set GPIOA is input
GPIOA->PUPDR = 0;
GPIOA->MODER = 0;
}
int main(void)
{
Set_GPIO();
while(1)
{
if(GPIOA->IDR & GPIO_IDR_IDR_0)
GPIOD->ODR = 0xF000;
if(!(GPIOA->IDR & GPIO_IDR_IDR_0))
GPIOD->ODR = 0;
}
}