หลังจากทำความรู้กับกับส่วนต่างๆ ของโปรแกรม MounRiver Studio ไปแล้ว ว่ามีส่วนประกอบที่สำคัญอะไรบ้าง ในบทความนี้เราจะมาทดลองใช้งานโปรแกรม เปิด Project หรือ เขียนโปรแกรมแรกของเรา โดยครั้งนี้เราจะเล่นใหญ่ ไฟกระพริบ กันเลยที่เดียว 🤣

สิ่งที่ต้องเตรียม

เมื่อเราเตรียมอุปกรณ์ทั้งหมดแล้ว ขั้นตอนต่อไป ก็จะเริ่มเขียนโปรแกรมแรกของเรากันเลย โดยในที่นี้ทาง WCH ได้เตรียมไฟล์ code โปรแกรม ตัวอย่าง การใช้งานในส่วนต่างๆไว้ให้แล้ว ซึ่งในตัวอย่างนี้จะเป็น code ที่ทาง WCH พัฒนามาให้ใช้งานในรูปแบบของ ภาษา C เท่านั้น ในบทความนี้เราจะใช้ IDE ของทาง MounRiver Studio ในการเขียน โดย IDE ตัวนี้ครอบคลุมแนวทางการในการเขียน หรือ พัฒนาโปรแกรมทั้งหมดแล้ว ไม่ว่าจะเป็นในส่วน ของ Codeing / Debug / Compile / Flash code ใช้ตัวเดียวครบจบแน่นอน 👌

ไฟล์ตัวอย่างที่ WCH เตรียมมาให้
ตัวอย่างที่มีจาก WCH

Download : https://www.makerwitawat.com/gdrive

ไฟล์ทั้งหมดที่ได้รวบรวมไว้

ในตัวโปรแกรมตัวอย่างนี้ ครอบคลุมการใช้งานทั่วไปเกือบทั้งหมดที่ MCU ตัวนี้ทำได้แล้ว เอาละโปรแกรมที่เราจะเขียนในวันนี้จะเป็น โปรแกรมตัวอย่างแบบง่ายๆ ที่ใช่ควบคุม GPIO ของ MCU นั้นเอง โดย CH32V003 Board ที่นำมาใช้ได้มีการเชื่อมต่อกับ LED ไว้แล้ว

จากรูป PIN OUT ด้านบน ตัว Board CH32V003J4M6 ได้ต่อ LED ไว้ที่ขา GPIO PD4 ที่สกรีนไว้บน PCB ด้วยค่าว่า D4 และ PIN OUT ของตัว Board CH32V003F4P6 ต่อ LED ไว้ที่ GPIO PD1 ที่สกรีนไว้บน PCB ด้วยค่าว่า D1 ซึ่งชื่อเรียก GPIO เหล่านี้ สามารถดูได้จากเอกสารแนะนำ เมื่อเรารู้เกี่ยวกับรายละเอียดของ Board กันแล้ว ก็จะเริ่มเขียนโปรแกรมกันเลย 😁

เริ่มสร้าง Project แรก

ก่อนอื่นเราก็มาสร้าง Project ใหม่กันเลย โดยกดไปที่ File > New > MounRiver Project

สร้าง Project ใหม่

เลือกประเภท MCU ที่ต้องการพัฒนา หรือ เขียนโปรแกรม ในที่นี้เรามี CH32V003J4M6 และ CH32V003F4P6 ให้เราเลือกตาม Board ที่เรามีได้เลย พร้อมกับตั้งชื่อ Project ให้เรียบร้อย

หน้าต่างช่วยสร้าง Project เริ่มต้น

ในบทความนี้เราจะตั้งว่า GPIO_LED กัน จากนั้นกด Finish โปรแกรมจะสร้าง Project เริ่มต้นให้เราแบบง่ายๆ

อธิบายโครงสร้างของ Project แบบง่ายๆ

โครงสร้าง Project GPIO_LED

โครงสร้างหลักที่ต้องสนใจ

โฟลเดอร์ที่เราใช้พัฒนาโปรแกรมจะอยู่ที่ User และโฟลเดอร์ที่เก็บ Lib ต่างๆ จะอยู่ที่ Peripheral ในส่วนนี้จะเก็บไฟล์ที่เชื่อมต่อกับอุปกรณ์ต่างๆ

คำอธิบายเบื้องต้น

ch32v00x.h ใช้ประกาศค่าต่างๆของ MCU
_adc.h ใช้ควบคุม ADC
_dbgmcu.h ใช้ความคุม Debug
_dma.h ใช้ควบคุม DMA
_exti.h ใช้ควบคุม Interrupt
_flash.h ใช้ควบคุม Flash Memory
_gpio.h ใช้ควบคุม GPIO
_i2c.h ใช้ควบคุม I2C
_iwdg.h ใช้ควบคุม IWDG
และอื่นๆ ตามชื่อไฟล์ที่กำกับไว้ตรงตัว




system_ch32v00x.h ใช้ในการ config MCU
main.c ใช้สำหรับเริ่มต้นโปรแกรมที่จะพัฒนา

คำอธิบายในเป็นตัวอย่างเริ่มต้น
ควรศึกษาลงลึกในแต่ละไฟล์อีกครั้ง

ในบทความนี้เราจะใช้ code ที่ได้จาก code ตัวอย่างของ WCH ที่อยู่ใน โฟลเดอร์ GPIO ให้เราเปิดไฟล์ main.c ที่อยู่ใน โฟลเดอร์ User ของ code ตัวอย่าง แล้วให้ Copy code GPIO ทั้งหมดที่อยู่ในไฟล์ main.c นี้ ลงใน main.c ที่เราสร้างขึ้นมาใน project ของเราเอง

/********************************** (C) COPYRIGHT *******************************
 * File Name          : main.c
 * Author             : WCH
 * Version            : V1.0.0
 * Date               : 2022/08/08
 * Description        : Main program body.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for 
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/

/*
 *@Note
 GPIO routine:
 PD0 push-pull output.
*/

#include "debug.h"

/*********************************************************************
 * @fn      GPIO_Toggle_INIT
 * @brief   Initializes GPIOA.0
 * @return  none
 */
void GPIO_Toggle_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}

/*********************************************************************
 * @fn      main
 * @brief   Main program.
 * @return  none
 */
int main(void)
{
    u8 i = 0;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    Delay_Ms(2000);
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n", SystemCoreClock);

    printf("GPIO Toggle RUNING\r\n");
    GPIO_Toggle_INIT();

    while(1)
    {
        Delay_Ms(100);
        GPIO_WriteBit(GPIOC, GPIO_Pin_4, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));
    }
}

MCU / WCH LinkE 1v3 : https://shopee.co.th/witawat57/23167328296

สนับสนุนบทความดีๆ ผ่านทางร้านค้าของเรา

จากนั้นเราจะต้องแก้ไข code ตัวอย่างบางจุด โดยจะมีจุดสำคัญ ที่เราจะต้องแก้ใน code นี้ก็คือ ส่วนที่กำหนด GPIO GPIO_InitStructure.GPIO_Pin ที่เชื่อมต่อ LED และ ส่วนที่ควบคุม RCC_APB2Periph_GPIOC และ ส่วน เริ่มกระบวนการ GPIO_Init รายละเอียเดเกี่ยวกับการกำหนดค่า หรือ ชื่อเรียกต่างๆ สามารถดูได้จาก ที่นี้

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

ถ้าใช้ Board CH32V003J4M6 ที่มี GPIO ที่เชื่อต่อ LED ที่ PD4 ให้ปรับเปลี่ยนเป็นดังนี้

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

ถ้าใช้ Board CH32V003F4P6 ที่มี GPIO ที่เชื่อต่อ LED ที่ PD1 ให้ปรับเปลี่ยนเป็นดังนี้

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

จากนั้นให้แก้ code ใน loop while(1) ในส่วนของ GPIOD และ PIN GPIO_Pin_4 ให้ถูกต้อง

GPIO_WriteBit(GPIOD, GPIO_Pin_4, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET)); // CH32V003J4M6 ใช้ GPIOD, GPIO_Pin_4 | CH32V003F4P6 ใช้ GPIOD, GPIO_Pin_1

เมื่อแก้ไข code เรียบร้อย ให้ตรวจสอบ error หรือ คำเตือนต่างๆใน MounRiver Studio ก่อน หากไม่พบข้อผิดพลาดใดๆ จากนั้นให้กดปุม Compile เพื่อสร้างไฟล์ .hex หรือ .bin ไว้สำหรับเขียนลง MCU หากไม่ได้อะไรผิดพลาด ก็จะได้ไฟล์นี้มา

Console แสดงรายการต่างๆ

หากได้ข้อความตามรู้ด้านบน ก็เป็นอันเสร็จกระบวนการเขียนโปรแกรม ต่อจากนั้นให้เรา มาต่อสายไฟ จาก WCH LinkE 1v3 เข้ากับ CH32V003 Board ของเรา ตามรายละเอียด ตารางด้านล่าง โดยหลักๆแล้ว จะใช้ขา SWDIO ต่อกับ PD1 ของ ตัว MCU ในบทความนี้จะใช้สายไฟ เพียง 3 เส้นเท่านั้นได้แก้ VCC, GND, SWIO

PIN ที่แสดงไว้ สำหรับใช้เชื่อมต่อ

ตรวจสอบสายให้แน่ใจว่าไม่ได้ต่อสลับสาย แล้วให้เสียบ WCH LinkE 1v3 เข้ากับ Port USB จากนั้นให้กดปุ่ม เพื่อ Upload โปรแกรมลง MCU แล้วรอดูผล

โปรแกรมแรก ไฟกระพริบ
สำหรับ CH32V003J4M6 จะต้องทำการ ย้าย PORT TX ออกจาก PIN D1 ก่อน หาไม่ย้าย เวลา Flash ครั้งต่อไป จะต้องล้างค่าทั้งหมดก่อนเสมอ

สามารถดูวิธีการย้าย PORT TX หรือการแก้ไขปัญหาได้ ที่นี้

วิธีการล้าง หรือ Clear ค่าทั้งหมดของ MCU ให้เป็นค่าโรงงาน

ให้กดปุ่มลูกศรของปุ่ม จะมีหน้าต่างโปรแกรมจัดการ MCU ขึ้นมา

โปรแกรมจัดการ MCU

ให้เลือกในส่วน Erase Code Flash เป็น By Power off แล้ว กด Apply เพียงเท่านี้ก็จะสามารถ Flash โปรแกรมลงใหม่ได้อีกครั้ง

MCU / WCH LinkE 1v3 : https://shopee.co.th/witawat57/23167328296

สนับสนุนบทความดีๆ ผ่านทางร้านค้าของเรา