WCH32v003 RISC-V MCU

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

Dumitru
Stály člen
Stály člen
Príspevky: 436
Dátum registrácie: 06 Nov 2011, 22:19
Vek: 33

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Dumitru » 06 Dec 2024, 13:14

Ahojte keď si kúpim od WCH ch32x035 + programátor + MounRiver Studio(MRS) bude mi fungovať aj debug ? neprekvapí ma nič ? :D
0

Lennox
Stály člen
Stály člen
Príspevky: 361
Dátum registrácie: 12 Sep 2019, 22:51
Bydlisko: Bratislava

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Lennox » 06 Dec 2024, 13:49

Naopak, prekvapí Ťa bezproblémová funkčnosť. Programátor ale kúp typ WCHLink-E.
Keď to chceš na pokusy s USB-C PD, odporúčam tento modul:
https://vi.aliexpress.com/item/10050069 ... pt=glo2vnm
2
Obrázok 2

Dumitru
Stály člen
Stály člen
Príspevky: 436
Dátum registrácie: 06 Nov 2011, 22:19
Vek: 33

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Dumitru » 06 Dec 2024, 13:53

Aha super ďakujem som nevedel že je ich viac typov :D dám si nato pozor :)

Keď to chceš na pokusy s USB-C PD, odporúčam tento modul:
https://vi.aliexpress.com/item/10050069 ... pt=glo2vnm

Geniálne :applause:
0

backo
Nový člen
Nový člen
Príspevky: 64
Dátum registrácie: 01 Jún 2014, 17:22

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa backo » 06 Dec 2024, 18:12

Dumitru napísal:
06 Dec 2024, 13:14
Ahojte keď si kúpim od WCH ch32x035 + programátor + MounRiver Studio(MRS) bude mi fungovať aj debug ? neprekvapí ma nič ? :D
Mne funguje k spokojnosti Visual Studio Code + platformio + WCHLink-E.
1
Obrázok 1

Lennox
Stály člen
Stály člen
Príspevky: 361
Dátum registrácie: 12 Sep 2019, 22:51
Bydlisko: Bratislava

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Lennox » 29 Dec 2024, 17:00

Len tak pre zábavu. Ak by to predsa niekoho zaujalo natoľko, že by si to rád vyskúšal. Hodím zdrojový kód, aj skompilovaný hex na môj Github.
Alebo ako TXT sem:
Simon_Says.txt
(7.83 KiB) 21 stiahnutí
Úpravám a optimalizácii kódu sa nebránim :mrgreen:
Ešte potrebujem vylepšiť random generátor nejakým seedom napr. z float pinu z ktorého
budem čítať ADC hodnotu, lebo takto je to nič moc.
https://www.youtube.com/watch?v=Q_j-FbhgM7k
2
Obrázok 2

Dumitru
Stály člen
Stály člen
Príspevky: 436
Dátum registrácie: 06 Nov 2011, 22:19
Vek: 33

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Dumitru » 09 Jan 2025, 09:59

Ahojte nerobili ste na 0x35 z touchkey ? :yawinkle: našiel u nich nejaký príklad ale mne zatial nefunguje podľa očakávania teda vôbec nefunguje ( tým nemyslím že to neviem napáliť do mcu :) ), bližšie som ešte neskúmal. Len akby niekto už s tým mál niektoré skúsenosti :agree:
0

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1312
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Atlan » 09 Jan 2025, 12:41

Fotka plosaku
0

Dumitru
Stály člen
Stály člen
Príspevky: 436
Dátum registrácie: 06 Nov 2011, 22:19
Vek: 33

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Dumitru » 09 Jan 2025, 16:44

Ak to pomože :)

Kód: Vybrať všetko

/********************************** (C) COPYRIGHT *******************************
 * File Name          : main.c
 * Author             : WCH
 * Version            : V1.0.0
 * Date               : 2023/04/06
 * 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
 *Touchkey detection routine:
 *This example demonstrates channel 2 (PA2), which is a Touchkey application.
 *
 */

#include "debug.h"
#include <stdio.h>

/* Global define */

/*********************************************************************
 * @fn      Touch_Key_Init
 *
 * @brief   Initializes Touch Key collection.
 *
 * @return  none
 */
void Touch_Key_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure={0};
    ADC_InitTypeDef ADC_InitStructure={0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    ADC_CLKConfig(ADC1, ADC_CLK_Div6);

    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);

    ADC_Cmd(ADC1, ENABLE);
    TKey1->CTLR1 |= (1<<24);     // Enable TouchKey
}

/*********************************************************************
 * @fn      Touch_Key_Adc
 *
 * @brief   Returns ADCx conversion result data.
 *
 * @param   ch - ADC channel.
 *            ADC_Channel_0 - ADC Channel0 selected.
 *            ADC_Channel_1 - ADC Channel1 selected.
 *            ADC_Channel_2 - ADC Channel2 selected.
 *            ADC_Channel_3 - ADC Channel3 selected.
 *            ADC_Channel_4 - ADC Channel4 selected.
 *            ADC_Channel_5 - ADC Channel5 selected.
 *            ADC_Channel_6 - ADC Channel6 selected.
 *            ADC_Channel_7 - ADC Channel7 selected.
 *            ADC_Channel_8 - ADC Channel8 selected.
 *            ADC_Channel_9 - ADC Channel9 selected.
 *            ADC_Channel_10 - ADC Channel10 selected.
 *            ADC_Channel_11 - ADC Channel11 selected.
 *            ADC_Channel_12 - ADC Channel12 selected.
 *            ADC_Channel_13 - ADC Channel13 selected.
 *            ADC_Channel_14 - ADC Channel14 selected.
 *            ADC_Channel_15 - ADC Channel15 selected.
 *
 * @return  val - The Data conversion value.
 */
u16 Touch_Key_Adc(u8 ch)
{
  ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_11Cycles );
  TKey1->IDATAR1 = 0x80;//Charging Time
  TKey1->RDATAR = 0x08;//Discharging Time
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
  return (uint16_t) TKey1->RDATAR;

}

/*********************************************************************
 * @fn      main
 *
 * @brief   Main program.
 *
 * @return  none
 */
uint16_t ADC_val;
int main(void)
{


    SystemCoreClockUpdate();
    Delay_Init();
   // USART_Printf_Init(115200);

   // printf("SystemClk:%d\r\n",SystemCoreClock);
   // printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );

    Touch_Key_Init();
    while(1)
    {

        ADC_val = Touch_Key_Adc(ADC_Channel_6);
     //  printf("TouckKey Value:%d\r\n",ADC_val);
        Delay_Ms(500);
    }
}
kód mam priamo od wch chcel som len otestovať funkčnosť , tak som len zmenil kanál ADC inak som nič neupravoval. Ale adc hodnota sa mení len pri fyzickom kontakte s pružinku ak použijem izolant trebárs aj papier hodnota adc ostáva konštantná ... pôjdem pozrieť Reference Manual.
Prílohy
1.jpg
2.jpg
touch_button.pdf
(128.75 KiB) 11 stiahnutí
0

Dumitru
Stály člen
Stály člen
Príspevky: 436
Dátum registrácie: 06 Nov 2011, 22:19
Vek: 33

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Dumitru » 10 Jan 2025, 13:58

Po prečítaní RM som nastavil tie časove konštanty pre vybitie a nabitie kapacity tlačidla.

A dosiahol som tieto výsledky
sem napíšem len rozdiel medzi zatlačením a nezatlačením tlačidlom vo voltoch

priamy dotyk 1.5V
cez A4 - 200mV
cez 8mm sklo 50mV

Vôbec to neviem s ničím porovnať a ani neviem aké výsledky by som mal očakávať ale osobne nie som s výsledkom zatiaľ spokojný , najme tých 50mV cez sklo

na samotnej pcb mi nepríde že by som mohol niečo radikálne vylepšiť pripadne žeby som niečo pri návrhu úplne domrvil.
image.png
0

Lennox
Stály člen
Stály člen
Príspevky: 361
Dátum registrácie: 12 Sep 2019, 22:51
Bydlisko: Bratislava

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Lennox » 11 Jan 2025, 14:48

Vyskúšal som ten generický kód od výrobcu bez zmeny, tj. touch pin A2. Parametre

Kód: Vybrať všetko

TKey1->IDATAR1 = 0x80;  //Charging Time
TKey1->RDATAR =  0x8;   //Discharging Time
som menil v celom rozsahu a výsledky podobné ako u teba. Anténa bola 5cm drôtu. Skúšal som to na tejto doske: https://vi.aliexpress.com/item/10050069 ... pt=glo2vnm
Na priblíženie ruky to reagovalo ledva, na dotyk cez izoláciu drôtu viac a na priamy dotyk holého drôtu signifikantne.
Tie parametre sú dosť citlivé na naladenie a každý projekt je individuálny. Moje vrabčie hniezdo funguje najlepšie s:

Kód: Vybrať všetko

TKey1->IDATAR1 = 0x31;  //Charging Time
TKey1->RDATAR =  0x12;   //Discharging Time
Izolant mám 8mm drevo.
1
Obrázok 1

Dumitru
Stály člen
Stály člen
Príspevky: 436
Dátum registrácie: 06 Nov 2011, 22:19
Vek: 33

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Dumitru » 11 Jan 2025, 16:14

ďakujem že si to odskúšal a potvrdil výsledky , ja som na overenie čí chyba nie je niekde v pružinke pripadne v návrhu tej dotykovej plôšky nadrotoval som tam TTP233-HA6 a tam to fungovalo cez 8mm sklo bez žiadnych problém dokonca som musel mu pomocou kondenzátora na 18p znížiť citlivosť , vo vzduchu samotný prst detekovalo pri najvyššej citlivosti tak 1cm od pružinky ..... škoda že nevidím hodnoty ktoré to TTP meria
20250111_123730 (1).jpg
Písal som dnes aj na technickú podporu WCH ale predpokladám že sa mi neozvú
Lennox napísal:
06 Dec 2024, 13:49
Naopak, prekvapí Ťa bezproblémová funkčnosť.
Asi ja mam len takú karmu :D teraz môžem 100ks pcb hodiť do koša :D


Tie parametre by som ani nepovedal že nejako specificky sa nastavuju v podstate

Kód: Vybrať všetko

TKey1->RDATAR =  0x12;   //Discharging Time
je potrebná taká hodnota aby sa kapacita spoľahlivo vybila na nulu predpokladám že čím dlhšie tým lepšie akurát bude snímanie pomalšie. Nikde nie je napísané ako to vybíja čí to len uzemni ten pin alebo cez nejaký prúdový zdroj

Kód: Vybrať všetko

TKey1->IDATAR1 = 0x31;  //Charging Time
je potrebná taká hodnota aby sa to nabilo ja som to nabil vždy na 3,5V platí to iste vôbec netuším ako to nabíja akým prúdom ...

Kód: Vybrať všetko

u16 Touch_Cal_Adc(const uint8_t ch, uint8_t charge_time )
{
  ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_11Cycles );
  TKey1->IDATAR1 = charge_time;//Charging Time
  TKey1->RDATAR = 127;//Discharging Time
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
  return (uint16_t) TKey1->RDATAR;

}

    // calibration increment charge time
    for (uint8_t i = 0; i < 255; i++)
    {
        ADC_cal_value = Touch_Cal_Adc(ADC_Channel_6, i);

        if (ADC_cal_value >= 3000)
        {
            charge_time = i;
            break;
        }

    }

Potom pri dotyku sa kapacita zväčší a teda by sa malo nabiť na menej ako 3.5V a nameraný rozdiel 50mV mi príde naozaj veľmi malý na spoľahlivú detekciu.
0

Lennox
Stály člen
Stály člen
Príspevky: 361
Dátum registrácie: 12 Sep 2019, 22:51
Bydlisko: Bratislava

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Lennox » 11 Jan 2025, 17:43

To nie je karma. Pýtal si sa, či ti bude fungovať kombo ch32x035 + programátor + MounRiver Studio(MRS), čo aj funguje :mrgreen: Ten TP233 je priamo čip na toto určený. Používam ho aj ja ako modul také tie červené PCB z Ali.
Ak by to bolo také citlivé ako to TP asi by sa ovplyvňovali jednotlivé Tkey kanály, keďže ich tu môžeš mať viac ako iba jeden. Či? Každopádne keď je plôška obsluhovaná priamo, alebo iba s malou izolačnou vzdialenosťou funguje to v pohode.
Vidím, že tam máš i2c komunikáciu a nejakú adresovateľnú LED.
Načo si plánoval použiť to tvoje zariadenie?
0

Dumitru
Stály člen
Stály člen
Príspevky: 436
Dátum registrácie: 06 Nov 2011, 22:19
Vek: 33

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Dumitru » 11 Jan 2025, 18:20

To nevadí že by to bolo citlivé by sa multiplexovali a pri meraní by všetky kanály okrem meraného prepli na logickú jednotku :) bližšie info tu strana 20 :)

Je to pre kamaráta projekt nebudem zverejňovať , jedna sa len o to že potrebuje ich zapojiť viac ks na jednu zbernicu a nech to reaguje za sklom, a dohodil som tam aj podsvietenie :) ktoré by sa malo nastavovať cez I2C ako aj citlivosť ...

Musím vymyslieť niečo iné ... :)
0

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1312
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Atlan » 11 Jan 2025, 18:29

Ten plosak je zly. Dotykova plocha by mala mat ohranicenie s gnd s spravnou medzerou. Pod dotykovou plochou nesmu ist cesty, teoreticky by mohli ked tam vlozis 3 vrstvu gnd. Tahat popod to i2c alebo inu zbernicu zabudni. Aspon taka je skusenost s niecim takym ako TP223 res viac kanalove integrace tohto typu.
0

Dumitru
Stály člen
Stály člen
Príspevky: 436
Dátum registrácie: 06 Nov 2011, 22:19
Vek: 33

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Dumitru » 11 Jan 2025, 19:00

Coplanarna zem môže ale nemusí sa použiť dokonca znižuje citlivosť ale zvyšuje imúnnosť voči rušeniu
image.png
Rozliata zem v niektorej vrstve tiež zníži citlivosť preto sa používa ako kompromis hatched
image.png
I2C som ešte nepoužil preto to nato nemá vplyv, a myslím si ze 0,2mm cestička dĺžky par mm pod 1.6mm FR4 nebude to mať vplyv ... ak by sa to aj prejavilo rozliať tam v ďalšej verzie zem nebude problem


Riešime tu hlavne nedostatok citlivosti vaše poznámky su na mieste ale slúžia len na ochranu voči rušeniu ale k zvýšeniu citlivosti neprispevaju
0

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1312
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Atlan » 11 Jan 2025, 20:49

Urobit plosak potiahnut cesticku mimo integrac a moze skusat. Ked tam bude mat rusenie, to tiez znizuje citlivost. Navyse blízkost i2c kludne by mohol mat falosne dotyky.

Predpokladam ze skonci na tp223 a ktomu uP....
0

Lennox
Stály člen
Stály člen
Príspevky: 361
Dátum registrácie: 12 Sep 2019, 22:51
Bydlisko: Bratislava

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Lennox » 22 Jan 2025, 22:28

Asi sa zo mňa fakt stane to ten céčkar. Začal som sa viac venovať optimalizácii kódu v natívnom prostredí MRS a priamej manipulácii registrov a zrazu z 3.5kB blikania ledkou sa dá napísať aj na 944 bajtov. A pritom iba samotný prázdny:
int main(void) { }; má 912 bajtov.
Toto je minimum potrebné pre vektory prerušenia a spustenie.
Takže samotný kód aj s inicializáciou portov, delay-mi má iba 32 bajtov.
Oproti továrenským 3.5kB zdrojákom je to mikroskopické :mrgreen:
Dalo by sa to ešte osekať až na holé železo, videl som na to príklady, ale ja chcem ostať v
prostredí MRS a je to potom už dosť neprehľadné, aspoň teda pre mňa.
A ešte dodám, že k tým PIC-om by som sa už nevrátil. Keď sa na to pozriem s odstupom času no ďes-besz, hrúza.

Kód: Vybrať všetko

#include "debug.h"

// Funkcia na čakanie v mikrosekundách
static void delay_us(u32 us) {
    SysTick->SR &= ~1;                         // Vymaž register SysTick
    SysTick->CMP = (u32)us * 6 - 4;            // Nastav hodnotu pre porovnanie
    SysTick->CNT = 0;                          // Resetuj counter
    SysTick->CTLR |= 1;                        // Povol SysTick
    while (!(SysTick->SR & 1));                // Čakaj kým SysTick neskončí
    SysTick->CTLR &= ~1;                       // Vypni SysTick
}

// Funkcia na čakanie v milisekundách
static void delay_ms(u32 ms) {
    while (ms--) {delay_us(1000);}             // čakaj 1 ms
}

// Inicializácia GPIO
void GPIO_INIT(void) {
    RCC->APB2PCENR |= RCC_APB2Periph_GPIOD;    // Povol clock pre GPIOD
    GPIOD->CFGLR = 0x44444443;                 // Konfigurácia pinu na GPIOD, Pin_0, Out_PP, Speed_30MHz
}

int main(void) {
    u8 i = 0;

    GPIO_INIT();                               // Inicializácia GPIO

    while (1) {
        delay_ms(500);                         // Čakaj 500 ms
        (i++ & 1) ? (GPIOD->BSHR = 0x01):(GPIOD->BCR = 0x01); // Blikaj LED na GPIO D0
    }
}
1
Obrázok 1

Lennox
Stály člen
Stály člen
Príspevky: 361
Dátum registrácie: 12 Sep 2019, 22:51
Bydlisko: Bratislava

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Lennox » 31 Jan 2025, 16:07

Nejako ma začalo baviť hrabať sa v registroch a zistil som, že to nie je až také zložité programovanie ako sa zdalo pred rokom.
DMA PWM, Direct GPIO In Out

Kód: Vybrať všetko

#include "ch32v00x.h"

/*
 * PA1 Button 1 (IPU)
 * PA2 Button 2 (IPU)
 * PC1 LED 1    (C_C)
 * PC2 LED 2    (C_C)
 * PC4 LED PWM  (C_C)
 * GND
 * VDD 3.3V
 */

#define PWM_STEPS 220 // Number of steps for the LED pulse effect

uint16_t pwm_values[PWM_STEPS];

void Generate_PWM_Values() {
    uint16_t step_size = 1023 / (PWM_STEPS / 2);
    for (uint16_t i = 0; i < PWM_STEPS / 2; i++) {
        pwm_values[i] = i * step_size;                 // DEC LED PWM brightness
        pwm_values[PWM_STEPS - i - 1] = pwm_values[i]; // INC LED PWM brightness
    }
}

void GPIO_init() {
    // GPIOA Setup
    RCC->APB2PCENR |= (1 << 2) | (1 << 0);      // Enable clocks for GPIOA and AFIO
    AFIO->PCFR1   &= ~(1 << 15);                // PA12_RM bit must be cleared when PA1 and PA2 are used as normal GPIO pins

    GPIOA->CFGLR &= ~(0xFF << 4);               // Reset configuration for pins PA1 and PA2
    GPIOA->CFGLR |=  (0x88 << 4);               // Set mode to Input-PullUp
    GPIOA->OUTDR |=  (3 << 1);                  // Activate pull-up resistors for PA1 and PA2

    // GPIOC Setup
    RCC->APB2PCENR |=(1 << 4);                  // Enable clock for GPIOC
    GPIOC->CFGLR &= ~(0xF << 16);               // Clear previous settings
    GPIOC->CFGLR |=  (0xB << 16);               // Alternate function PC4 push-pull 10MHz

    GPIOC->CFGLR &= ~( (0xF << 8)| (0xF << 4)); // Reset configuration for pins PC1, PC2
    GPIOC->CFGLR |=    (0x1 << 8)| (0x1 << 4);  // PC1, PC2 GPIO_Speed_10MHz; OUTPUT
}

void TIM1_PWMOut() {
    RCC->APB2PCENR |= (1 << 11);                // Enable clock for TIM1
    TIM1->PSC   = 480 - 1;                      // 48 MHz
    TIM1->ATRLR = 1000 - 1;                     // 1000 Hz / 10 = 100 Hz

    TIM1->CHCTLR2 &= ~(7 << 12);                // Clear OC4M bits
    TIM1->CHCTLR2 |= (7 << 12);                 // PWM mode 2
    TIM1->CHCTLR2 |= (1 << 11);                 // Enable preload mode
    TIM1->CCER    |= (1 << 12);                 // CC4E = 1 (Enable TIM1 CH4)
    TIM1->BDTR    |= (1 << 15);                 // Enable main output (MOE)
    TIM1->CTLR1   |= (1 << 7);                  // ARPE (Auto-reload preload enable)
    TIM1->CTLR1   |= (1 << 0);                  // Start the TIM1 timer

    TIM1->DMACFGR = ((PWM_STEPS > 32 ? 31 :
                     PWM_STEPS - 1) << 8) | (0x3C); // DMA configuration for CH4CVR (DBL max = 31)
    TIM1->DMAINTENR |= (1 << 12);                   // Enable DMA for CC4
}

void DMA_Config(void) {
    RCC->AHBPCENR |= (1 << 0);                      // Enable clock for DMA1

    DMA1_Channel4->PADDR = (uint32_t)&TIM1->CH4CVR; // Peripheral address (TIM1 CH4CVR register) for DMA
    DMA1_Channel4->MADDR = (uint32_t)pwm_values;    // Memory address where PWM values are stored
    DMA1_Channel4->CNTR  = PWM_STEPS;               // SNumber of data items to transfer (PWM_STEPS)

    DMA1_Channel4->CFGR = (1 << 7)  |               // Memory increment enable (MINC)
                          (1 << 5)  |               // Circular mode enable (CIRC)
                          (1 << 8)  |               // Peripheral data size = 16-bit (PSIZE[0:1])
                          (1 << 10) |               // Memory data size = 16-bit (MSIZE[0:1])
                          (1 << 4)  |               // Data transfer direction: Memory to Peripheral DIR = 1
                          (0 << 12);                // Priority level = Low (PL[0:0])

    DMA1_Channel4->CFGR |= (1 << 0);                // Enable DMA
}

int main(void) {

    GPIO_init();
    TIM1_PWMOut();
    DMA_Config();
    Generate_PWM_Values();

    while (1) {
    (GPIOA->INDR & (1 << 1)) ? (GPIOC->BSHR |= (1 << 17)) : (GPIOC->BSHR |= (1 << 1)); // PA1 = On LED C1
    (GPIOA->INDR & (1 << 2)) ? (GPIOC->BSHR |= (1 << 18)) : (GPIOC->BSHR |= (1 << 2)); // PA2 = On LED C2
        }
}
1
Obrázok 1

Dumitru
Stály člen
Stály člen
Príspevky: 436
Dátum registrácie: 06 Nov 2011, 22:19
Vek: 33

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Dumitru » 03 Feb 2025, 09:18

Ja zase pre x035 musím prácne zisťovať z ich knižníc ako vlastne nastaviť registre :D
image.png
kým pre CNF -> Input mode si dali námahu popísať všetky staví tak pre CNF -> Output mode je len 00 a 10 ale či sú stavy 01 a 11 Reserved ... napríklad u V003 sú pekne popísane

Každopádne ani v knižnice nie sú popísane

Kód: Vybrať všetko

/* Configuration Mode enumeration */
typedef enum
{
    GPIO_Mode_AIN = 0x0,
    GPIO_Mode_IN_FLOATING = 0x04,
    GPIO_Mode_IPD = 0x28,   /* Only PA0--PA15 and PC16--PC17 support input pull-down */
    GPIO_Mode_IPU = 0x48,
    GPIO_Mode_Out_PP = 0x10,
    GPIO_Mode_AF_PP = 0x18
} GPIOMode_TypeDef;
tak predpokladám že možnosti ako Open Drain sa nepodporujú a bude treba ich simulovať ako na avr pushpull->low/input->float

tak isto pre MODE -> Output mode, staví sú 01 10 11 ale čo to znamená :D :pain: u V003 sa tím menia rýchlosti portu
z knižnice pre x035 som zistil že sa to nastavuje vždy len ako 01 -> 50Mhz.

Kód: Vybrať všetko

/* Output Maximum frequency selection */
typedef enum
{
    GPIO_Speed_50MHz = 1,
} GPIOSpeed_TypeDef;
Z Datasheetu pre x035 zase nie každý port dôkaze chodiť do 50Mhz
image.png
Ideme ďalej register OUTDR ma možnosť Read/Write z popisu by človek očakával že ak tam zapíše 1 ma pull up ak tam zapíše 0 ma pull down

image.png
ale v knižnice sa to nastavuje len cez registre BSHR BCR :D

Kód: Vybrať všetko

                if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
                {
                    GPIOx->BCR = (((uint32_t)0x01) << pinpos);
                }
                else
                {
                    if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
                    {
                        GPIOx->BSHR = (((uint32_t)0x01) << pinpos);
                    }
                }
image.png

Inak aj BSHR aj BCR majú rovnaký BRy - bit reset som zvedaví ci majú rovnakú funkciu len BCR vie vynulovať až do pinu 23 a BSHR len do pinu 15.

Asi len preklep ale napríklad INDR je v Reference Manualy zadefinovaný ako Read Only v knižnice zase je Read/Write

Kód: Vybrať všetko

/* IO definitions */
#ifdef __cplusplus
  #define     __I     volatile                /* defines 'read only' permissions */
#else
  #define     __I     volatile const          /* defines 'read only' permissions */
#endif
#define       __O     volatile                /* defines 'write only' permissions */
#define       __IO    volatile                /* defines 'read / write' permissions */

/* General Purpose I/O */
typedef struct
{
    __IO uint32_t CFGLR;
    __IO uint32_t CFGHR;
    __IO uint32_t INDR;
    __IO uint32_t OUTDR;
    __IO uint32_t BSHR;
    __IO uint32_t BCR;
    __IO uint32_t LCKR;
    __IO uint32_t CFGXR;
    __IO uint32_t BSXR;
} GPIO_TypeDef;

Možno aj OUTDR je Read Only a preklep je v reference manualy treba skúsiť.


Ale aspoň že to nakoniec nejako funguje keď sa človek tým prehryzie
0

Lennox
Stály člen
Stály člen
Príspevky: 361
Dátum registrácie: 12 Sep 2019, 22:51
Bydlisko: Bratislava

Re: WCH32v003 RISC-V MCU

Príspevok od používateľa Lennox » 03 Feb 2025, 10:10

Podobné veci sa dajú nájsť aj v datasheetoch od Microchipu, tiež som sa občas čudoval. Mňa teraz potrápilo nastavenie EXTI. Z PIC som bol zvyknutý, že externé prerušenie som mohol mať od ktoréhokoľvek portu a pinu. U CH32 som chcel EXTI od PA2 a PD2 keďže RM to popisuje takto tak som si myslel , že je to možné.
Ale nie je to tak. Tu je to priamo namapované na EXTI0 až EXTI7. Môžem mať PA2 ale už nie PD2. Musím zvoliť iný pin z portu D lebo linka EXTI2 je už použitá pre port A.
Takže vo výsledku môžem mať iba 8 externých liniek prerušení z jedného portu naraz, alebo z viacerých portov s tým, že sa nemôžu zhodovať označenia pinov PA2-PC2-PD2, musí byť napr. PA2-PC4-PD1.
AFIO.png
exti.jpg
Mi ti trvalo pol dňa dokedy som na to prišiel. Tiež to nie je z toho manuálu hneď jasné :mrgreen:
0
Naposledy upravil/-a Lennox v 03 Feb 2025, 12:05, upravené celkom 1 krát.

Napísať odpoveď