GPIO STM32F1

Started by tha, September 08, 2020, 08:42:55 AM

Previous topic - Next topic

tha

หรือจะใช้อย่างนี้ ท่านใดแจ้งมาให้ทำแบบนี้ ถูกไหมอย่างนี้ การเช็ค input PA0 ที่มีการ pull-up สวิทช์ภายนอก

   unsigned long A;
   A = GPIOA_IDR;
   if(~(A)==0x00000001)
  {
   /* user code */
  }

tha

หรือถ้าให้ PA3 เป็น input สวิทช์ ก็กำหนดแบบนี้ก็ได้ ดูที่บิตของมันว่ามีค่าเป็นเลขฐานสิบหกเท่าไหร่นะครับ

   unsigned long A;
   A = GPIOA_IDR;
   if(~(A)==0x00000008)
  {
   /* user code */
  }

tha

output bits เหล่านี้อ่านและเขียนได้โดยการเขียนโปรแกรมและสามารถเข้าถึงได้เป็นแบบ Word mode เพียงอย่างเดียว



ทำแบบนี้ได้ไหม ให้ PA4 ทำงานบิตเดียว

   GPIOx_ODR = 0x00000010;
   
หรือ off ทั้งหมด

   GPIOx_ODR = 0x00000000;

ตัวอย่างในไฟล์ pdf ที่ดาวน์โหลดมา

   Turning on an output pin
    /* turn on PA4 */
   GPIOA -> ODR |= GPIO_PIN_4;

   Turning off an output pin
   /* turn off PA4 */
   GPIOA -> ODR &= ~GPIO_PIN_4;

   Toggle an output pins state
   /* toggle PA4 */
   GPIOA -> ODR ^= GPIO_PIN_4;

หรือจะใช้ HAL library function
   /* set PA4 */
   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
   /* reset PA4 */
   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
   /* Toggle PA4 */
   HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4);

ปล. เรื่องการอ่านอินพุท จะทำอย่างนี้ได้หรือเปล่า บิตอินพุทบิตอื่นมันจะอ่านมาได้เป็น '1' เหมือน AVR หรือเปล่า เดี๋ยวมาลองดูกัน พรุ่งนี้นะครับ


tha


tha

เจอปัญหาแล้วครับ สวิทช์มันมี pull-up ภายนอก ปกติจะเป็น '1' กดสวิทช์แล้วจะเป็น '0' ต้องใช้รูปแบบนี้ครับ
Quote
         /* Reset PB8 */
     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
     HAL_Delay(500);
     /* Reset PB8 */
     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);

     /* -3- Toggle IO in an infinite loop */
     while (1)
     {
        /* read AC0 */
        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==GPIO_PIN_RESET)  //Check if button pressed
        {
          /* Set PB8 */
          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
        }
        /* read PC13 */
        if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)==GPIO_PIN_RESET)
        {
          /* Reset PB8 */
          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
        }
       /* Insert delay 100 ms */
       HAL_Delay(500);
     }

เอามาจากตัวอย่างนี้ https://www.engineersgarage.com/stm32/push-button-and-led-with-stm32f103/

tha

เดี๋ยวจะต่อบอร์ด ET-STM32F103RB กับจอ LCD16x2 นะครับ จะใช้ตัวต่อ ET-CONV 14 LCD เป็นตัวต่อบอร์ดกับจอ LCD16x2 ลองโปรแกรมตัวอย่างที่มากับบอร์ดที่เป็นโปรแกรม Keil ได้แล้ว แต่ยังไม่ได้แก้ให้เป็น System Workbench for STM32 ว่าจะทำมะรืนนะ



http://www.ett.co.th/catalog2013/THAI/Page_87.pdf

tha

ถ้าจะต่อกับจอ GLCD5110 ก็จะทำแบบนี้







           Hardware Configuration
      GLCD5110   |   STM32 Port
      ------------|-----------
      (1)VCC      |   VCC
      (2)GND      |   GND
      (3)SCE      |   PC0
      (4)RESET          |   PC1
      (5)D/C      |   PC2
      (6)SDIN      |   PC3
      (7)SCK      |   PC4
      (8)LED      |   PC5 // หลอด LED มันมี 4 หลอด ผมเลยเอา PC5 ไปขับผ่านทรานซิสเตอร์อีกทีนะครับ กลัวจะขับโดยตรงไม่ไหว

ลองทำกันดูนะครับ หรือท่านใดมีไอเดียอื่นๆก็แก้ไขได้ง่ายๆ
เดี๋ยวจะแก้ไขโปรแกรมที่มีอยู่แล้วให้เป็น System Workbench for STM32 นะครับ ขอเวลาหน่อย

tha