
WCH32v003 RISC-V MCU
Moderátori: psichac, Moderátori
Re: WCH32v003 RISC-V MCU
Ahojte keď si kúpim od WCH ch32x035 + programátor + MounRiver Studio(MRS) bude mi fungovať aj debug ? neprekvapí ma nič ? 

0
Re: WCH32v003 RISC-V MCU
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
Keď to chceš na pokusy s USB-C PD, odporúčam tento modul:
https://vi.aliexpress.com/item/10050069 ... pt=glo2vnm
2

Re: WCH32v003 RISC-V MCU
Aha super ďakujem som nevedel že je ich viac typov
dám si nato pozor 
Geniálne


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

0
Re: WCH32v003 RISC-V MCU
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: Úpravám a optimalizácii kódu sa nebránim
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
Alebo ako TXT sem: Úpravám a optimalizácii kódu sa nebránim

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

Re: WCH32v003 RISC-V MCU
Ahojte nerobili ste na 0x35 z touchkey ?
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 



0
Re: WCH32v003 RISC-V MCU
Ak to pomože 
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.

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);
}
}
- Prílohy
-
- touch_button.pdf
- (128.75 KiB) 11 stiahnutí
0
Re: WCH32v003 RISC-V MCU
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.
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.
0
Re: WCH32v003 RISC-V MCU
Vyskúšal som ten generický kód od výrobcu bez zmeny, tj. touch pin A2. Parametre
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:
Izolant mám 8mm drevo.
Kód: Vybrať všetko
TKey1->IDATAR1 = 0x80; //Charging Time
TKey1->RDATAR = 0x8; //Discharging Time
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
1

Re: WCH32v003 RISC-V MCU
ď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
Písal som dnes aj na technickú podporu WCH ale predpokladám že sa mi neozvú
teraz môžem 100ks pcb hodiť do koša 
Tie parametre by som ani nepovedal že nejako specificky sa nastavuju v podstate
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
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 ...
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.
Písal som dnes aj na technickú podporu WCH ale predpokladám že sa mi neozvú
Asi ja mam len takú karmu


Tie parametre by som ani nepovedal že nejako specificky sa nastavuju v podstate
Kód: Vybrať všetko
TKey1->RDATAR = 0x12; //Discharging Time
Kód: Vybrať všetko
TKey1->IDATAR1 = 0x31; //Charging Time
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
Re: WCH32v003 RISC-V MCU
To nie je karma. Pýtal si sa, či ti bude fungovať kombo ch32x035 + programátor + MounRiver Studio(MRS), čo aj funguje
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?

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
Re: WCH32v003 RISC-V MCU
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é ...


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

Musím vymyslieť niečo iné ...

0
Re: WCH32v003 RISC-V MCU
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
Re: WCH32v003 RISC-V MCU
Coplanarna zem môže ale nemusí sa použiť dokonca znižuje citlivosť ale zvyšuje imúnnosť voči rušeniu
Rozliata zem v niektorej vrstve tiež zníži citlivosť preto sa používa ako kompromis hatched 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
Rozliata zem v niektorej vrstve tiež zníži citlivosť preto sa používa ako kompromis hatched 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
Re: WCH32v003 RISC-V MCU
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....
Predpokladam ze skonci na tp223 a ktomu uP....
0
Re: WCH32v003 RISC-V MCU
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é
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.
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é

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

Re: WCH32v003 RISC-V MCU
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
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

Re: WCH32v003 RISC-V MCU
Ja zase pre x035 musím prácne zisťovať z ich knižníc ako vlastne nastaviť registre
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
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á
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.
Z Datasheetu pre x035 zase nie každý port dôkaze chodiť do 50Mhz
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
ale v knižnice sa to nastavuje len cez registre BSHR BCR
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
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

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 isto pre MODE -> Output mode, staví sú 01 10 11 ale čo to znamená


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;
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
ale v knižnice sa to nastavuje len cez registre BSHR BCR

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);
}
}
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;
Ale aspoň že to nakoniec nejako funguje keď sa človek tým prehryzie
0
Re: WCH32v003 RISC-V MCU
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. Mi ti trvalo pol dňa dokedy som na to prišiel. Tiež to nie je z toho manuálu hneď jasné
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. Mi ti trvalo pol dňa dokedy som na to prišiel. Tiež to nie je z toho manuálu hneď jasné

0
Naposledy upravil/-a Lennox v 03 Feb 2025, 12:05, upravené celkom 1 krát.