Electoday 2025

ไมโครคอนโทรลเลอร์ => ARM Processors => Topic started by: tha on September 17, 2020, 09:42:20 AM

Title: STM32F1 ADC HAL
Post by: tha on September 17, 2020, 09:42:20 AM
พอดีไปเจอขุมทรัพย์อยู่ตรงนี้  https://github.com/yohanes-erwin/stm32f103-sw4stm32 (https://github.com/yohanes-erwin/stm32f103-sw4stm32)

เดี๋ยวจะแปล ADC ตามใน reference manaul ไปเลย ก็ดูภาษาอังกฤษเปรียบเทียบไปเลย ลืมไปแล้วเหมือนกัน ก็ต้องเริ่มต้นกันใหม่

11.1 ADC introduction
The 12-bit ADC เป็น successive approximation analog-to-digital converter. มันจะมีถึง 18 multiplexed(เชิงซ้อน) channels ทำให้มันวัดสัญญานจากภายนอกได้ 16 แหล่งและภายใน 2 แหล่ง. การแปลงสัญญาน A/D ของ channels ต่างๆสามารถทำได้ใน single, continuous, scan หรือ discontinuous mode. ผลของการแปลง ADC จะถูกเก็บในแนว left-aligned(ชิดซ้าย) หรือ right-aligned(ชิดขวา)ของ 16-bit data register.

The analog watchdog feature ทำให้ใช้งานเกี่ยวกับการตรวจจับ ถ้า input voltage ออกนอกกรอบขอบเขต high หรือ low ที่ผู้ใช้กำหนด

The ADC input clock ถูสร้างขึ้นจาก the PCLK2 clock ถูกหารโดย prescaler และมันต้องไม่เกิน 14 MHz, อ้างอิงถึงรูป Figure 8 สำหรับ low-, medium-, high- and XL-density devices, และรูป Figure 11 สำหรับ connectivity line devices.
Title: Re: STM32F1 ADC HAL
Post by: tha on September 17, 2020, 03:05:18 PM
11.2 ADC main features
•  ความละเอียด 12-bit
• อินเตอรัพท์ถูกสร้างขึ้นที่การจบการแปลง(Conversion), การจบของการแปลงแบบอินเจ็คท์(Injected conversion) และเกิด Analog
watchdog event
• โหมดการแปลงครั้งเดียวและโหมดการแปลงต่อเนื่องกัน
• Scan mode สำหรับการแปลงแบบอัตโนมัติของ channel 0 to channel 'n'
• Self-calibration(การปรับแต่งด้วยตัวมันเอง)
• Data alignment(การจัดวางแนวข้อมูล) ด้วย in-built data coherency(ติดต่อกัน)
• Channel ต่อ channel programmable sampling time
• External trigger option(ตัวเลือก) สำหรับทั้ง regular และ injected conversion
• Discontinuous mode
• Dual mode (บน mcu ด้วย 2 ADCs หรือมากกว่า)
• ADC conversion time:
   – STM32F103xx performance line devices: 1 μs at 56 MHz (1.17 μs at 72 MHz)
   – STM32F101xx access line devices: 1 μs at 28 MHz (1.55 μs at 36 MHz)
   – STM32F102xx USB access line devices: 1.2 μs at 48 MHz
   – STM32F105xx and STM32F107xx devices: 1 μs at 56 MHz (1.17 μs at 72 MHz)
• ADC supply requirement:(แหล่งจ่ายไฟที่ต้องการ) 2.4 V to 3.6 V
• ADC input range: VREF- ≤ VIN ≤ VREF+
• DMA request generation ในระหว่าง regular channel conversion
The block diagram ของ the ADC ถูกแสดงในรูป Figure 22.
บันทึก: VREF-,ถ้ามีให้ใช้ (ขึ้นอยู่กับ package), ต้องถูกต่อถึง VSSA.
Title: Re: STM32F1 ADC HAL
Post by: tha on September 17, 2020, 03:39:30 PM
11.3 ADC functional description (การอธิบายถึงฟังชั่นของ ADC)
รูปที่ 22 แสดง single ADC block diagram และตารางที่ 65 ให้คำอธิบายถึง ADC pin .

(https://i.imgur.com/ongd113.png)

1. ADC3 มี regular และ injected conversion triggers แตกต่างไปจากของ ADC1 และ ADC2.
2. TIM8_CH4 และ TIM8_TRGO ด้วย corresponding remap bits ของมันมีอยู่เพียงใน High-density และ XL-density products.

ปล. วันนี้บ่ายมาแดดมันร่ม มันเลยไม่ร้อน ปกติบ่ายมาร้อน จะอ่านอะไรไม่ได้เลย สาเหตุที่ไทยไม่เจริญทางด้านวัตถุเทคโนโลยี ใครมาเป็นนายกก็เข็ญไม่ขึ้น ไม่เหมือนจีนๆเขาหนาวเย็น เลยเจริญเอาๆจะแซงอเมริกาแล้ว มันไม่เกี่ยวกับประชาธิปไตย ไม่ประชาธิปไตยหรอกใช่ไหมครับ
Title: Re: STM32F1 ADC HAL
Post by: tha on September 17, 2020, 03:49:37 PM
(https://i.imgur.com/cjKSz4o.png)

1. VDDA และ VSSA จะถูกต่อเข้ากับ VDD และ VSS, ตามลำดับ
2. สำหรับรายละเอียดเกี่ยวกับ ADC I/O pins, ถูกกล่าวถึงใน the "Pinouts and pin descriptions" section ของ the corresponding device datasheet.
Title: Re: STM32F1 ADC HAL
Post by: tha on September 17, 2020, 05:14:37 PM
11.3.1 ADC on-off control
The ADC สามารถถูก powered-on โดยการเซ็ตบิต ADON bit ใน the ADC_CR2 register. เมื่อบิต ADON bit ถูกเซ็ตในครั้งแรก, มันจะ wakes up the ADC จาก Power Down mode. การแปลงจะเริ่มเมื่อบิต ADON bit ถูกเซ็ตเป็นครั้งที่สองโดย software หลังจาก ADC power-up time (tSTAB).
การแปลงสามารถถูกหยุด, และ ADC ถูกทำให้อยู่ใน power down mode โดยการรีเซ็ตบิต(ทำให้เป็น '0') ADON bit. ในโหมดนี้ ADC เกือบ
จะไม่กินพลังงาน (กินเพียงหน่วยเป็น μA เล็กน้อยเท่านั้น).
Title: Re: STM32F1 ADC HAL
Post by: tha on September 17, 2020, 05:27:30 PM
11.3.2 ADC clock
The ADCCLK clock ถูกจัดให้มีโดย the Clock Controller คือจะ synchronous ด้วย the PCLK2 (APB2clock). The RCC controller มี a dedicated programmable prescaler สำหรับ the ADC clock,
อ้างอิงถึง Low-, medium-, high- and XL-density reset and clock control (RCC) สำหรับรายละเอียดที่มากขึ้น.
Title: Re: STM32F1 ADC HAL
Post by: tha on September 17, 2020, 06:18:42 PM
ดูที่บิต Bit 0 ADON: A/D converter ON / OFF ในรีจีสเตอร์ ADC control register 2 (ADC_CR2) ใน reference manaul นะ
ให้บิต Bit 0 ADON ค้างเป็น '1' power on ก่อน แล้วเขียนเป็น '1' ไปอีกทีเพื่อสตาร์ทการแปลงอีกทีครับ



ในฟังชั่นย่อย void ADC_setup(void) เราให้ บิต 0 ADON เป็น '1' ไปก่อน ADC_Cmd(ADC1, ENABLE);  // Enable ADC1
Quote
void ADC_setup(void)
{
   ADC_InitTypeDef ADC_InitStructure;
   // Enable ADC1 clock
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
   // ADC1 configuration
   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
   ADC_InitStructure.ADC_NbrOfChannel = 1;
   ADC_Init(ADC1, &ADC_InitStructure);
   // ADC1 regular channel14 configuration
   //ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_13Cycles5);
   ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_13Cycles5);
   ADC_Cmd(ADC1, ENABLE);  // Enable ADC1

   ADC_ResetCalibration(ADC1);   // Enable ADC1 reset calibaration register
   while(ADC_GetResetCalibrationStatus(ADC1));

   ADC_StartCalibration(ADC1);   // Start ADC1 calibaration
   while(ADC_GetCalibrationStatus(ADC1)); // Check the end of ADC1 calibration
}


พอในลูป while(1) เราก็คอยเขียนบิต 0 ADON เป็น '1' ซ้ำ ADC_Cmd(ADC1, ENABLE);  // Enable ADC1 พอแปลงเสร็จแต่ละครั้งก็เขียนเป็น '1' ซ้ำไปเรื่อย ADC ก็จะทำการแปลงตลอดเวลา
Quote
int main(void)
{
   unsigned long adc_val=0,percentage; // Keep analog value
   char str[14];  // Keep string convert
   GPIO_setup();  // GPIO Configuration
   ADC_setup();   // ADC Configuration
   lcdString(1,1,"ADC Demo...");   // Set message on line 1
   lcdUpdate();     // Display message
   while(1)    // Infinite loop
   {
      ADC_Cmd(ADC1,ENABLE);   // Enable ADC1
      while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);   // Wait EOC flag set
      adc_val = ADC_GetConversionValue(ADC1);   // Get analog value from ADC channel 14(PC4)
      percentage = (adc_val*100)/4095; // Convert analog to percentage(0-100% reference from 0-4095)
      sprintf(str,"AIN0: %d    ",adc_val);  // Convert analog value to string
      lcdString(1,3,str);     // Set message on line 3
      lcdProgBar(0,26,83,5,percentage);   // Display progress bar at(0,26),width 83 pixel,high 5 pixel
      sprintf(str,"%d%%   ",percentage);  // Convert percentage value to string
      lcdString(6,5,str);     // Set message on line 5(position(6,5))
      lcdUpdate();      // Display message
      delay_ms(50);     // Delay a few time
   }

}
Title: Re: STM32F1 ADC HAL
Post by: tha on September 17, 2020, 07:11:50 PM
ได้แล้วนะครับ เอามาใช้กับโปรแกรม Keil ก่อน เพราะ library ยังเป็นตัวเก่าอยู่ ไม่ใช่ HAL

(https://i.imgur.com/Yh0wE8p.png)

ปล. ร้อนนะเครียด ผมไม่ได้อยู่ห้องแอร์นะครับ
Title: Re: STM32F1 ADC HAL
Post by: tha on September 17, 2020, 07:17:19 PM
-
Title: Re: STM32F1 ADC HAL
Post by: tha on September 17, 2020, 07:22:49 PM
main.c เอา //#include "stm32f10x_lib.h" ออกก็คอมไพล์ผ่านนะครับ
Title: Re: STM32F1 ADC HAL
Post by: tha on September 18, 2020, 05:09:02 AM
ดูอยู่นาน โปรแกรมตัวนี้ ใช้ PA0 เป็น analog input ต้องต่อตัวต้านทานปรับค่าได้อีกตัว ต่อเข้ากับ PA0 เอาจั๊มเปอร์สวิทช์ WKUP ออกด้วย ไม่ได้ใช้ตัวต้านทานปรับค่าได้ PA1 บนบอร์ดนะครับ
Title: Re: STM32F1 ADC HAL
Post by: tha on September 18, 2020, 05:30:45 AM
อันนี้ตัวอย่างของ ETT ใช้ PA1 บนบอร์ด การสตาร์ทการแปลงจะไม่เหมือนกับตัวอย่างที่แล้ว จะสตาร์ทด้วยการเซ็ตบิต Bit 22 SWSTART: Start conversion of regular channels ของ ADC control register 2 (ADC_CR2) (ดูที่หน้า 240 ของ reference manaul) บิตนี้จะถูกเคลียร์โดย hardware ทันทีเมื่อสตาร์ทการแปลงไปแล้ว

Quote
// Start the conversion
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);

Title: Re: STM32F1 ADC HAL
Post by: tha on September 18, 2020, 06:16:27 AM
ตัวอย่างแรกลืมใส่ RCC setup(); เข้าไปนะ โธ่ไม่น่าจะลืมเซ็ตคล็อคไปได้ อันนี้แก้ใขแล้วครับ


ตัวอย่างไฟวิ่งตาม ADC ของ ETT ลืมใส่คล็อค ADC prescaler หาร PCLK2 ด้วย 4 แก้ไขด้วยครับ
Quote
RCC_ADCCLKConfig(RCC_PCLK2_Div4);  // ADCCLK = PCLK2/4
Title: Re: STM32F1 ADC HAL
Post by: tha on September 18, 2020, 06:33:16 AM
ADC Clock ต้องไม่เกิน 14MHz ใช่ไหมที่แปลไป ADC Clock เอามาจาก PCLK2 ที่มีคล็อคเท่ากับ 72MHz เราจึงต้องตั้ง
ADC prescaler = 4 เพื่อหาร 72MHz/4 = 18MHz เอ๊ะมันยังเกินอยู่นี่ ต้องหารด้วย 6 สิถึงจะได้ ADC Clock = 12MHz ไม่เกิน 14MHz แก้ใขกันด้วยครับ
Title: Re: STM32F1 ADC HAL
Post by: tha on September 18, 2020, 06:51:26 AM
11.3.3 Channel selection (การเลือกชาแนล)
มีอยู่ 16 multiplexed channels. มันสามารถจัดระเบียบการแปลงเป็นสองกลุ่ม: regular และ injected. A group ประกอบด้วยลำดับของการแปลงที่สามารถทำได้กับช่องใดก็ได้และตามลำดับใด ๆก็ได้ ตัวอย่างเช่นสามารถทำได้ที่จะทำการแปลงในลำดับต่อไปนี้: Ch3, Ch8, Ch2,
Ch2, Ch0, Ch2, Ch2, Ch15.
• The regular group ประกอบด้วยการแปลงสูงสุดถึง 16 การแปลง. The regular channels และลำดับการแปลงของมันต้องถูกเลือกใน the ADC_SQRx registers. จำนวณของการแปลงทั้งหมดใน the regular group ต้องถูกเขียนลงใน the L[3:0] bits ใน the ADC_SQR1 register.

• The injected group ประกอบด้วยการแปลงสูงสุดถึง 4 การแปลง. The injected channels และลำดับการแปลงของมันต้องถูกเลือกใน the ADC_JSQR register. จำนวณของการแปลงทั้งหมดใน the injected group ต้องถูกเขียนลงใน the L[1:0] bits ใน the ADC_JSQR register.

ถ้า the ADC_SQRx or ADC_JSQR registers ถูกแก้ไขในระหว่างการแปลง, การแปลงปัจจุบันจะถูกยกเลิก(reset)และ a new start pulse จะถูกส่งไปยัง the ADC เพื่อทำการแปลงกลุ่มใหม่ที่เลือก

Temperature sensor/VREFINT internal channels
The Temperature sensor ถูกต่อเข้ากับชาแนล ADCx_IN16 และ the internal reference voltage VREFINT ถูกต่อเข้ากับ ADCx_IN17. ทั้งสอง internal channels นี้สามารถถูกเลือกและแปลงได้ทั้งแบบ injected หรือ regular channels.
บันทึก: The sensor นี้และ VREFINT สามารถใช้งานได้กับ the master ADC1 peripheral เท่านั้น
Title: Re: STM32F1 ADC HAL
Post by: tha on September 18, 2020, 08:29:27 AM
ท่านใใดแนะนำมาให้ตั้งตัวคูณ PLL =7 ก็จะได้ system clock = 56MHz แล้วตั้ง ADC prescaler ให้หาร PCK2 ด้วย 4 ก็จะได้ ADC clock = 14MHz ซึ่งเป็นค่าสูงสุดพอดี ก็จะแปลงได้เร็วขึ้น

Quote
      RCC_ADCCLKConfig(RCC_PCLK2_Div4);  // ADCCLK = PCLK2/4 = 14MHz
      FLASH_SetLatency(FLASH_Latency_2); // Flash 2 wait state
      FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  // Enable Prefetch Buffer
      RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_7);   // PLLCLK = 8MHz * 7 = 56 MHz
Title: Re: STM32F1 ADC HAL
Post by: tha on September 18, 2020, 09:32:38 AM
11.3.4 Single conversion mode
ใน Single conversion mode the ADC ทำการแปลงครั้งเดียว. โหมดนี้จะสตาร์ทโดยการเซ็ตบิต ADON bit ใน the ADC_CR2 register (สำหรับ a regular channel เพียงอย่างเดียว) หรือโดย external trigger (สำหรับ a regular หรือ injected channel), ในขณะที่ the CONT bit เป็น 0.
เมื่อการแปลงชาแนลที่เลือกเสร็จสมบูรณ์:
• ถ้า a regular channel ถูกแปลงเสร็จแล้ว:
   – The converted data ถูกเก็บไว้ใน the 16-bit ADC_DR register
   – The EOC (End Of Conversion) flag ถูก set
   – และ an interrupt ถูก generated ถ้าบิต the EOCIE ถูก set.
• ถ้า an injected channel ถูกแปลงเสร็จแล้ว:
   – The converted data ถูกเก็บไว้ใน the 16-bit ADC_DRJ1 register
   – The JEOC (End Of Conversion Injected) flag ถูก set
   – และ an interrupt ถูก generated ถ้า the JEOCIE bit ถูก set.
The ADC จากนั้นก็จะหยุดทำงาน.

ปล. บิต CONT bit ก็จะอยู่ในรีจีสเตอร์ ADC control register 2 (ADC_CR2) ใน reference manaul หน้า 240
Title: Re: STM32F1 ADC HAL
Post by: tha on September 18, 2020, 09:44:01 AM
11.3.5 Continuous conversion mode
ใน continuous conversion mode ADC สตาร์ทการแปลงอื่นทันทีเมื่อมันเสร็จการแปลงแล้ว โหมดนี้จะสตาร์ทโดย external trigger หรือโดยการเซ็ตบิต the ADON bit ใน the ADC_CR2 register, ในขณะที่บิต the CONT bit เป็น 1.
หลังจากการแปลงแต่ละครั้ง :
• ถ้า a regular channel ถูกแปลงเสร็จแล้ว:
   – The converted data ถูกเก็บไว้ใน the 16-bit ADC_DR register
   – The EOC (End Of Conversion) flag ถูก set
   – และ an interrupt ถูก generated ถ้าบิต the EOCIE ถูก set.
• ถ้า an injected channel ถูกแปลงเสร็จแล้ว:
   – The converted data ถูกเก็บไว้ใน the 16-bit ADC_DRJ1 register
   – The JEOC (End Of Conversion Injected) flag ถูก set
   – และ an interrupt ถูก generated ถ้า the JEOCIE bit ถูก set.
Title: Re: STM32F1 ADC HAL
Post by: tha on September 18, 2020, 10:18:58 AM
11.3.6 Timing diagram
ดังแสดงในรูป Figure 23, the ADC ต้องการเวลา a stabilization time ของ tSTAB ก่อนที่มันจะสตาร์ทการแปลงอย่างเที่ยงตรง. หลังจากการสตาร์ทของ ADC conversion และหลังจากนั้นอีก 14 clock cycles, the EOC flag จะถูก set และ the 16-bit ADC Data register บรรจุด้วยผลของการแปลง.

(https://i.imgur.com/PNRo7V2.png)

ปล. บิต Bit 22 SWSTART: Start conversion of regular channels และบิต Bit 21 JSWSTART: Start conversion of injected channels ก็จะอยู่ในรีจีสเตอร์ ADC control register 2 (ADC_CR2) ใน reference manaul หน้า 240
ส่วน ADC regular data register (ADC_DR) และ ADC injected data register x (ADC_JDRx) (x= 1..4) อยู่หน้า 251
Title: Re: STM32F1 ADC HAL
Post by: tha on September 18, 2020, 04:34:37 PM
-
Title: Re: STM32F1 ADC HAL
Post by: tha on September 18, 2020, 05:14:15 PM
ท่านใดแนะนำให้ตั้งชาแนลเดียว ก็ทำงานได้ครับ
Quote
ADC_InitStructure.ADC_NbrOfChannel = 1;
เพราะเราให้แปลงทีละครั้ง ก็เพียงเปลี่ยนชาแนลไปก่อน แล้วถึงสตาร์ททำการแปลงเพียงครั้งเดียว
Quote
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
scan mode เราก็ไม่ให้ทำงาน
Title: Re: STM32F1 ADC HAL
Post by: tha on September 19, 2020, 12:25:48 PM
ฝนตกอากาศเย็นๆ โปรเจ็คก็ออกดี วันนี้ก็ได้มาหนึ่งโปรเจ็ค ADC แบบ HAL แล้วนะ ก็เอามาจากตัวอย่างที่เคยให้ลิ้งค์เอาไว้ เป็นแบบ adc polling จาก analog input PA0 (เอาตัวต้านทานปรับค่าได้มาต่อที่ PA0) แล้วเอาค่าที่ได้มาแสดงที่จอ GLCD5110 เหมือนเคย ก็สามารถทำงานได้ครับ
Title: Re: STM32F1 ADC HAL
Post by: tha on September 19, 2020, 03:10:25 PM
-
Title: Re: STM32F1 ADC HAL
Post by: tha on September 19, 2020, 03:38:14 PM
ผมลองเปลี่ยนชื่อฟังชั่นใหม่เป็นอย่างนี้  void HAL_ADC_MspInit1(ADC_HandleTypeDef* hadc); แล้วมันไม่ทำงานนะ จอขาวเลย ผมเอา 1 ออก ก็ทำงานได้ปกติ แสดงว่าของเขาทำมาถูกแล้ว ผมก็ยังมือใหม่ยังต้องงม HAL ไปอีกนาน คุณ dec พอจะทราบการทำงานของมันมั๊ย ท่านใดพอจะทราบ ช่วยอธิบายหน่อยครับ
Title: Re: STM32F1 ADC HAL
Post by: tha on September 19, 2020, 04:08:16 PM
-
Title: Re: STM32F1 ADC HAL
Post by: tha on September 19, 2020, 05:19:09 PM
-
Title: Re: STM32F1 ADC HAL
Post by: tha on September 19, 2020, 05:57:17 PM
-
Title: Re: STM32F1 ADC HAL
Post by: dec on September 19, 2020, 10:03:15 PM
Quote from: tha on September 19, 2020, 03:38:14 PM
ผมลองเปลี่ยนชื่อฟังชั่นใหม่เป็นอย่างนี้  void HAL_ADC_MspInit1(ADC_HandleTypeDef* hadc); แล้วมันไม่ทำงานนะ จอขาวเลย ผมเอา 1 ออก ก็ทำงานได้ปกติ แสดงว่าของเขาทำมาถูกแล้ว ผมก็ยังมือใหม่ยังต้องงม HAL ไปอีกนาน คุณ dec พอจะทราบการทำงานของมันมั๊ย ท่านใดพอจะทราบ ช่วยอธิบายหน่อยครับ

ถ้าลองไปดูฟังชั่น HAL_ADC_Init ในไฟล์ stm32fxxx_hal_adc.c ลองไล่ดูจะเห็นว่ามันมีการเรียก HAL_ADC_MspInit
ิอยู่ครับ เวลาเรียก HAL_ADC_Init มันจะไปเรียก HAL_ADC_MspInit ให้ด้วยเลย

แล้วทีนี้ถ้าเปลี่ยนชื่อเป็น HAL_ADC_MspInit1 มันยัง compile ได้ปกติ ไม่ได้ฟ้อง error อะไร ลองไล่ code ไปอีกหน่อย
จะเจอ

__weak void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hadc);

  /* NOTE : This function should not be modified. When the callback is needed,
            function HAL_ADC_MspInit must be implemented in the user file.
   */
}


มันคือ HAL_ADC_MspInit นั่นแหละครับ แต่มี attribute __weak นำหน้า (สำหรับ GNU C Compiler และ IAR ตัวใหม่ๆ จะใช้ __attribute__((weak)) )
มันหมายถึงถ้าทั้ง project ไม่มี HAL_ADC_MspInit อยู่เลย linker จะใช้ฟังชั่นนี้ แต่ถ้ามีการนิยาม HAL_ADC_MspInit ไว้ที่อื่นอีก
อันที่มี attribute __weak จะถูกตัดออก


การเขียน code ลักษณะนี้ยังใช้ในไฟล์ startup ที่มี vector table อีกด้วยครับ

g_pfnVectors:
.word _estack
.word Reset_Handler
.word NMI_Handler
.word HardFault_Handler
.word MemManage_Handler
.word BusFault_Handler
.word UsageFault_Handler
.word 0
        ....


ปกติเวลาเราจะประกาศฟังชั่น interrupt เราก็แค่ประกาศชื่อให้ตรงกับชื่อที่อยู่ใน vector table แต่ฟังชั่นไหน
ไม่ได้ประกาศมันก็ไม่ได้ error อะไรเพราะมันมี weak ฟังชั่นอยู่เหมือนกัน แต่จะแตกต่างจากภาษาซีนิดหน่อยตรง
assembly มันไม่ได้ประกาศฟังชั่นมาทั้งอัน มันประกาศ alias ของฟังชั่นได้


  .weak NMI_Handler
.thumb_set NMI_Handler,Default_Handler

  .weak HardFault_Handler
.thumb_set HardFault_Handler,Default_Handler

  .weak MemManage_Handler
.thumb_set MemManage_Handler,Default_Handler

  .weak BusFault_Handler
.thumb_set BusFault_Handler,Default_Handler

.weak UsageFault_Handler
.thumb_set UsageFault_Handler,Default_Handler

.weak SVC_Handler
.thumb_set SVC_Handler,Default_Handler

.weak DebugMon_Handler
.thumb_set DebugMon_Handler,Default_Handler

.weak PendSV_Handler
.thumb_set PendSV_Handler,Default_Handler
       
        ...

.weak CRS_IRQHandler
.thumb_set CRS_IRQHandler,Default_Handler

.weak I2C4_EV_IRQHandler
.thumb_set I2C4_EV_IRQHandler,Default_Handler

.weak I2C4_ER_IRQHandler
.thumb_set I2C4_ER_IRQHandler,Default_Handler


หรือพูดง่ายๆ ก็คือมันสามารถประกาศ Default_Handler ให้มีหลายๆ ชื่อได้นั่นเอง แล้วชื่่ออื่นๆ ก็มี attribute weak กำกับไว้
เวลาเราไปประกาศฟังชั่น interrupt ในไฟล์ stm32xxxx_it.c ซ้ำกับชื่อฟังชั่น interrupt ในไฟล์ startup มันก็จะตัดชื่อในไฟล์ startup ออก
แล้วไปใช้ฟังชั่น interrupt ในไฟล์ stm32xxxx_it.c แทน
Title: Re: STM32F1 ADC HAL
Post by: tha on September 20, 2020, 08:47:24 AM
ขอบคุณครับ คุณ dec เรื่อง interrupt ผมก็จะลืมแล้ว เดี๋ยวไปไล่เรื่อง interrupt มาก่อน
Title: Re: STM32F1 ADC HAL
Post by: tha on October 07, 2020, 07:45:50 AM
11.3.7 Analog watchdog
The AWD analog watchdog status bit ถูกเซ็ตถ้า the analog voltage ที่แปลงโดย the ADC อยู่ต่ำกว่าขอบเขตทางต่ำ( low threshold)หรืออยู่เหนือกว่าขอบเขตทางสูง( high threshold). thresholds เหล่านี้ถูกโปรแกรมใน the 12 least significant bits(12 บิตทางต่ำ) ของ the ADC_HTR และ ADC_LTR 16-bit registers. An interrupt สามารถถูกเปิดการใช้งานโดยการใช้ the AWDIE bit ใน the ADC_CR1 register.

ค่าของขอบเขตเป็นอิสระจากการวางแนว(ชิดขวา/ชิดซ้าย)ที่เลือกโดย the ALIGN bit ใน the ADC_CR2 register. การเปรียบเทียบถูกทำก่อนที่จะวางแนว (ดู Section 11.5).

The analog watchdog สามารถถูกเปิดการใช้งานบนหนึ่งชาแนลหรือมากกว่าหนึ่งโดยการกำหนดค่า the ADC_CR1 register ดังแสดงในตาราง 66.

(https://i.imgur.com/AvZObsI.png)

(https://i.imgur.com/nCBfbZz.png)
Title: Re: STM32F1 ADC HAL
Post by: tha on October 07, 2020, 08:37:15 AM
-
Title: Re: STM32F1 ADC HAL
Post by: tha on October 07, 2020, 04:57:59 PM
11.3.8 Scan mode
mode ถูกใช้สแกนกลุ่มของ analog channels. Scan mode สามารถถูกเลือกโดยการเซ็ต the SCAN bit ใน the ADC_CR1 register. เมื่อบิตนี้ถูกเซ็ต, ADC จะสแกน the channels ทั้งหมดที่ถูกเลือกใน the ADC_SQRx registers (สำหรับ regular channels) หรือใน the ADC_JSQR (สำหรับ injected channels). การแปลงเพียงครั้งเดียวถูกกระทำสำหรับแต่ละชาแนลของกลุ่ม. หลังจากจบแต่ละการแปลง ชาแนลถัดไปของกลุ่มจะถูกแปลงโดยอัตโนมัติ. ถ้า the CONT bit ถูกเซ็ต, conversion จะไม่หยุดที่่ชาแนลสุดท้ายที่เลือกของกลุ่ม แต่จะทำการแปลงต่ออีกจากชาแนลแรกที่เลือกของกลุ่ม เมื่อใช้ scan mode, DMA bit ต้องถูกเซ็ตและ the direct memory access controller ถูกใช้เพื่อ transfer data ที่แปลงแล้วของ regular group channels ไปยัง SRAM หลังจากแต่ละข้อมูลใหม่ของ the ADC_DR register.
The injected channel converted data ถูกเก็บไว้ใน the ADC_JDRx registers เสมอ.
Title: Re: STM32F1 ADC HAL
Post by: tha on October 08, 2020, 09:17:21 AM
11.3.9 Injected channel management
Triggered injection
เพื่อใช้ triggered injection, the JAUTO bit ต้องถูกเคลียร์และ SCAN bit ต้องถูกเซ็ตใน the ADC_CR1 register.
   1. สตาร์ทการแปลงของกลุ่มของ regular channels โดย external trigger หรือโดยการเซ็ต the ADON bit ใน the ADC_CR2
       register อย่างใดอย่างหนึ่ง.
   2. ถ้า an external injected trigger เกิดขึ้นในระหว่าง the regular group channel conversion, การแปลงปัจจุบันจะถูกรีเซ็ตและ
       the injected channel sequence จะถูกแปลงใน Scan once(ครั้งเดียว) mode.
   3. แล้ว, the regular group channel conversion ถูกกลับมาทำงานต่อจาก the last interrupted(ที่ถูกพักไปล่าสุด) regular
      conversion. ถ้า a regular event เกิดขึ้นในระหว่าง an injected conversion, มันจะไม่ interrupt an injected conversion
      แต่ the regular sequence จะถูกปฏิบัติที่การจบของ the injected sequence. รูปที่ 25 แสดง the timing diagram.

Note: เมื่อใช้ triggered injection, ช่วงเวลาระหว่าง trigger events ต้องยาวนานกว่า the injection sequence. ตัวอย่างเช่น, ถ้า the sequence length เป็น 28 ADC clock cycles (นั่นคือมี 2 conversions พร้อมด้วยหนึ่ง a 1.5 clock-period sampling time), ช่วงเวลาที่สั้นที่สุดระหว่าง triggers ต้องเป็น 29 ADC clock cycles.
Title: Re: STM32F1 ADC HAL
Post by: tha on October 08, 2020, 03:17:38 PM
Auto-injection
ถ้า the JAUTO bit ถูกเซ็ต, เมื่อนั้น the injected group channels ถูกแปลงโดยอัตโนมัติหลังจาก the regular group channels. นี้สามารถถูกใช้เพื่อแปลงลำดับได้มากถึง 20 conversions ที่โปรแกรมใน the ADC_SQRx and ADC_JSQR registers.

ใน mode นี้, external trigger บน injected channels ต้องถูกปิดการใช้งาน.

ถ้า the CONT bit ถูกเซ็ตด้วยพร้อมกันกับ the JAUTO bit, regular channels ติดตามโดย injected channels จะถูกแปลงอย่างต่อเนื่อง

สำหรับ ADC clock prescalers ย่านจาก 4 ถึง 8, การหน่วงเวลาหนึ่งคาบ ADC clock จะถูกใส่โดยอัตโนมัติเมื่อสวิทชิ่งจาก regular ไปยัง injected sequence ( injected ไปยัง regular ตามลำดับ). เมื่อ the ADC clock prescaler ถูกเซ็ตเป็น 2, the delay คือ 2 ADC clock periods.

Note: เป็นไปไม่ได้ที่จะใช้ทั้ง auto-injected และ discontinuous modes พร้อมกัน.

(https://i.imgur.com/u5u4tlU.png)
Title: Re: STM32F1 ADC HAL
Post by: tha on October 09, 2020, 08:14:34 AM
11.3.10 Discontinuous mode
Regular group
mode นี้ถูกเปิดการใช้งานโดยการเซ็ต the DISCEN bit ใน the ADC_CR1 register. มันสามารถถูกใช้เพื่อแปลงลำดับสั้นๆของการแปลงจำนวน n (n <=8) ซึ่งเป็นส่วนหนึ่งของลำดับของการแปลงที่ถูกเลือกใน in the ADC_SQRx registers. ค่าของ n ถูกระบุโดยการเขียนไปยัง the DISCNUM[2:0] bits ใน the ADC_CR1 register.

เมื่อ an external trigger เกิดขึ้น, มันจะสตาร์ทการแปลงจำนวน n ถัดไปที่ถูกเลือกใน the ADC_SQRx registers จนกระทั่งการแปลงทั้งหมดในลำดับถูกกระทำแล้วเสร็จ. ความยาวลำดับทั้งหมดถูกกำหนดโดย the L[3:0] bits ใน the ADC_SQR1 register.

ตัวอย่างเช่น:
     n = 3, channels ที่จะถูกแปลง = 0, 1, 2, 3, 6, 7, 9, 10
     first trigger: ลำดับการแปลง 0, 1, 2. An EOC event ถูกสร้างขึ้นที่แต่ละการแปลง
     second trigger: ลำดับการแปลง 3, 6, 7. An EOC event ถูกสร้างขึ้นที่แต่ละการแปลง
     third trigger: ลำดับการแปลง 9, 10. An EOC event ถูกสร้างขึ้นที่แต่ละการแปลง
     fourth trigger: ลำดับการแปลง 0, 1, 2. An EOC event ถูกสร้างขึ้นที่แต่ละการแปลง

Note: เมื่อ a regular group ถูกแปลงใน discontinuous mode,การวนกลับจะไม่เกิดขึ้น. เมื่อกลุ่มย่อยทั้งหมดถูกแปลง, การ
         ทริกถัดไปจะสตาร์ทการแปลงของกลุ่มย่อยแรก.
         ในตัวอย่างข้างบน, การทริกครั้งที่ 4 จะแปลงซ้ำกลุ่มย่อยแรก channels 0, 1 และ 2.
Title: Re: STM32F1 ADC HAL
Post by: tha on October 09, 2020, 12:54:49 PM
Injected group
โหมดนี้ถูกเปิดการใช้งานโดยการเซ็ต the JDISCEN bit ใน the ADC_CR1 register. มันสามารถถูกใช้เพื่อแปลง the sequence ที่เลือกใน the ADC_JSQR register, channel ตาม channel, หลังจาก an external trigger event.

เมื่อ an external trigger เกิดขึ้น, มันจะสตาร์ท the next channel conversions ที่เลือกใน the ADC_JSQR registers จนกระทั่ง the conversions ทั้งหมดใน the sequence ถูกกระทำแล้วเสร็จ. The total sequence length ถูกกำหนดโดย the JL[1:0] bits ใน the ADC_JSQR register.

ตัวอย่าง:
     n = 1, channels ที่ถูกแปลง = 1, 2, 3
     first trigger: channel 1 ถูกแปลง
     second trigger: channel 2 ถูกแปลง
     third trigger: channel 3 ถูกแปลงและ EOC และ JEOC events ถูกสร้างขึ้น
     fourth trigger: channel 1

Note: เมื่อทั้งหมดของl injected channels ถูกแปลง, the next trigger จะสตาร์ทการแปลงของ the first injected channel. ในตัวอย่างข้างบน, the fourth trigger จะแปลงซ้ำใหม่ the first injected channel 1.

มันไม่สามารถใช้ทั้ง auto-injected และ discontinuous modes ได้พร้อมกัน.

ผู้ใช้ต้องหลีกเลี่ยงการเซ็ต discontinuous mode สำหรับทั้ง regular และ injected groups เข้าด้วยกัน. Discontinuous mode ต้องถูกเปิดการใช้งานสำหรับ one group conversion เท่านั้น.
Title: Re: STM32F1 ADC HAL
Post by: tha on October 10, 2020, 07:33:51 AM
11.4 Calibration
The ADC มี an built-in self calibration mode. การสอบเทียบช่วยลดความผิดพลาดที่ละเอียดเนื่องมาจาก internal capacitor bank variations(การเปลี่ยนแปลง) . ในระหว่าง calibration, an error-correction code (digital word) ถูกคำนวนสำหรับแต่ละ capacitor, และในระหว่างลำดับย่อยของการแปลงทั้งหมด, การสนับสนุนให้เกิดความผิดพลาดของแต่ละ capacitor ถูกเอาออกโดยใช้ code นี้.

Calibration ถูกสตาร์ทโดยการเซ็ต the CAL bit ใน the ADC_CR2 register. เมื่อการสอบเทียบเสร็จแล้ว, the CAL bit ถูกรีเซ็ตโดย hardware และการแปลงปกติสามารถถูกทำงานได้. ขอแนะนำให้ปรับเทียบ ADC หนึ่งครั้งเมื่อเปิดเครื่อง The calibration codes ถูกเก็บใน the ADC_DR ทันทีที่ the calibration phase ends.

Note: ขอแนะนำให้กระทำการ calibration หลังจากแต่ละ power-up.

ก่อนการสตาร์ท calibration, the ADC ต้องถูกอยู่ใน power-on state (ADON bit = '1') 2 ADC clock cycles เป็นอย่างน้อย.

(https://i.imgur.com/18eyHhj.png)
Title: Re: STM32F1 ADC HAL
Post by: tha on October 10, 2020, 10:59:39 AM
11.5 Data alignment
ALIGN bit ใน the ADC_CR2 register เลือกการวางแนวของ data เก็บหลังจาก conversion. Data สามารถวางแนวชิดซ้ายหรือชิดขวาดังแสดงในรูปที่ 27. และรูปที่ 28.

The injected group channels converted data value ถูกลดลงโดย the user-defined offset(ค่าหักลงที่ผู้ใช้กำหนด) ที่ถูกเขียนไว้ใน the ADC_JOFRx registers ดังนั้นผลที่ได้สามารถถูกทำให้เป็นค่าลบ. The SEXT bit เป็น the extended sign value.(ค่าเครื่องหมายที่เพิ่มมา)

สำหรับ regular group channels ไม่มี offset มาลบ ดังนั้นมีเพียง 12 bits เป็นนัยสำคัญ.

(https://i.imgur.com/CHJdTKH.png)

ปล. เป็นอย่างไรกันบ้าง แปลกันเป็นแล้วหรือยัง ไม่น่าจะยาก คำศัพย์มีไม่กี่ตัว ส่วนมากคู่มือจะมีรูปแบบประโยคเป็น passive voice ประธานเป็นผู้ถูกกระทำ มีรูปประโยคเป็น  ประธาน + verb to be + verb ช่องที่ 3 ตามที่ผมแปลว่า "ถูก" โน้น "ถูก" นี่ นั่นแหละครับ
Title: Re: STM32F1 ADC HAL
Post by: tha on October 10, 2020, 11:59:21 AM
11.6 Channel-by-channel programmable(ที่โปรแกรมได้) sample time
ADC สุ่ม the input voltage เป็นจำนวนหนึ่งของ ADC_CLK cycles ซึ่งสามารถถูกโมดิฟายด์โดยใช้ the SMP[2:0] bits ใน the ADC_SMPR1 และ ADC_SMPR2 registers. แต่ละ channel สามารถถูกสุ่มด้วย a different sample time(เวลาสุ่มที่ต่างกัน).

The total conversion time ถูกคำนวณดังต่อไปนี้ :
     Tconv = Sampling time + 12.5 cycles

ตัวอย่าง:
     ด้วย an ADCCLK = 14 MHz และ a sampling time เท่ากับ 1.5 cycles:
     Tconv = 1.5 + 12.5 = 14 cycles = 1 μs
Title: Re: STM32F1 ADC HAL
Post by: tha on October 10, 2020, 01:48:28 PM
11.7 Conversion on external trigger
Conversion สามารถถูกทริกโดย an external event (ตัวอย่างเช่น timer capture, EXTI line). ถ้า the EXTTRIG control bit ถูกเซ็ตเมื่อนั้น external events สามารถที่จะทริก a conversion. The EXTSEL[2:0] และ JEXTSEL[2:0] control bits ยอมให้ the application เลือกตัดสินใจจาก 8 events ที่เป็นได้ให้สามารถทริก conversion สำหรับ the regular และ injected groups.

Note: เมื่อ an external trigger ถูกเลือกสำหรับ ADC regular หรือ injected conversion, มีเพียงขอบขาขึ้นของสัญญานเท่านั้นที่สามารถสตาร์ท the conversion.

(https://i.imgur.com/ehTjWd5.png)

1. The TIM8_TRGO event มีใน high-density และ XL-density devices เท่านั้น.
2. การเลือกของ the external trigger EXTI line11 หรือ TIM8_TRGO event สำหรับ regular channels ถูกทำได้โดยผ่านการกำหนดค่าบิต ADC1_ETRGREG_REMAP และ ADC2_ETRGREG_REMAP สำหรับ ADC1 และ ADC2, ตามลำดับ.

(https://i.imgur.com/I5WchXz.png)

The software source trigger events สามารถถูกทำให้เกิดขึ้นโดยการเซ็ตบิตนี้ใน a register (SWSTART และ JSWSTART ใน ADC_CR2).

A regular group conversion สามารถถูกอินเตอรัพท์โดย an injected trigger.

Title: Re: STM32F1 ADC HAL
Post by: tha on October 10, 2020, 03:17:08 PM
11.8 DMA request
เมื่อ converted regular channels value ถูกเก็บใน a unique(หนึ่งเดียว) data register, มันมีความจำเป็นใช้ DMA สำหรับการแปลงมากกว่าหนึ่ง regular channel. นี้หลีกเลี่ยงการสูญหายของ data ที่ถูกเก็บใน the ADC_DR register แล้ว.

เพียงการสิ้นสุดของการแปลงของ a regular channel เท่านั้นที่ทำให้เกิด a DMA request ขึ้น, ซึ่งยอมให้การ transfer ของ data ที่แปลงเสร็จของมันจาก the ADC_DR register ไปยังตำแหน่งปลายทางที่ถูกเลือกโดยผู้ใช้.

Note: เพียง ADC1 และ ADC3 ที่มีความสามารถทาง DMA นี้. ADC2-converted(ที่แปลงแล้วเสร็จ) data สามารถที่จะถูก transferred ใน dual ADC mode โดยใช้ DMA โดยขึ้นกับ master ADC1.
Title: Re: STM32F1 ADC HAL
Post by: tha on October 11, 2020, 09:19:07 AM
11.9 Dual ADC mode
ใน mcu เบอร์ที่มี 2 ADCs หรือมากกว่า, dual ADC mode สามารถถูกใช้ (ดูรูปที่ 29).

ใน dual ADC mode การสตาร์ทของการแปลงถูกทริกสลับกันหรือพร้อมกันโดย the ADC1 master ไปยัง the ADC2 slave, ขึ้นอยู่กับโหมดที่เลือกโดย the DUALMOD[2:0] bits ใน the ADC1_CR1 register.

Note: ใน dual mode, เมื่อกำหนดค่าการแปลงให้ถูกทริกโดย an external event, ผู้ใช้ต้องเซ็ตการทริกสำหรับ the master เท่านั้นและเซ็ต a software trigger สำหรับ the slave เพื่อป้องกันการทริกแปลกปลอมไปสตาร์ท unwanted slave conversion. อย่างไรก็ตาม, external triggers ต้องถูกเปิดการใช้งานทั้ง master และ slave ADCs.

6 โหมดที่เป็นไปได้ดังต่อไปนี้ถูกจัดให้มีใช้:
     – Injected simultaneous mode
     – Regular simultaneous mode
     – Fast interleaved mode
     – Slow interleaved mode
     – Alternate trigger mode
     – Independent mode

เป็นไปได้ที่จะใช้โหมดที่ว่ามานี้รวมกันตามวิธีดังต่อไปนี้ได้อีกด้วย:
     – Injected simultaneous mode + Regular simultaneous mode
     – Regular simultaneous mode + Alternate trigger mode
     – Injected simultaneous mode + Interleaved mode

Note: ใน dual ADC mode, เพื่ออ่าน the slave converted(ที่แปลงเสร็จ) data บน the master data register, the DMA bit ต้องถูกเปิดการใช้งาน ถึงแม้ว่ามันไม่ได้ถูกใช้เพื่อส่งถ่าย converted(ที่แปลงเสร็จ) regular channel data.

(https://i.imgur.com/Sv5QWmq.png)

1. External triggers ที่มีอยู่ใน ADC2 แต่ไม่ถูกแสดงเพื่อวัตถุประสงค์ของแผนภาพนี้.
2. ในบาง dual ADC modes, the ADC1 data register (ADC1_DR) บรรจุทั้ง ADC1 และ ADC2 regular converted data คลอบคลุมทั้งหมด 32 บิต.
Title: Re: STM32F1 ADC HAL
Post by: tha on October 11, 2020, 10:07:24 AM
11.9.1 Injected simultaneous mode
โหมดนี้จะแปลง an injected channel group. แหล่งของ external trigger มาจาก the injected group mux of ADC1 (ถูกเลือกโดย the JEXTSEL[2:0] bits ใน the ADC1_CR2 register). การทริกที่พร้อมกันถูกจัดไปยัง ADC2.

Note: อย่าแปลงชาแนลเดียวกันบน the two ADCs (อย่าให้เวลาสุ่มเหลื่อมหล้ำกันสำหรับ the two ADCs เมื่อแปลงชาแนลเดียวกัน).

ที่การสิ้นสุดของการแปลงเกิดเหตุการณ์บน ADC1 หรือ ADC2:
     • The converted data ถูกเก็บใน the ADC_JDRx registers ของแต่ละ ADC interface.
     • An JEOC interrupt ถูกทำให้เกิดขึ้น (ถ้าถูกเปิดการใช้งานบนหนึ่งของ the two ADC interfaces) เมื่อ the ADC1/ADC2
        injected channels ถูกแปลงหมด.

Note: ใน simultaneous mode, the same sampling time ที่เท่ากันเป๊ะควรถูกกำหนดสำหรับ the two channels นั้นจะถูกสุ่มที่พร้อมกันโดย ACD1 และ ADC2.

(https://i.imgur.com/PC1LnD6.png)
Title: Re: STM32F1 ADC HAL
Post by: tha on October 11, 2020, 10:47:13 AM
11.9.2 Regular simultaneous mode
ในโหมดนี้จะถูกกระทำบน a regular channel group. แหล่งของ the external trigger มาจาก the regular group mux of ADC1 (ถูกเลือกโดย the EXTSEL[2:0] bits ใน the ADC1_CR2 register). A simultaneous trigger ถูกจัดไปยัง the ADC2.

Note: อย่าแปลงชาแนลเดียวกันบน the two ADCs (อย่าให้เวลาสุ่มเหลื่อมหล้ำกันสำหรับ the two ADCs เมื่อแปลงชาแนลเดียวกัน).

ที่การสิ้นสุดของการแปลงเกิดเหตุการณ์บน ADC1 หรือ ADC2:
     • A 32-bit DMA transfer request ถูกทำให้เกิดขึ้น (ถ้า DMA bit ถูกเซ็ต) ซึ่งส่งถ่ายไปยัง SRAM ด้วย the ADC1_DR 32-bit
        register บรรจุ the ADC2 converted data ใน the upper halfword และ the ADC1 converted data ใน the lower
        halfword.
     • An EOC interrupt ถูกทำให้เกิดขึ้น (ถ้าถูกเปิดการใช้งานบนหนึ่งของ the two ADC interfaces) เมื่อ ADC1/ADC2 regular
       channels ถูกแปลงหมด.

Note: ใน regular simultaneous mode, the same sampling time ที่เท่ากันเป๊ะควรถูกกำหนดสำหรับ the two channels นั้นจะถูกสุ่มที่พร้อมกันโดย ACD1 และ ADC2.

(https://i.imgur.com/9aay5X8.png)
Title: Re: STM32F1 ADC HAL
Post by: tha on October 12, 2020, 08:30:09 AM
11.9.3 Fast interleaved mode
โหมดนี้สามารถถูกสตาร์ทได้เพียงบน a regular channel group (โดยปกติจะมีหนึ่ง channel). แหล่งของ external trigger มาจาก the regular channel mux of ADC1. หลังจากที่ an external trigger เกิดขึ้น :
     • ADC2 สตาร์ทโดยทันทีและ
     • ADC1 สตาร์ทหลังจากดีเลย์ไป 7 ADC clock cycles.

ถ้า CONT bit ถูกเซ็ตบนทั้ง ADC1 และ ADC2 the selected regular channels ของทั้งสอง ADCs ถูกแปลงต่อเนื่องไปตลอด.

หลังจาก an EOC interrupt ถูกทำให้เกิดขึ้นโดย ADC1 (ถ้าเปิดการใช้งานผ่านทาง the EOCIE bit) A 32-bit DMA transfer request ถูกทำให้เกิดขึ้น (ถ้า DMA bit ถูกเซ็ต) ซึ่งส่งถ่ายไปยัง SRAM ด้วย the ADC1_DR 32-bit register บรรจุ the ADC2 converted data ใน the upper halfword และ the ADC1 converted data ใน the lower halfword.

Note: The maximum sampling time ที่ยอมได้คือ <7 ADCCLK cycles เพื่อหลีกเลี่ยงการเหลื่อมกันระหว่าง ADC1 และ ADC2 sampling phases ในกรณีที่ทั้งสอง ADCs แปลงชาแนลเดียวกัน.

(https://i.imgur.com/GmqXPm3.png)
Title: Re: STM32F1 ADC HAL
Post by: tha on October 12, 2020, 09:12:50 AM
11.9.4 Slow interleaved mode
โหมดนี้สามารถถูกสตาร์ทได้เพียงบน a regular channel group (มีเพียงหนึ่งชาแนลเท่านั้น). แหล่งของ external trigger มาจาก regular channel mux of ADC1. หลังจากที่ an external trigger เกิดขึ้น :
     • ADC2 สตาร์ทโดยทันทีและ
     • ADC1 สตาร์ทหลังจากดีเลย์ไป 14 ADC clock cycles.
     • ADC2 สตาร์ทหลังจากดีเลย์ไปสองของ 14 ADC cycles, และดำเนินไปตามนี้.

Note: The maximum sampling time ที่ยอมได้คือ <14 ADCCLK cycles เพื่อหลีกเลี่ยงการเหลื่อมกันด้วยการแปลงถัดไป.

หลังจาก an EOC interrupt ถูกทำให้เกิดขึ้นโดย ADC1 (ถ้าเปิดการใช้งานผ่านทาง the EOCIE bit) A 32-bit DMA transfer request ถูกทำให้เกิดขึ้น (ถ้า DMA bit ถูกเซ็ต) ซึ่งส่งถ่ายไปยัง SRAM ด้วย the ADC1_DR 32-bit register บรรจุ the ADC2 converted data ใน the upper halfword และ the ADC1 converted data ใน the lower halfword.

A new ADC2 start ถูกทำให้เกิดขึ้นโดยอัตโนมัติหลังจาก 28 ADC clock cycles

CONT bit ไม่สามารถถูกเซ็ตในโหมดนี้ เนื่องมาจากมันจะแปลง the selected regular channel อย่างต่อเนื่อง.

Note: The application ต้องแน่ใจว่าไม่มี external trigger สำหรับ injected channel เกิดขึ้นเมื่อ interleaved mode ถูกเปิดการใช้งาน.

(https://i.imgur.com/b2JKPve.png)
Title: Re: STM32F1 ADC HAL
Post by: tha on October 12, 2020, 12:08:48 PM
11.9.5 Alternate trigger mode (โหมดการทริกที่สลับกัน)
โหมดนี้สามารถถูกสตาร์ทได้เพียงบน an injected channel group. แหล่งของ external trigger มาจาก the injected group mux of ADC1.
     • เมื่อ the first trigger เกิดขึ้น, injected group channels ทั้งหมดใน ADC1 ถูกแปลง.
     • เมื่อ the second trigger มาถึง, injected group channels ทั้งหมดใน ADC2 ถูกแปลง
     • และดำเนินต่อไป.

A JEOC interrupt, ถ้าถูกเปิดการใช้งาน, จะถูกทำให้เกิดขึ้นหลังจาก injected group channels ทั้งหมดของ ADC1 ถูกแปลง.

A JEOC interrupt, ถ้าถูกเปิดการใช้งาน, จะถูกทำให้เกิดขึ้นหลังจาก injected group channels ทั้งหมดของ ADC1 ถูกแปลง.

ถ้า external trigger อื่นอีกเกิดขึ้นหลังจาก injected group channels ทั้งหมดถูกแปลงเสร็จแล้ว เมื่อนั้น the alternate trigger process (กระบวนการทริกที่สลับกัน) จะเริ่มใหม่โดยการแปลง ADC1 injected group channels

(https://i.imgur.com/NF6swxe.png)

ถ้า the injected discontinuous mode ถูกเปิดการใช้งานสำหรับทั้ง ADC1 และ ADC2:
     • เมื่อ the first trigger เกิด, the first injected channel ใน ADC1 ถูกแปลง.
     • เมื่อ the second trigger มาถึง, the first injected channel ใน ADC2 ถูกแปลง
     • และดำเนินต่อไป....

A JEOC interrupt, ถ้าถูกเปิดการใช้งาน, จะถูกทำให้เกิดขึ้นหลังจาก injected group channels ทั้งหมดของ ADC1 ถูกแปลง.

A JEOC interrupt, ถ้าถูกเปิดการใช้งาน, จะถูกทำให้เกิดขึ้นหลังจาก injected group channels ทั้งหมดของ ADC2 ถูกแปลง.

ถ้า external trigger อื่นอีกเกิดขึ้นหลังจาก injected group channels ทั้งหมดถูกแปลงเสร็จแล้ว เมื่อนั้น the alternate trigger process (กระบวนการทริกที่สลับกัน) จะเริ่มใหม่

(https://i.imgur.com/W5bPkOi.png)
Title: Re: STM32F1 ADC HAL
Post by: tha on October 13, 2020, 08:21:02 AM
11.9.6 Independent mode
ในโหมดนี้ the dual ADC synchronization ถูกข้ามและแต่ละ ADC interfaces ทำงานอย่างอิสระ

11.9.7 Combined regular/injected simultaneous mode
มันเป็นไปได้ที่จะอินเตอรัพท์ simultaneous conversion ของ a regular group เพื่อไปสตาร์ท simultaneous conversion ของ an injected group.

Note: ใน combined regular/injected simultaneous mode, the same sampling time ที่เท่ากันเป๊ะควรถูกกำหนดสำหรับ the two channels ที่จะถูกสุ่มพร้อมกันโดย ACD1 และ ADC2.
Title: Re: STM32F1 ADC HAL
Post by: tha on October 13, 2020, 12:33:40 PM
11.9.8 Combined regular simultaneous + alternate trigger mode
มันเป็นไปได้ที่จะอินเตอรัพท์ regular group simultaneous conversion เพื่อไปสตาร์ท alternate trigger conversion ของ an injected group. Figure 36 แสดงพฤติกรรมของ an alternate trigger อินเตอรัพท์ a regular simultaneous conversion.

The injected alternate conversion ถูกสตาร์ทโดยทันทีหลังจาก the injected event มาถึง. ถ้า regular conversion กำลังรันอยู่, เพื่อให้แน่ใจว่า synchronization(การเกิดขึ้นพร้อมกัน) หลังจาก the injected conversion, the regular conversion ของทั้ง (master/slave) ADCs ถูกหยุดและกลับคืนมาพร้อมกันที่การสิ้นสุดของ the injected conversion.

Note: ใน combined regular simultaneous + alternate trigger mode, the same sampling time ที่เท่ากันเป๊ะควรถูกกำหนดสำหรับ the two channels ที่จะถูกสุ่มพร้อมกันโดย ACD1 และ ADC2.

(https://i.imgur.com/BqyfAfe.png)

ถ้า a trigger เกิดขึ้นในระหว่าง an injected conversion ที่ไปอินเตอรัพท์ a regular conversion, มันจะถูกเพิกเฉย. Figure 37 แสดงพฤติกรรมของกรณีนี้ (the second trigger ถูกเพิกเฉย).

(https://i.imgur.com/ukeYn0n.png)
Title: Re: STM32F1 ADC HAL
Post by: tha on October 13, 2020, 01:06:55 PM
11.9.9 Combined injected simultaneous + interleaved
มันเป็นไปได้ที่จะอินเตอรัพท์ an interleaved conversion ด้วย an injected event. ในกรณีนี้ the interleaved conversion ถูกอินเตอรัพท์และ the injected conversion สตาร์ท, ที่การสิ้นสุดของ the injected sequence the interleaved conversion ถูกคืนกลับ. Figure 38 แสดงพฤติกรรมการใช้ตัวอย่างนี้.

Note: เมื่อ the ADC clock prescaler ถูกเซ็ตเป็น 4, the interleaved mode ไม่กู้คืนด้วย sampling periods ที่เว้นระยะโดยสม่ำเสมอ: the sampling interval คือ 8 ADC clock periods ติดตามโดย 6 ADC clock periods, แทนที่จะเป็น 7 clock periods ติดตามโดย 7 clock periods.

(https://i.imgur.com/KefJVvN.png)
Title: Re: STM32F1 ADC HAL
Post by: tha on October 14, 2020, 09:14:05 AM
11.10 Temperature sensor
The temperature sensor สามารถถูกใช้วัด the ambient temperature (TA) ของ the device.

The temperature sensor ถูกต่อภายในถึง the ADCx_IN16 input channel ซึ่งถูกใช้เพื่อแปลง the sensor output voltage ไปเป็น a digital value. The recommended sampling time สำหรับ the temperature sensor คือ 17.1 μs.

The block diagram ของ the temperature sensor ถูกแสดงใน Figure 39.

เมื่อไม่ได้ใช้, sensor นี้สามารถถูกใส่ไว้ใน power down mode.

Note: The TSVREFE bit ต้องถูกเซ็ตเพื่อเปิดการใช้งานทั้ง internal channels: ADCx_IN16 (temperature sensor) และ ADCx_IN17 (VREFINT) conversion.

The temperature sensor output voltage เปลี่ยนแปลงเชิงเส้นตามอุณหภูมิ The offset ของ line นี้แตกต่างกันจากชิปหนึ่งไปยังชิปหนึ่งเนื่องจากความแตกต่างกันของขบวนการผลิต (มากถึง 45 °C จากชิปหนึ่งไปยังชิปอื่นๆ).

The internal temperature sensor เหมาะมากกับ applications ที่ตรวจจับ temperature variations แทนที่จะเป็น absolute temperatures. ถ้า accurate temperature readings ถูกต้องการ, an external temperature sensor part ควรถูกใช้.

(https://i.imgur.com/FQJnR6I.png)

Reading the temperature
เพื่อใช้ the sensor:
1. เลือก the ADCx_IN16 input channel.
2. เลือก a sample time เป็น 17.1 μs
3. เซ็ต the TSVREFE bit ใน the ADC control register 2 (ADC_CR2) เพื่อปลุก the temperature sensor จาก power down mode.
4. สตาร์ท the ADC conversion โดยการเซ็ต the ADON bit (หรือโดย external trigger).
5. อ่าน the resulting VSENSE data ใน the ADC data register
6. ได้มาซึ่ง the temperature โดยใช้สูตรดังต่อไปนี้ :
     Temperature (in °C) = {(V25 - VSENSE) / Avg_Slope} + 25.
     เมื่อ,
     V25 = VSENSE value for 25° C และ
     Avg_Slope = Average Slope สำหรับ curve ระหว่าง Temperature vs. VSENSE (ถูกให้ใน mV/° C หรือ μV/ °C).

อ้างอิงถึง the Electrical characteristics section สำหรับค่าที่แท้จริงของ V25 และ Avg_Slope.

Note: The sensor มี a startup time หลังจากการปลุกจาก power down mode ก่อนมันสามารถเอ๊าพุท VSENSE ที่ระดับที่ถูกต้อง. The ADC ก็มี a startup time หลังจาก power-on, ดังนั้นเพื่อลดการหน่วงเวลา, the ADON และ TSVREFE bits ควรถูกเซ็ตที่เวลาเดียวกัน.

ปล. มีไม่เคลียร์ก็ที่ "The offset ของ line" ก็ยังไม่เข้าใจอยู่ ไม่รู้แปลถูกหรือเปล่า ช่วยดูกันด้วยนะครับ
Title: Re: STM32F1 ADC HAL
Post by: tha on October 14, 2020, 09:37:35 AM
ก็มีตัวอย่างเก่าอยู่ สำหรับการวัด Temp วัด Vref ใช้ DMA ด้วย เป็นโปรแกรม CooCox ก็ลองดัดแปลงดู
http://www.mediafire.com/file/z6gh1q8wz4rp1r0/ADC_DMA.rar/file (http://www.mediafire.com/file/z6gh1q8wz4rp1r0/ADC_DMA.rar/file)
Title: Re: STM32F1 ADC HAL
Post by: tha on October 14, 2020, 10:32:44 AM
11.11 ADC interrupts
An interrupt สามารถถูกทำให้เกิดขึ้นบนการสิ้นสุดของ conversion สำหรับ regular และ injected groups และเมื่อ the analog watchdog status bit ถูกเซ็ต. Separate(แยกต่างหาก) interrupt enable bits มีให้ใช้สำหรับความยืดหยุ่น.

Note: ADC1 และ ADC2 interrupts ถูก mapped เข้าด้วยกันบน the same interrupt vector. ADC3 interrupts ถูก
mapped บน a separate(แยกต่างหาก) interrupt vector.

2 flags อื่นอีกที่แสดงใน the ADC_SR register, แต่ไม่มี interrupt ที่เกี่ยวพันกับมัน :
     • JSTRT (Start of conversion for injected group channels)
     • STRT (Start of conversion for regular group channels)

(https://i.imgur.com/RfWY5fU.png)
Title: Re: STM32F1 ADC HAL
Post by: tha on October 14, 2020, 12:27:39 PM
11.12 ADC registers
อ้างถึงส่วน 2.2 ในหน้า 45 สำหรับรายการตัวย่อที่ใช้ใน register descriptions.
The peripheral registers สามารถถูกเข้าถึงโดย words (32-bit).

(https://i.imgur.com/Fi0fTuJ.png)

Bits 31:5 สงวนไว้, ต้องถูกเก็บไว้ที่ค่ารีเซ็ต.
Bit 4 STRT: Regular channel Start flag
บิตนี้ถูกเซ็ตโดย hardware เมื่อ regular channel conversion สตาร์ท. มันถูกเคลียร์โดย software.
     0: ไม่มี regular channel conversion ถูกสตาร์ท
     1: Regular channel conversion ถูกสตาร์ทแล้ว

Bit 3 JSTRT: Injected channel Start flag
บิตนี้ถูกเซ็ตโดย hardware เมื่อ injected channel group conversion สตาร์ท. มันถูกเคลียร์โดย software.
     0: ไม่มี injected group conversion ถูกสตาร์ท
     1: Injected group conversion ถูกสตาร์ทแล้ว

Bit 2 JEOC: Injected channel end of conversion
บิตนี้ถูกเซ็ตโดย hardware ที่การสิ้นสุดของ injected group channel conversion ทั้งหมด.  มันถูกเคลียร์โดย software.
     0: Conversion ยังไม่เสร็จสมบูรณ์
     1: Conversion เสร็จสมบูรณ์

Bit 1 EOC: End of conversion
บิตนี้ถูกเซ็ตโดย hardware ที่การสิ้นสุดของ a group channel conversion (regular หรือ injected). มันถูกเคลียร์โดย software หรือโดยการอ่าน the ADC_DR.
     0: Conversion ยังไม่เสร็จสมบูรณ์
     1: Conversion เสร็จสมบูรณ์

Bit 0 AWD: Analog watchdog flag
บิตนี้ถูกเซ็ตโดย hardware เมื่อ the converted voltage ข้ามค่าที่โปรแกรมใน the ADC_LTR and ADC_HTR registers. มันถูกเคลียร์โดย software.
     0: ไม่มี Analog watchdog event เกิดขึ้น
     1: Analog watchdog event เกิดขึ้น
Title: Re: STM32F1 ADC HAL
Post by: tha on October 14, 2020, 02:40:32 PM
(https://i.imgur.com/vHtljsh.png)

Bits 31:24 สงวนไว้, ต้องถูกเก็บไว้ที่ค่ารีเซ็ต.
Bit 23 AWDEN: Analog watchdog enable on regular channels
บิตนี้ถูกเซ็ต/รีเซ็ตโดย software.
     0: Analog watchdog ปิดการใช้งานอยู่บน regular channels
     1: Analog watchdog เปิดการใช้งานอยู่บน regular channels

Bit 22 JAWDEN: Analog watchdog enable on injected channels
บิตนี้ถูกเซ็ต/รีเซ็ตโดย software.
     0: Analog watchdog ปิดการใช้งานอยู่บน injected channels
     1: Analog watchdog เปิดการใช้งานอยู่บน injected channels

Bits 21:20 สงวนไว้, ต้องถูกเก็บไว้ที่ค่ารีเซ็ต.
Bits 19:16 DUALMOD[3:0]: Dual mode selection
บิตนี้ถูกเขียนโดย software เพื่อเลือก the operating mode.
     0000: Independent mode.
     0001: Combined regular simultaneous + injected simultaneous mode
     0010: Combined regular simultaneous + alternate trigger mode
     0011: Combined injected simultaneous + fast interleaved mode
     0100: Combined injected simultaneous + slow Interleaved mode
     0101: Injected simultaneous mode only
     0110: Regular simultaneous mode only
     0111: Fast interleaved mode only
     1000: Slow interleaved mode only
     1001: Alternate trigger mode only
Note: บิตเหล่านี้ถูกสงวนไว้ใน ADC2 และ ADC3.
ใน dual mode, การเปลี่ยนแปลงของการกำหนดค่าชาแนลทำให้เกิดการรีสตาร์ทที่สามารถสร้างการสูญเสียของ synchronization(การประสานกัน). สนับสนุนให้ปิดการใช้งาน dual mode ก่อนการเปลี่ยนการกำหนดค่าใดๆ.

Bits 15:13 DISCNUM[2:0]: Discontinuous mode channel count
บิตเหล่านี้ถูกเขียนโดย software เพื่อกำหนดจำนวนของ regular channels ที่จะถูกแปลงใน discontinuous mode, หลังจากการรับ an external trigger.
     000: 1 channel
     001: 2 channels
     .......
     111: 8 channels

Bit 12 JDISCEN: Discontinuous mode on injected channels
บิตนี้เซ็ตและเคลียร์โดย software เพื่อ enable/disable discontinuous mode บน injected group channels
     0: Discontinuous mode on injected channels ปิดการใช้งานอยู่
     1: Discontinuous mode on injected channels เปิดการใช้งานอยู่

Bit 11 DISCEN: Discontinuous mode on regular channels
บิตนี้เซ็ตและเคลียร์โดย software เพื่อ enable/disable Discontinuous mode บน regular channels.
     0: Discontinuous mode on regular channels ปิดการใช้งานอยู่
     1: Discontinuous mode on regular channels เปิดการใช้งานอยู่

Bit 10 JAUTO: Automatic Injected Group conversion
บิตนี้เซ็ตและเคลียร์โดย software เพื่อ enable/disable automatic injected group conversion หลังจาก regular group conversion.
     0: Automatic injected group conversion ปิดการใช้งานอยู่
     1: Automatic injected group conversion เปิดการใช้งานอยู่

Bit 9 AWDSGL: Enable the watchdog on a single channel in scan mode
บิตนี้เซ็ตและเคลียร์โดย software เพื่อ enable/disable the analog watchdog บน the channel ระบุโดย the AWDCH[4:0] bits.
     0: Analog watchdog เปิดการใช้งานอยู่บนทุก channels
     1: Analog watchdog เปิดการใช้งานอยู่บน a single channel

Bit 8 SCAN: Scan mode
บิตนี้เซ็ตและเคลียร์โดย software เพื่อ enable/disable Scan mode. ใน Scan mode, the inputs ถูกเลือกผ่านทาง the ADC_SQRx หรือ ADC_JSQRx registers ถูกแปลง.
     0: Scan mode ปิดการใช้งานอยู่
     1: Scan mode เปิดการใช้งานอยู่
Note: An EOC หรือ JEOC interrupt ถูกทำให้เกิดขึ้นเพียงการสิ้นสุดของ conversion ของชาแนลสุดท้าย ถ้า the corresponding(ที่ตรงกัน) EOCIE หรือ JEOCIE bit ถูกเซ็ต

Bit 7 JEOCIE: Interrupt enable for injected channels
บิตนี้เซ็ตและเคลียร์โดย software เพื่อ enable/disable the end of conversion interrupt สำหรับ injected channels.
     0: JEOC interrupt ปิดการใช้งานอยู่
     1: JEOC interrupt เปิดการใช้งานอยู่. An interrupt ถูกทำให้เกิดขึ้นเมื่อ the JEOC bit ถูกเซ็ต.

Bit 6 AWDIE: Analog watchdog interrupt enable
บิตนี้เซ็ตและเคลียร์โดย software เพื่อ enable/disable the analog watchdog interrupt.
     0: Analog watchdog interrupt ปิดการใช้งานอยู่
     1: Analog watchdog interrupt เปิดการใช้งานอยู่

Bit 5 EOCIE: Interrupt enable for EOC
บิตนี้เซ็ตและเคลียร์โดย software เพื่อ enable/disable the End of Conversion interrupt.
     0: EOC interrupt ปิดการใช้งานอยู่
     1: EOC interrupt เปิดการใช้งานอยู่. An interrupt ถูกทำให้เกิดขึ้นเมื่อ the EOC bit ถูกเซ็ต.

Bits 4:0 AWDCH[4:0]: Analog watchdog channel select bits
บิตเหล่านี้เซ็ตและเคลียร์โดย software. มันเลือก the input channel ที่จะถูกปกป้องโดย the Analog watchdog.
     00000: ADC analog Channel0
     00001: ADC analog Channel1
     ....
     01111: ADC analog Channel15
     10000: ADC analog Channel16
     10001: ADC analog Channel17
     ค่าอื่นๆถูกสงวนไว้.
Note: ADC1 analog Channel16 และ Channel17 ถูกต่อภายในถึง the temperature sensor และถึง VREFINT, ตามลำดับ.
         ADC2 analog inputs Channel16 และ Channel17 ถูกต่อภายในถึง VSS.
         ADC3 analog inputs Channel9, Channel14, Channel15, Channel16 and Channel17 ถูกต่อถึง VSS.
Title: Re: STM32F1 ADC HAL
Post by: tha on October 15, 2020, 09:31:06 AM
(https://i.imgur.com/ezKM7BX.png)

Bits 31:24 สงวนไว้, ต้องถูกเก็บไว้ที่ค่ารีเซ็ต.

Bit 23 TSVREFE: Temperature sensor and VREFINT enable
บิตนี้เซ็ตและเคลียร์โดย software เพื่อ enable/disable the temperature sensor และ VREFINT channel. ใน mcu เบอร์ที่มี dual ADCs บิตนี้มีอยู่ใน ADC1 เท่านั้น.
     0: Temperature sensor and VREFINT channel disabled
     1: Temperature sensor and VREFINT channel enabled

Bit 22 SWSTART: Start conversion of regular channels
บิตนี้เซ็ตโดย software เพื่อ start conversion และเคลียร์โดย hardware ทันทีที่ conversion สตาร์ท. มันสตาร์ท a conversion ของ a group ของ regular channels ถ้า SWSTART ถูกเลือกเป็น trigger event โดย the EXTSEL[2:0] bits.
     0: Reset state
     1: Starts conversion of regular channels

Bit 21 JSWSTART: Start conversion of injected channels
บิตนี้เซ็ตโดย software เพื่อ start conversion และเคลียร์โดย hardware ทันทีที่ conversion สตาร์ท. มันสตาร์ท a conversion ของ a group ของ injected channels (ถ้า JSWSTART ถูกเลือกเป็น trigger event โดย the JEXTSEL[2:0] bits.
     0: Reset state
     1: Starts conversion of injected channels

Bit 20 EXTTRIG: External trigger conversion mode for regular channels
บิตนี้เซ็ตและเคลียร์โดย software เพื่อ enable/disable the external trigger ใช้เพื่อสตาร์ท conversion ของ a regular channel group.
     0: Conversion on external event disabled
     1: Conversion on external event enabled

Bits 19:17 EXTSEL[2:0]: External event select for regular group
บิตเหล่านี้เลือก the external event ใช้เพื่อทริก the start of conversion ของ a regular group:
สำหรับ ADC1 และ ADC2, ทริกที่กำหนดคือ :
     000: Timer 1 CC1 event
     001: Timer 1 CC2 event
     010: Timer 1 CC3 event
     011: Timer 2 CC2 event
     100: Timer 3 TRGO event
     101: Timer 4 CC4 event
     110: EXTI line 11/TIM8_TRGO event (TIM8_TRGO มีให้ใช้ใน high-density and XLdensity devices เท่านั้น)
     111: SWSTART

     สำหรับ ADC3, ทริกที่กำหนดคือ:
     000: Timer 3 CC1 event
     001: Timer 2 CC3 event
     010: Timer 1 CC3 event
     011: Timer 8 CC1 event
     100: Timer 8 TRGO event
     101: Timer 5 CC1 event
     110: Timer 5 CC3 event
     111: SWSTART

Bit 16 Reserved, must be kept at reset value.

Bit 15 JEXTTRIG: External trigger conversion mode for injected channels
บิตนี้เซ็ตและเคลียร์โดย software เพื่อ enable/disable the external trigger ใช้เพื่อสตาร์ท conversion ของ an injected channel group.
     0: Conversion on external event disabled
     1: Conversion on external event enabled

Bits 14:12 JEXTSEL[2:0]: External event select for injected group
บิตเหล่านี้เลือก the external event used ใช้เพื่อทริก the start of conversion of an injected group:
For ADC1 and ADC2 the assigned triggers are:
     000: Timer 1 TRGO event
     001: Timer 1 CC4 event
     010: Timer 2 TRGO event
     011: Timer 2 CC1 event
     100: Timer 3 CC4 event
     101: Timer 4 TRGO event
     110: EXTI line15/TIM8_CC4 event (TIM8_CC4 is available only in high-density and XLdensity devices)
     111: JSWSTART

     For ADC3 the assigned triggers are:
     000: Timer 1 TRGO event
     001: Timer 1 CC4 event
     010: Timer 4 CC3 event
     011: Timer 8 CC2 event
     100: Timer 8 CC4 event
     101: Timer 5 TRGO event
     110: Timer 5 CC4 event
     111: JSWSTART

Bit 11 ALIGN: Data alignment
บิตนี้เซ็ตและเคลียร์โดย software. อ้างอิงถึง Figure 27.and Figure 28.
     0: Right Alignment
     1: Left Alignment

Bits 10:9 Reserved, must be kept at reset value.
Bit 8 DMA: Direct memory access mode
บิตนี้เซ็ตและเคลียร์โดย software. อ้างอิงถึง the DMA controller chapter สำหรับรายละเอียดที่มากขึ้น.
     0: DMA mode disabled
     1: DMA mode enabled
มีเพียง ADC1 และ ADC3 เท่านั้นที่สามารถทำให้เกิด a DMA request.

Bits 7:4 Reserved, must be kept at reset value.

Bit 3 RSTCAL: Reset calibration
บิตนี้เซ็ตโดย software และเคลียร์โดย hardware. มันจะถูกเคลียร์หลังจาก the calibration registers ถูกเริ่มต้น.
     0: Calibration register เริ่มต้นไปแล้ว.
     1: เริ่มต้น calibration register.
Note: ถ้า RSTCAL ถูกเซ็ตเมื่อ conversion กำลังดำเนินอยู่, จำเป็นต้องมี cycles เพิ่มเติมเพื่อเคลียร์ the calibration registers.

Bit 2 CAL: A/D Calibration
บิตนี้เซ็ตโดย software เพื่อ start the calibration. มันถูกรีเซ็ตโดย hardware หลังจาก calibration เสร็จสมบูรณ์.
     0: Calibration เสร็จสมบูรณ์แล้ว
     1: Enable calibration

Bit 1 CONT: Continuous conversion
บิตนี้ถูกเซ็ตและเคลียร์โดย software. ถ้าเซ็ตการแปลงเกิดขึ้นอย่างต่อเนื่องจนกระทั่งบิตนี้ถูกรีเซ็ต.
     0: Single conversion mode
     1: Continuous conversion mode

Bit 0 ADON: A/D converter ON / OFF
บิตนี้ถูกเซ็ตและเคลียร์โดย software. หากบิตนี้มีค่าเป็นศูนย์อยู่และ1 ถูกเขียนไปยังมัน เมื่อนั้นมันจะ wakes up the ADC จาก Power Down state.
Conversion สตาร์ทเมื่อบิตนี้มีค่าเป็น 1 อยู่และ 1 ถูกเขียนไปยังมัน. The application ควรยอมให้มีการหน่วงเวลาของ tSTAB ระหว่าง power up และ start of conversion. อ้างอิงถึง Figure 23.
     0: Disable ADC conversion/calibration and go to power down mode.
     1: Enable ADC and to start conversion
Note: ถ้าบิตอื่นๆใน register นี้นอกเหนือจาก ADON ถูกเปลี่ยนในเวลาเดียวกัน, เมื่อนั้น conversion จะไม่ถูกทริก. นี้เป็นการป้องกันการทริกการแปลงที่ผิดพลาด.
Title: Re: STM32F1 ADC HAL
Post by: tha on October 15, 2020, 11:59:42 AM
(https://i.imgur.com/QdHDIhr.png)

Bits 31:24 Reserved, must be kept at reset value.
Bits 23:0 SMPx[2:0]: Channel x Sample time selection
บิตเหล่านี้ถูกเขียนโดย software เพื่อเลือก the sample time ที่แยกกันสำหรับแต่ละ channel. ในระหว่างรอบการสุ่ม(sample cycles) channel selection bits ต้องยังคงไม่เปลี่ยนแปลง.
     000: 1.5 cycles
     001: 7.5 cycles
     010: 13.5 cycles
     011: 28.5 cycles
     100: 41.5 cycles
     101: 55.5 cycles
     110: 71.5 cycles
     111: 239.5 cycles

Note: ADC1 analog Channel16 และ Channel17 ถูกต่อภายในถึง the temperature sensor และถึง VREFINT, ตามลำดับ.
         ADC2 analog inputs Channel16 และ Channel17 ถูกต่อภายในถึง VSS.
         ADC3 analog inputs Channel14, Channel15, Channel16 and Channel17 ถูกต่อถึง VSS.
Title: Re: STM32F1 ADC HAL
Post by: tha on October 15, 2020, 12:05:34 PM
(https://i.imgur.com/yZJRLQs.png)

Bits 31:30 Reserved, must be kept at reset value.
Bits 29:0 SMPx[2:0]: Channel x Sample time selection
บิตเหล่านี้ถูกเขียนโดย software เพื่อเลือก the sample time ที่แยกกันสำหรับแต่ละ channel. ในระหว่างรอบการสุ่ม(sample cycles) channel selection bits ต้องยังคงไม่เปลี่ยนแปลง.
     000: 1.5 cycles
     001: 7.5 cycles
     010: 13.5 cycles
     011: 28.5 cycles
     100: 41.5 cycles
     101: 55.5 cycles
     110: 71.5 cycles
     111: 239.5 cycles

Note: ADC3 analog inputs Channel9 ถูกต่อถึง VSS.
Title: Re: STM32F1 ADC HAL
Post by: tha on October 15, 2020, 12:14:34 PM
(https://i.imgur.com/PwtFcmA.png)

Bits 31:12 Reserved, must be kept at reset value.

Bits 11:0 JOFFSETx[11:0]: Data offset for injected channel x
บิตเหล่านี้ถูกเขียนโดย software เพื่อกำหนดค่า offset เพื่อจะลบออกจาก the raw(ดิบ) converted data เมื่อทำการแปลง injected channels. The conversion result สามารถถูกอ่านจากใน the ADC_JDRx registers.
Title: Re: STM32F1 ADC HAL
Post by: tha on October 16, 2020, 08:34:24 AM
(https://i.imgur.com/D7uIU1w.png)

Bits 31:12 Reserved, must be kept at reset value.
Bits 11:0 HT[11:0]: Analog watchdog high threshold
บิตเหล่านี้ถูกเขียนโดย software เพื่อกำหนด the high threshold สำหรับ the analog watchdog.

Note: The software สามารถเขียนไปยัง registers เมื่อ an ADC conversion กำลังดำเนินอยู่. ค่าที่โปรแกรมจะมีผลเมื่อการแปลงถัดไปเสร็จสมบูรณ์. การเขียนไปยัง register นี้ถูกดำเนินการด้วยความหน่วงเวลาในการเขียนที่สามารถสร้างความไม่แน่นอนเกี่ยวกับ the effective time ที่ซึ่งค่าใหม่ถูกโปรแกรม
Title: Re: STM32F1 ADC HAL
Post by: tha on October 16, 2020, 08:39:03 AM
(https://i.imgur.com/NWsvDPT.png)

Bits 31:12 Reserved, must be kept at reset value.
Bits 11:0 LT[11:0]: Analog watchdog low threshold
บิตเหล่านี้ถูกเขียนโดย software เพื่อกำหนด the low threshold สำหรับ the analog watchdog.

Note: The software สามารถเขียนไปยัง registers เมื่อ an ADC conversion กำลังดำเนินอยู่. ค่าที่โปรแกรมจะมีผลเมื่อการแปลงถัดไปเสร็จสมบูรณ์. การเขียนไปยัง register นี้ถูกดำเนินการด้วยความหน่วงเวลาในการเขียนที่สามารถสร้างความไม่แน่นอนเกี่ยวกับ the effective time ที่ซึ่งค่าใหม่ถูกโปรแกรม
Title: Re: STM32F1 ADC HAL
Post by: tha on October 16, 2020, 09:12:54 AM
(https://i.imgur.com/JGWohmp.png)

Bits 31:24 Reserved, must be kept at reset value.
Bits 23:20 L[3:0]: Regular channel sequence length
บิตเหล่านี้ถูกเขียนโดย software เพื่อกำหนดจำนวนทั้งหมดของ conversions ใน the regular channel conversion sequence.
     0000: 1 conversion
     0001: 2 conversions
     .....
     1111: 16 conversions

Bits 19:15 SQ16[4:0]: 16th conversion in regular sequence
บิตเหล่านี้ถูกเขียนโดย software ด้วย the channel number (0..17) ระบุเป็นลำดับที่ the 16th ใน the conversion sequence.
Bits 14:10 SQ15[4:0]: 15th conversion in regular sequence
Bits 9:5 SQ14[4:0]: 14th conversion in regular sequence
Bits 4:0 SQ13[4:0]: 13th conversion in regular sequence
Title: Re: STM32F1 ADC HAL
Post by: tha on October 16, 2020, 09:18:42 AM
(https://i.imgur.com/QyXIlKy.png)

Bits 31:30 Reserved, must be kept at reset value.
Bits 29:26 SQ12[4:0]: 12th conversion in regular sequence
บิตเหล่านี้ถูกเขียนโดย software ด้วย the channel number (0..17) ระบุเป็นลำดับที่ the 12th ใน the sequence ที่ถูกแปลง.
Bits 24:20 SQ11[4:0]: 11th conversion in regular sequence
Bits 19:15 SQ10[4:0]: 10th conversion in regular sequence
Bits 14:10 SQ9[4:0]: 9th conversion in regular sequence
Bits 9:5 SQ8[4:0]: 8th conversion in regular sequence
Bits 4:0 SQ7[4:0]: 7th conversion in regular sequence
Title: Re: STM32F1 ADC HAL
Post by: tha on October 16, 2020, 09:22:53 AM
(https://i.imgur.com/anwmxNX.png)

Bits 31:30 Reserved, must be kept at reset value.
Bits 29:25 SQ6[4:0]: 6th conversion in regular sequence
บิตเหล่านี้ถูกเขียนโดย software ด้วย the channel number (0..17) ระบุเป็นลำดับที่ the 6th ใน the sequence ที่ถูกแปลง.
Bits 24:20 SQ5[4:0]: 5th conversion in regular sequence
Bits 19:15 SQ4[4:0]: fourth conversion in regular sequence
Bits 14:10 SQ3[4:0]: third conversion in regular sequence
Bits 9:5 SQ2[4:0]: second conversion in regular sequence
Bits 4:0 SQ1[4:0]: first conversion in regular sequence
Title: Re: STM32F1 ADC HAL
Post by: tha on October 16, 2020, 01:10:20 PM
(https://i.imgur.com/ECkdjH4.png)

Bits 31:22 Reserved, must be kept at reset value.
Bits 21:20 JL[1:0]: Injected sequence length
บิตเหล่านี้ถูกเขียนโดย software เพื่อกำหนดจำนวนทั้งหมดของ conversions ใน the injected channel conversion sequence.
     00: 1 conversion
     01: 2 conversions
     10: 3 conversions
     11: 4 conversions

Bits 19:15 JSQ4[4:0]: fourth conversion in injected sequence (เมื่อ JL[1:0] = 3)           (1)
บิตเหล่านี้ถูกเขียนโดย software ด้วย the channel number (0..17) ระบุเป็นลำดับที่ the fourth ใน the sequence ที่ถูกแปลง.

Note: ไม่เหมือน a regular conversion sequence, ถ้า JL[1:0] length น้อยกว่า 4, the channels ถูกแปลงใน a sequence  สตาร์ทจาก (4-JL). ตัวอย่าง: ADC_JSQR[21:0] = 10
00011 00011 00111 00010 หมายความว่า a scan conversion จะแปลงลำดับชาแนลดังต่อไปนี้ : 7, 3, 3. (ไม่ใช่ 2, 7, 3)

Bits 14:10 JSQ3[4:0]: third conversion in injected sequence (when JL[1:0] = 3)
Bits 9:5 JSQ2[4:0]: second conversion in injected sequence (when JL[1:0] = 3)
Bits 4:0 JSQ1[4:0]: first conversion in injected sequence (when JL[1:0] = 3)

1. เมื่อ JL=3 ( 4 injected conversions ใน the sequencer), the ADC แปลง the channels ตามลำดับนี้:
JSQ1[4:0] >> JSQ2[4:0] >> JSQ3[4:0] >> JSQ4[4:0]

เมื่อ JL=2 ( 3 injected conversions ใน the sequencer), the ADC แปลง the channels ตามลำดับนี้:
JSQ2[4:0] >> JSQ3[4:0] >> JSQ4[4:0]

เมื่อ JL=1 ( 2 injected conversions ใน the sequencer), the ADC แปลง the channels ตามลำดับนี้:
JSQ3[4:0] >> JSQ4[4:0]

เมื่อ JL=0 (1 injected conversion ใน the sequencer), the ADC แปลงเพียง JSQ4[4:0] channel
Title: Re: STM32F1 ADC HAL
Post by: tha on October 16, 2020, 01:19:37 PM
(https://i.imgur.com/ZXKvA56.png)

Bits 31:16 Reserved, must be kept at reset value.
Bits 15:0 JDATA[15:0]: Injected data
บิตเหล่านี้อ่านได้เพียงอย่างเดียว. มันบรรจุ the conversion result จาก injected channel x. The data ถูกวางแนวชิดซ้ายหรือชิดขวาดังแสดงใน Figure 27 และ Figure 28.
Title: Re: STM32F1 ADC HAL
Post by: tha on October 16, 2020, 01:25:31 PM
(https://i.imgur.com/UQ0RVJu.png)

Bits 31:16 ADC2DATA[15:0]: ADC2 data
ใน ADC1: ใน dual mode, บิตเหล่านี้บรรจุ the regular data ของ ADC2. อ้างอิงถึง Section 11.9: Dual ADC mode.
ใน ADC2 และ ADC3: บิตเหล่านี้ไม่ได้ถูกใช้.

Bits 15:0 DATA[15:0]: Regular data
บิตเหล่านี้อ่านได้เพียงอย่างเดียว. มันบรรจุ the conversion result จาก the regular channels. The data ถูกวางแนวชิดซ้ายหรือชิดขวาดังแสดงใน Figure 27 และ Figure 28.
Title: Re: STM32F1 ADC HAL
Post by: tha on October 16, 2020, 01:32:01 PM
(https://i.imgur.com/heVwFlU.png)

(https://i.imgur.com/masQEYn.png)