Show Posts

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.


Topics - deejun

Pages: [1] 2 3
1
ขาย IC MC3PHACVPE   MOTOR CONTROL  SPEED CONTROL :D   Tel 0838349010 สอบถามได้ครับ
3 phase motor control  หรือที่เรื่อง Inverter

2
ในครั้งนี้มาทำการเรียนรู้ STM32F103  กัน  ตัวอ้างอิงของผมเป็น STM32F103VBT6  ขนาดหน่วยความจำโปรแกรม  128K
ความถี่  72Mhz   ใครที่ใช้ เบอร์อื่นก็แก้ไขเล้กน้อยตามสเป็ค MCU แต่คำสั่งหลายๆอย่างคล้ายๆกันครับ

เริ่มแรกในบทนี้ก็เหมือนเดิม  ให้สร้าง Folderใหม่ขึ้นมา  ตั้งชื้อตามความต้องการของผู้ใช้ สมมุติในบทนี้ผมจะใช้ Clock
ผมสร้าง Floder ชื่อ Clock  และไปทำการก๊อปปี้  File ชื่อ system_stm32f10x.c กับ stm32f10x.h
เข้ามาไว้ใน Floder Clock ที่เร้าสร้างขึ้นมา  เวลาเราก๊อปปี้ ทั้งFloder ไปที่ไหน จะได้ไม่มีปัญหา หา File พวกนี้ไม่เจอ

system_stm32f10x.c  ก็อปมาได้จาก        C:\Keil\ARM\INC\ST\STM32F10x
stm32f10x.h               ก็อปมาได้จาก        C:\Keil\ARM\Startup\ST\STM32F10x

เมื่อมี 2 File นี้ก็เตรียมพร้อม สร้างโปรเจคได้เลย

เปิด Keil เลือกเบอร์ MCU ที่ท่านใช้   ในที่นี้เป็น  stm32f103vb  ครับ  ใครใช้นอกเหนือนี้ก็เปลี่ยนค่าเบอร์เอาครับ
เมื่อเลือกได้แล้ว  โปแกรมจะถามว่าให้แอดเอา startup_stm32f10x.s เข้ามาไว้ในFloder ด้วยมั๊ย  ตอบเลย Yes
ถ้าตอบ No ท่านจะต้องไปก็อปมาใหม่ใน C:\Keil\ARM\Startup\ST\STM32F10x มิเช่นนั้นจะใช้งานมิได้น่ะครับ

เมื่อทำการแอดเสร็จก็เป็นอันเตรียมตัวเขียนโปรแกรมต่อไป   ในช่วงที่จะเริ่มเขียนก็มีคำแนะนำอีกนึดนะครับว่า
STM3210x มันมีหลายซีเรีย จะแบ่งตามขนาดของหน่วยความจำ ซึ่งเราจะต้องรู้ด้วยว่า MCU ที่เราใช้เนี่ยอะ
มันเป็นซีเรียไหน  .......ก็ดูได้จาก Data sheet ของมันอะ  ดูตามต้นไม้  ปะแป้ง ก็ไม่เห็นเลข เอ้ยไม่เห็น รุ่น
น่ะครับ   มาถึงตรงนี้ใจเย็นๆ อย่าพึ่งถอนใจ  ว่ายุ่งยาก  ถ้าเริ่มสัปสนพัก 10 นาทีเดี๋ยวมาต่อกัน
แว๊ปผ่านไป 10 นาที ไวอย่างจรวจ น้ำ  เมื่อเริ่มไม่เข้าใจ หรือเข้าใจ ไม่เป็นไร  มาต่อกัน  ......................
ในรุ่นอ้างอิงผม  stm32f103vb ของผมเป็น MD มิเดียมคือค่าของหน่วยความจำขนาด กลางซึ่งในรุ่นF1 จะมีซีเรียดังนี้

STM32F10X_LD                  =               STM32 Low density devices
STM32F10X_LD_VL            =               STM32 Low density Value Line devices
STM32F10X_MD                 =               STM32 Medium density devices
STM32F10X_MD_VL           =               STM32 Medium density Value Line devices
STM32F10X_HD                 =               STM32 High density devices
STM32F10X_HD_VL           =               STM32 High density value line devices
STM32F10X_XL                  =               STM32 XL-density devices
STM32F10X_CL                  =               STM32 Connectivity line devices */

ดังนั้นมันมีความสำคัญม๊ากมากน่ะครับ เราจะต้องรู้ว่า MCUที่เราใช้เป็นรุ่นได 
stm32f103vbt6  นี้ตรงกับ    STM32F10X_MD  ครับ  เมื่อเรารู้แล้วก็จะให้กดคีย์  Alt+F7พร้อมกันครับ
กดเลยครับ ผมรู้ท่านยังไม่กด กดซะ เดี๋ยวเราจะไปต่อไม่ได้  อะไม่มีไรเกิดขึ้น......ก็เปิดหน้า Keil ก่อนกดครับ
เปิดหน้าเว๊ปนี้กดไม่มีอะไรเกิดขึ้นแน่ๆ  เมื่อเปิด Keil แล้วกด Alt+F7 จะเกิดบล็อกชื่อOption for targetขึ้นม
ให้เลือกหัวข้อชื่อ  C/C++ คลิ๊กเข้าไป จะเห็นมีบล็อกและช่องว่างๆและรายละเอียดขึ้นมา
ในช่องบนสุดแรกที่ชื่อ  Define  และทางขวามือเป็นช่องว่างๆสีขาวให้ใส่รุ่นของ MCU เข้าไปครับ
ในที่นี้เป็นพิมพ์ว     STM32F10X_MD ลงไปเป็นอันสร็จการเลือกรุ่น MCU ถ้าเป็นเบอร์อื่นให้ดูว่าเบอร์นั้นไปตกรุ่นไหน
ก็ใส่ชื่อรุ่นลงไปครับ

ส่วนค่าอื่นๆให้ศึกษาเอาจาก Web keil การใช้งาน หรือที่เคยอ้างอิงไว้หลายลิงค์ก่อนหน้านี้ใน STM32F4 ได้แนบไว้ถ้าไม่เข้าใจก็หา
ศึกษาเพิ่มการใช้ Keil  เพราะต่อจากนี้เราจะไม่พูดเรื่องการ Setup Keil แล้ว เราจะไปต่อที่ตัว MCU เลยครับ

เมื่อทำตามมาถึงตรงนี้เราก็พร้อมเดินเครื่องกันได้เลยครับ  ตรงนี้ขอจบไว้ก่อนที่การ  Setup Keil ก่อนเขียนโปรแกรม
 











3
1      สร้าง Floder ชื่อ PWM ขึ้นมา
2      ทำการเพื่ม File  system_stm32f4xx.c และ stm32f4xx.hไว้ใน Floder
3      ทำการสร้างโปรเจคใหม่ เลือก เบอร์ IC stm32f407VG และให้ ADD File startup_stm32f4.s
        เข้ามาด้วย  เพื่อที่จะได้ไม่ต้องไปก๊อปมาจาก Lib st ให้ยุ่งยากอีก  ความสำคัญคือมันจะช่วยจัดการค่า
        เบื้องต้นให้กับ IC ให้พร้อมรับการโปรแกรมและการทำงาน ถ้าไม่มี  MCU จะ compiler ไม่ผ่าน
4     เขียนClode และ save โปรเจคเป็นนามสกุล .C
/***************************************************************/
การสร้าง PWM แบบง่ายๆครับลองศึกษาโค๊ดตัวอย่างดูครับ ได้อธิบายเป็นสเต็ปไว้แล้ว จะได้ผลยิ่งนักให้ดู
ที่ Register ที่ใช้งานประกอบคำบรรยายของ Reference Manual RM0090ครับ จะได้ผลชะงัดแล

เอาท์พุตดูที่ขา GPIOC6 , GPIOC7, GPIOC8 , GPIOC9
Code: [Select]
#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
                       }
}



/*************************************************************************************/
ตัวอย่างที่ 2 เป็นการขับ PWM 4 ช่องออกทาง   LED4 ดวง   PD15,PD14,PD13,PD12  แสดงความสว่างไล่ละดับแสง

Code: [Select]
#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);

                                  }

}
}


/************************************************************************/

ตัวอย่างที่ 3 ไฟวิ่งแบบ PWM

Code: [Select]
#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);}
}
}

4
STM32F4 discovery  โดย keil เรื่อง การใช้ DAC  และ การใช้ โมดูล ที่ผ่านๆมาใช้งานร่วม เช่น Timer , ADC เป็นต้น

1      สร้าง Floder ชื่อ ADC10_14 ขึ้นมา
2      ทำการเพื่ม File  system_stm32f4xx.c และ stm32f4xx.hไว้ใน Floder
3      ทำการสร้างโปรเจคใหม่ เลือก เบอร์ IC stm32f407VG และให้ ADD File startup_stm32f4.s
                                                    เข้ามาด้วย  เพื่อที่จะได้ไม่ต้องไปก๊อปมาจาก Lib st ให้ยุ่งยากอีก  ความสำคัญคือมันจะช่วยจัดการค่า
                                                    เบื้องต้นให้กับ IC ให้พร้อมรับการโปรแกรมและการทำงาน ถ้าไม่มี  MCU จะ compiler ไม่ผ่าน
4     เขียนClode และ save โปรเจคเป็นนามสกุล .C
**************************************************
DAC  เริ่มที่หน้า  311/1422  ของ Reference-Manual stm32F4xx
รีจีสเตอร์ที่ควรศึกษา

DAC control register      DAC_CR
DAC control register      DAC_SWTRIGR
DAC control register      DAC_DHR12R1
DAC control register      DAC_DHR12L1
DAC control register      DAC_DHR8R1
DAC control register      DAC_DHR12R2
DAC control register      DAC_DHR12L2
DAC control register      DAC_DHR8R2
DAC control register      DAC_DHR12RD
DAC control register      DAC_DHR12LD
DAC control register      DAC_DHR8RD
DAC control register      DAC_DOR1
DAC control register      DAC_DOR2
DAC control register      DAC_SR

DAC register map          หน้า  329/1422
*********************************************************

เอาท์พุตของ DAC1 และ DAC2 จะอยู่ที่ขา PA.4   และ PA.5 
PA04, PA05 are analog outputs


ตัวอย่างใช้งาน ADC และ Timer ร่วม

เอาท์พุตจะออกตามการแปลงของ ADC1 โดยใช้ Vr 3 ขา  ที่ขากลางขา(2) Vr ต่อที่ PC.4 อินพุต ADC1
ขา(1) ต่อลง กราวด์ (0V)  และขา(3) Vr ต่อไฟ (VCC) 3.3V   แล้วทดสอบโดยการปรับ Vr ซ้าย-ขวา ดู
แล้ววัดแรงดันเอาท์พุทที่ PA.4 และ PA.5 เทียบกราวด์ ใช้ มิเตอร์ หรือสโคปวัดได้

Timer ใช้ทำไฟกระพริบ ที่ขา PD.5  ติดดับ
และมีไฟ LED เป็นสเกลบอกระยะช่วงของแรงดัน PD15,PD14,PD13,PD12

Code: [Select]
#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;
                          }
}



Code ที่2 สร้างสัญญาณ Sine Wave   เอาท์พุทที่ขา PA.4และ PA.5

ให้ใช้สโคปวัดโดยขั้วบวกวัดที่ขา PA.4  และ กราวด์ สโคปวัดที่ PA.5
Code จะสร้างสัญญาณ ฮาฟเวฟ ที่ DAC1 และ DAC2  ต่างเฟส 180 องศา
และมีความละเอียดที่สเต็ปละ 1องศา ดังนั้น 360 องศา เท่ากับ 360 สเต็ป
จะมีเคาท์เตอร์เป็นตัวนับเพื่อไปดึงขู้มูลในตารางที่เราใส่ค่าองศาไว้แล้วโดยมี
Timer เป็นตัวกำหนดจังหวะในการไปดึงข้อมูลจากตาราง เราสามารถเปลี่ยนความถี่
ที่สร้างได้จากการเปลี่ยนค่าใน Timer จาก ค่า ARR  42,=>420,=>4200  เปลี่ยนค่า
แล้ววัดดู  ถ้าเราวัดที่เอาท์พุตเทียบกราวด์ทั้ง 2Channel เราจะเห็นรูป ฮาฟบริดท์
ต่าง 180 องศาที่ ทั้งสอง Channel เทียบ กราวด์

Code: [Select]
#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)
{

}
}



Code ตัวอย่างที่3 สร้างสัญญาณ Sine Wave แบบกราวด์รอย  เอาท์พุทที่ขา PA.4และ PA.5ให้วัดสัญญาณเทียบกราวด์ 0V

Code: [Select]
#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)
{

}
}


Code ตัวอย่างที่4 สร้างสัญญาณ Sine Wave แบบกราวด์รอย  เอาท์พุท PA.4 ต่างเฟสกัน180องศากับ PA.5
Code: [Select]
[/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)
{

}
}

5
STM32F4 discovery การใช้ Interrupt external  EXTI 0

1      สร้าง Floder ชื่อ ADC10_14 ขึ้นมา
2      ทำการเพื่ม File  system_stm32f4xx.c และ stm32f4xx.hไว้ใน Floder
3      ทำการสร้างโปรเจคใหม่ เลือก เบอร์ IC stm32f407VG และให้ ADD File startup_stm32f4.s
                                                    เข้ามาด้วย  เพื่อที่จะได้ไม่ต้องไปก๊อปมาจาก Lib st ให้ยุ่งยากอีก  ความสำคัญคือมันจะช่วยจัดการค่า
                                                    เบื้องต้นให้กับ IC ให้พร้อมรับการโปรแกรมและการทำงาน ถ้าไม่มี  MCU จะ compiler ไม่ผ่าน
4     เขียนClode และ save โปรเจคเป็นนามสกุล .C

Interrupt external สามารถปรับให้รับได้ถึง  15 External ทำงานด้วยกัน เรียงละดับไปตามความสำคํญ
ขาทุกขาที่เป็นGPIO สามารถกำหนดให้เป็นขารับรู้การเกิดเหตุการต่างๆ เพื่อนำไปควบคุมลูป หรือการทำงาน
ที่กำหนดได้  ตัวอย่าง GPIOA 0.....GPIO15 เราจะได้ External Event ดังนี้
GPIOA0 ===> คุบ  Ext 0
GPIOA1===>  คุบ  Ext 1
GPIOA2===>  คุบ  Ext 2
.                            .
.                            .
GPIOA14===>  คุบ  Ext 14
GPIOA15===>  คุบ  Ext 15

หรือ

GPIOB0 ===> คุบ  Ext 0
GPIOB1===>  คุบ  Ext 1
GPIOB2===>  คุบ  Ext 2
.                            .
.                            .
GPIOB14===>  คุบ  Ext 14
GPIOB15===>  คุบ  Ext 15

หรือ
.
.
.

GPIOn0 ===> คุบ  Ext 0
GPIOn1===>  คุบ  Ext 1
GPIOn2===>  คุบ  Ext 2
.                            .
.                            .
GPIOn14===>  คุบ  Ext 14
GPIOn15===>  คุบ  Ext 15

จะเห็นได้ว่า ที่ GPIO(x)  ต่างๆ ตำแหน่ง Bit0  จะคุม  Ext 0
จะเห็นได้ว่า ที่ GPIO(x)  ต่างๆ ตำแหน่ง Bit1  จะคุม  Ext 1
.                                .                                 .
.                                .                                 .
จะเห็นได้ว่า ที่ GPIO(x)  ต่างๆ ตำแหน่ง Bit15  จะคุม  Ext 15 
เราสามารถให้ Ext 0  เกิดที่ GPIO ไหนก็ได้โดยการใช้ รีจีสเตอร์ควบคุม
และสามารถใช้พร้อมกันได้ถึง  15 External Event และแต่ละ อันสามารถ
ใช้ต่าง GPIO ในการรับค่าได้

SYSCFG_EXTICR1 ใช้ในการเลือก GPIO ต่างให้เป็น Ext นั้นๆ 

SYSCFG_EXTICR1 คุม  Ext0 ถึง Ext3
SYSCFG_EXTICR2 คุม  Ext4 ถึง Ext7
SYSCFG_EXTICR3 คุม  Ext8 ถึง Ext11
SYSCFG_EXTICR4 คุม  Ext12 ถึง Ext15








************************************************************************
#define SYSCFG_EXTICR1_EXTI0_PA         ((uint16_t)0x0000) /*!<PA[0] pin */
#define SYSCFG_EXTICR1_EXTI0_PB         ((uint16_t)0x0001) /*!<PB[0] pin */
#define SYSCFG_EXTICR1_EXTI0_PC         ((uint16_t)0x0002) /*!<PC[0] pin */
#define SYSCFG_EXTICR1_EXTI0_PD         ((uint16_t)0x0003) /*!<PD[0] pin */
#define SYSCFG_EXTICR1_EXTI0_PE         ((uint16_t)0x0004) /*!<PE[0] pin */
#define SYSCFG_EXTICR1_EXTI0_PF         ((uint16_t)0x0005) /*!<PF[0] pin */
#define SYSCFG_EXTICR1_EXTI0_PG         ((uint16_t)0x0006) /*!<PG[0] pin */
#define SYSCFG_EXTICR1_EXTI0_PH         ((uint16_t)0x0007) /*!<PH[0] pin */
#define SYSCFG_EXTICR1_EXTI0_PI         ((uint16_t)0x0008) /*!<PI[0] pin */   
.                                                                   .
.                                                                   .
.                                                                   .   
#define SYSCFG_EXTICR4_EXTI15_PA        ((uint16_t)0x0000) /*!<PA[15] pin */
#define SYSCFG_EXTICR4_EXTI15_PB        ((uint16_t)0x1000) /*!<PB[15] pin */
#define SYSCFG_EXTICR4_EXTI15_PC        ((uint16_t)0x2000) /*!<PC[15] pin */
#define SYSCFG_EXTICR4_EXTI15_PD        ((uint16_t)0x3000) /*!<PD[15] pin */
#define SYSCFG_EXTICR4_EXTI15_PE        ((uint16_t)0x4000) /*!<PE[15] pin */
#define SYSCFG_EXTICR4_EXTI15_PF        ((uint16_t)0x5000) /*!<PF[15] pin */
#define SYSCFG_EXTICR4_EXTI15_PG        ((uint16_t)0x6000) /*!<PG[15] pin */
#define SYSCFG_EXTICR4_EXTI15_PH        ((uint16_t)0x7000) /*!<PH[15] pin */

EXTI_RTSR        รีจีสเตอร์คุมการตรวจสอบ ขอบขาขึ้นของเหตุการ
EXTI_FTSR        รีจีสเตอร์คุมการตรวจสอบ ขอบขาลงของเหตุการ

ดูข้อมูลได้จาก Reference manual stm32f4 st หน้า 259/1422 - 262/1422
และ หน้า 208/1422 - 210/1422
       

Code: [Select]
#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)
                           {
                             ;
                           }
}

6
STM32F4 discovery  การใช้ADC1 , ADC2 , ADC3 ทำงานพร้อมกัน

1      สร้าง Floder ชื่อ ADC123  ขึ้นมา
2      ทำการเพื่ม File  system_stm32f4xx.c และ stm32f4xx.hไว้ใน Floder
3      ทำการสร้างโปรเจคใหม่ เลือก เบอร์ IC stm32f407VG และให้ ADD File startup_stm32f4.s
                                                    เข้ามาด้วย  เพื่อที่จะได้ไม่ต้องไปก๊อปมาจาก Lib st ให้ยุ่งยากอีก  ความสำคัญคือมันจะช่วยจัดการค่า
                                                    เบื้องต้นให้กับ IC ให้พร้อมรับการโปรแกรมและการทำงาน ถ้าไม่มี  MCU จะ compiler ไม่ผ่าน
4     เขียนClode และ save โปรเจคเป็นนามสกุล .C

PC.0 Channel  10   ADC1
PC.1 Channel  11   ADC2
PC.2 Channel  12   ADC3

แรงดัน input  0-3.3V (VCC) 

เป็นตัวอย่างในการศึกษาการ Scan แต่ละช่อง พร้อมกัน นำไปดัดแปลงใช้งานได้
Code: [Select]
#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;
}
}


7
STM32F4 discovery  การใช้ADC1 ช่อง 10-11-12-13-14

1      สร้าง Floder ชื่อ ADC10_14 ขึ้นมา
2      ทำการเพื่ม File  system_stm32f4xx.c และ stm32f4xx.hไว้ใน Floder
3      ทำการสร้างโปรเจคใหม่ เลือก เบอร์ IC stm32f407VG และให้ ADD File startup_stm32f4.s
                                                    เข้ามาด้วย  เพื่อที่จะได้ไม่ต้องไปก๊อปมาจาก Lib st ให้ยุ่งยากอีก  ความสำคัญคือมันจะช่วยจัดการค่า
                                                    เบื้องต้นให้กับ IC ให้พร้อมรับการโปรแกรมและการทำงาน ถ้าไม่มี  MCU จะ compiler ไม่ผ่าน
4     เขียนClode และ save โปรเจคเป็นนามสกุล .C

PC.0 Channel  10
PC.1 Channel  11
PC.2 Channel  12
PC.3 Channel  13
PC.4 Channel  14

แรงดัน input  0-3.3V (VCC) 

เป็นตัวอย่างในการศึกษาการ Scan แต่ละช่อง ที่ละค่า  นำไปดัดแปลงใช้งานได้

Code: [Select]
#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;
                         }
}


8
STM32F4 discovery  การใช้ ADC

1      สร้าง Floder ชื่อ ADC ขึ้นมา
2      ทำการเพื่ม File  system_stm32f4xx.c และ stm32f4xx.hไว้ใน Floder
3      ทำการสร้างโปรเจคใหม่ เลือก เบอร์ IC stm32f407VG และให้ ADD File startup_stm32f4.s
                                                    เข้ามาด้วย  เพื่อที่จะได้ไม่ต้องไปก๊อปมาจาก Lib st ให้ยุ่งยากอีก  ความสำคัญคือมันจะช่วยจัดการค่า
                                                    เบื้องต้นให้กับ IC ให้พร้อมรับการโปรแกรมและการทำงาน ถ้าไม่มี  MCU จะ compiler ไม่ผ่าน
4     เขียนClode และ save โปรเจคเป็นนามสกุล .C

เลือก PC.4      เป็นรับสัญญาณอะนาล็อก ตรงกับช่อง 14
การแปลงของ ADC1 โดยใช้ Vr 3 ขา  ที่ขากลางขา(2) Vr ต่อที่ PC.4 อินพุต ADC1
ขา(1) ต่อลง กราวด์ (0V)  และขา(3) Vr ต่อไฟ (VCC) 3.3V   แล้วทดสอบโดยการปรับ Vr ซ้าย-ขวา ดู

Code: [Select]
#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;
                         }
}



การใช้งาน Interrupt ADC ร่วม เพื่อที่จะไม่ต้องคอยมาวนตรวจสอบ EOC ตลอดเวลา เราสามารถที่จะส่งงานให้
ADCทำงาน และก็ให้ไปทำงานอย่างอื่นก่อนได้ เมื่อ ADC ทำการแปลงเสร็จจะส่งสัญญาณการ Interruptเพื่อให้
MCU กระโดดไปทำงานในลูปของ การเกิด Interrupt ADC เองแบบอัตโนมัติ เมื่อเสร็จจะกระโดดกลับมาทำงาน
ในโปรแกรมหลักต่อไปหรือลูปเมนฟังก์ชันหลัก 


เลือก PC.4      เป็นรับสัญญาณอะนาล็อก ตรงกับช่อง 14
การแปลงของ ADC1 โดยใช้ Vr 3 ขา  ที่ขากลางขา(2) Vr ต่อที่ PC.4 อินพุต ADC1
ขา(1) ต่อลง กราวด์ (0V)  และขา(3) Vr ต่อไฟ (VCC) 3.3V   แล้วทดสอบโดยการปรับ Vr ซ้าย-ขวา ดู

ตัวอย่างการใช้งาน
Code: [Select]
#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
}
}


การใช้งาน Interrupt ADC ร่วม กับ DAC เก็บค่า 1000 ค่า พร้อมหาค่าเฉลี่ย 2 รูปแบบ
พร้อมทั้งแสดงค่าออกทาง DAC ทั้ง2ช่อง แสดงค่าออกมาเทียบกัน


เลือก PC.4      เป็นรับสัญญาณอะนาล็อก ตรงกับช่อง 14
การแปลงของ ADC1 โดยใช้ Vr 3 ขา  ที่ขากลางขา(2) Vr ต่อที่ PC.4 อินพุต ADC1
ขา(1) ต่อลง กราวด์ (0V)  และขา(3) Vr ต่อไฟ (VCC) 3.3V   แล้วทดสอบโดยการปรับ Vr ซ้าย-ขวา ดู

Code: [Select]
#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
}
}

Pages: [1] 2 3