Fórum témák
- • Számítógép hiba, de mi a probléma?
- • Elektronikai témájú könyvek újságok
- • Arduino
- • Autó akkumulátor töltése 230V nélkül
- • Padlófűtés vezérlés
- • Kombikazán működési hiba
- • Vicces - mókás történetek
- • Felajánlás, azaz ingyen elvihető
- • Keringető szivattyú
- • 230V-os motor fordulatszám vezérlése
- • Porszívó javítás
- • Autórádió (fejegység) problémák, kérdések, válaszok
- • Érdekességek
- • Számlapok és előlapok készítése
- • ZC-18 kazán
- • Lemezjátszó beállítása, javítása
- • Kazettás magnó (deck) javítása
- • Villanyszerelés
- • Elektromos ágymelegítők
- • Vásárlás, hol kapható?
- • Mosogatógép hiba
- • Klíma beszerelése, fűtés-hűtés házilag
- • Transzformátor készítés, méretezés
- • Li-Po - Li-ion akkumulátor és töltője
- • Multiméter problémák
- • Akkumulátor töltő
- • Kávéfőzőgép hiba
- • Mosógép vezérlők és általános problémáik
- • Szünetmentes táp javítása, élesztése
- • Szinuszos Inverter Javitás
- • Erősítő mindig és mindig
- • SMD forrasztás profin
- • Rádió építés a kezdetektől a világvevőig
- • Hűtőgép probléma
- • Elektromos kerékpár, robogó házilag
- • Indukciós hevítő készítése
- • Labortápegység készítése
- • Börze
- • DC-DC konverter
- • Gázkazán vezérlő hibák
- • Kompresszor hiba
- • Elektromágneses rázóasztal
- • V-FET és SIT erősítő kapcsolások
- • Hörmann kapuk
- • Szárítógép problémák
- • Színes, animált kijelzésű hangfrekvenciás spektrum-analizátor
- • Lézergravírozás
- • Proteus
- • Laptop javítás, tuning
- • Bojler javítása, kérdések
- • Castone erősítő javítás
- • Napelem alkalmazása a lakás energia ellátásában
- • VF2 végerősítő
- • Alternativ HE találkozó(k)
- • Nyák nyomtató kérdések
» Több friss téma
|
Fórum » STM32 Discovery Kit programozása
Szuper, köszi. Nekem valami más csomag volt ezekkel, de már a Keil v5-höz, a 4-essel nemtudtam megnyitni.
Sziasztok!
Végülis megoldottam amit szerettem volna, hardverista létemre. Küldöm is a kódot, hátha mást is érdekelne. Ez így nincs benne a mintákban, de jó támpontot adnak. Várok hozzáfűzéseket/tanácsokat a tapasztalt kolegáktól mit lehetne/kellene másképp a jövőben. (Azt tudom, hogy az egész átláthatóbb lenne, ha függvényekbe rendezném.)
A célnak megfelel. Amelett, hogy sokat megtanultam belőle, egy hirtelen dataloggerra volt szükségem. Szerintem megfelel, nem kell nagyon pontosság. A logolást az STM Studio applikációval oldottam meg. Jövőben tervezem az USB-s kommunikáció és a DMA implementációját.
volatile int it_counter = 0;
volatile uint8_t ADC_StartFlag = 0;
volatile uint16_t ADC1_ConversionValue = 0;
void TIM2_IRQHandler(){ //Timer 2 megszakitas kezelese
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //Megszakitast jelzo bit torlese
GPIO_ToggleBits(GPIOG, GPIO_Pin_13); //LED bekapcsolasa - csak hogy lassam a mukodest...
}
void ADC_IRQHandler(){ //ADC megszakítás kezelés
ADC1_ConversionValue = ADC_GetConversionValue(ADC1); //Eredmeny kiolvasasa
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC); //Megszakitast jelzo bit torlese
GPIO_ToggleBits(GPIOG, GPIO_Pin_14); //LED bekapcsolasa - csak hogy lassam a mukodest...
}
int main(void){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // Ora inicializalas
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); // Ora inicializalas
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // Ora inicializalas
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // Ora inicializalas
GPIO_InitTypeDef LEDoutput; //LED pinek inicializalasa a szignalizacio erdekeben
LEDoutput.GPIO_Mode = GPIO_Mode_OUT;
LEDoutput.GPIO_OType = GPIO_OType_PP;
LEDoutput.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
LEDoutput.GPIO_PuPd = GPIO_PuPd_NOPULL;
LEDoutput.GPIO_Speed = GPIO_Fast_Speed;
GPIO_Init(GPIOG, &LEDoutput);
GPIO_InitTypeDef ADC_input; //Analog pin inicializalasa az ADC szamara
ADC_input.GPIO_Mode = GPIO_Mode_AN;
ADC_input.GPIO_Pin = GPIO_Pin_5;
ADC_input.GPIO_PuPd = GPIO_PuPd_NOPULL;
ADC_input.GPIO_Speed = GPIO_Fast_Speed;
GPIO_Init(GPIOA, &ADC_input);
ADC_CommonInitTypeDef ADC_CommonInitStructure; //ADC inicializalas
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitTypeDef ADC1_InitStruct; //ADC1 inicializalas
ADC1_InitStruct.ADC_ContinuousConvMode = DISABLE;
ADC1_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC1_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
ADC1_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO;
ADC1_InitStruct.ADC_NbrOfConversion = 1;
ADC1_InitStruct.ADC_Resolution = ADC_Resolution_12b;
ADC1_InitStruct.ADC_ScanConvMode = DISABLE;
ADC_Init(ADC1, &ADC1_InitStruct);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_3Cycles);
ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
TIM_TimeBaseInitTypeDef TIM2_InitStruct; //TIM2 inicializalas
TIM2_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM2_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM2_InitStruct.TIM_Period = 100 - 1;
TIM2_InitStruct.TIM_Prescaler = 450-1;
TIM2_InitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM2_InitStruct);
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
TIM_ITConfig(TIM2, TIM_IT_Update , ENABLE);
NVIC_InitTypeDef NVIC_InitStructure; //Timer2 megszakitasok inicializalasa
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn; //ADC megszakitasok inicializalasa
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE); //Timer 2 engedelyezese
ADC_Cmd(ADC1,ENABLE); //ADC1 engedelyezese
while(1)
{
}
}
Sziasztok!
Van valakinek tapasztalata CMSIS könyvtár használatával Keil környezeten belül? Konkrétan a beállításokra és arra lennék kíváncsi mit kell includolni. A fir filter es math könyvtárakkal szeretnék tapasztalatot szerezni. Letöltöttem a példaprogramot, de hibát dob, hogy
Idézet: „.\firfilter.axf: Error: L6218E: Undefined symbol arm_fir_init_f32 (referred from arm_fir_example_f32.o).”
Sziasztok,
most az UART implementációjánál ütköztem problémába. A küldés működik, viszont a fogadás nem. A probléma az, hogy fogadáskor nem jut el a megszakításhoz. Pedig ha USART_IT_TXE interruptot állítok be, akkor eljut. Tehát az IRQ konfigurációmmal nincs probléma. RXNE esetén már más a helyzet.
#include <stdio.h>
#define MESSAGE1 "Hello!"
#define MESSAGE2 "UART4 Initialized Successfully!"
#define UART4_Port GPIOA
#define UART4_Tx_Pin GPIO_Pin_0
#define UART4_Rx_Pin GPIO_Pin_1
#define UART4_BaudRate 9600
#define LED3_Pin GPIO_Pin_13
#define LED4_Pin GPIO_Pin_14
#define LED_Port GPIOG
#define LED3_On () LED_Port->BSRRL = LED3_Pin
#define LED4_On() LED_Port->BSRRL = LED4_Pin
#define MAX_STRLEN 12 // this is the maximum string length of our string in characters
volatile char received_string[MAX_STRLEN+1]; // this will hold the recieved string
void USART_SendString(USART_TypeDef* USARTx, volatile char* str){
while(*str){
// wait until data register is empty
while(!(USARTx->SR & USART_FLAG_TXE));
USARTx->DR = (*str++ & (uint16_t)0x01FF);
}
}
void UART4_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
GPIO_PinAFConfig(UART4_Port, GPIO_PinSource0, GPIO_AF_UART4);
GPIO_PinAFConfig(UART4_Port, GPIO_PinSource1, GPIO_AF_UART4);
GPIO_InitStruct.GPIO_Pin = UART4_Tx_Pin | UART4_Rx_Pin;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(UART4_Port, &GPIO_InitStruct);
USART_InitStruct.USART_BaudRate = UART4_BaudRate;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_Init(UART4, &USART_InitStruct);
USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(UART4, ENABLE);
}
void LED_Init()
{
GPIO_InitTypeDef LED_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
LED_InitStruct. GPIO_Pin = LED3_Pin | LED4_Pin;
LED_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
LED_InitStruct.GPIO_OType = GPIO_OType_PP;
LED_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
LED_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(LED_Port, &LED_InitStruct);
}
int main(void){
LED_Init();
UART4_Init();
USART_SendString(UART4, MESSAGE1);
USART_SendString(UART4, MESSAGE2);
while(1)
{
}
}
void UART4_IRQHandler(void)
{
if(USART_GetITStatus(UART4, USART_IT_RXNE))
{
LED4_On();
}
}
Probáld igy:
void UART4_IRQHandler(void)
{
if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET){
...
Nem jó. Eszembe jutott megnézni az STM Cube-ban a 429 Disco boardot (ezt használom) és csak az UART5 szabad. Azzal működik szépen.
Módosítottam az IRQ handlert, hogy minden egyes lenyomást vissza küldjön a terminálba. Nemtudom mennyire jó megoldás ez a reális gyakorlatban, de működik. Enter esetén "\n\r" karaktereket kell küldenie. Lehet, hogy a küldést main() -ból kellene intézni.
Sziasztok! Boldog új évet kívánok.
Most az STM32F429disco boardon található gyro szenzorral szórakozok. SPI-al kommunikálok vele. A kommunikáció végülis működik, de van 2 eset:
1.) uint16_t SPI_Send(SPI_TypeDef* SPIx, uint16_t data)
{
SPI_WAIT(SPIx);
SPIx->DR = data;
SPI_WAIT(SPIx);
data = SPIx->DR;
return data;
}
uint8_t L3GD20_SPI5_Read(uint8_t address)
{
uint8_t data;
L3GD20_SPI_NCS_PIN_Low();
SPI_Send(SPI5, address | L3GD20_CMD_Read);
data = SPI_Send(SPI5 ,0xFF);
L3GD20_SPI_NCS_PIN_High();
return data;
}
Ebben az esetben megvalósul a társalgás, meg is kapom a választ.
2.)
uint16_t SPI_Send(SPI_TypeDef* SPIx, uint16_t data)
{
SPI_WAIT(SPIx);
SPIx->DR = data;
}
uint16_t SPI_Receive(SPI_TypeDef* SPIx)
{
uint16_t data;
SPI_WAIT(SPIx);
data = SPIx->DR;
return data;
}
uint8_t L3GD20_SPI5_Read(uint8_t address) {
uint8_t data;
L3GD20_SPI_NCS_PIN_Low();
SPI_Send(SPI5, address | L3GD20_CMD_Read);
SPI_Send(SPI5, 0xFF);
data = SPI_Receive(SPI5);
L3GD20_SPI_NCS_PIN_High();
return data;
}
Ebben az esetben is van kommunikáció, de a data 0 val tér vissza.
A jelfolyam mindkét esetben egyforma. Lásd melléklet.
Miért rossz a 2. megoldás?
Sziasztok!
Most kezdek ismerkedni az STM32F0 Discovery board-al.
Azon belül is a Standard Peripheral Driver-ekkel.
A portok beállítását is ezekre bíznám ( stm32f0xx_gpio.h és stm32f0xx_rcc.h).
Kód:
GPIO_InitTypeDef GPIO_InitStructure;
int main(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC,&GPIO_InitStructure);
while (1)
{
}
}
A problémám az,hogy a "GPIO_Init" és "RCC_AHBPeriphClockCmd" hibádzik a fordítónak.
Undefined reference hibát kapok rájuk.
Holott ezek ott vannak az include fájlokban.
A neten fellelhető példaprogramokban is így használják.
Tudom,hogy a regiszterek beállításával is meg lehetne oldani,de így is működni kellene neki.
Atollic-ban és Keil-ben is ugyan ez a hiba.
Szerintetek mit ronthatok el?
Üdv.:TonyC!
Hozzá vannak adva. Látja is őket.
A mode,speed,type,pu/pd beállításokkal nincs is baja.
Csak azzal a kettővel,amit írtam.
Üdv.:TonyC!
Hozzá kell adni a *.c fájlokat is. Valamint az stm32f0xx_conf.h fajlban kikommentelni az rcc es gpio fajlok include-ját.
Sziasztok!
A napokban kezdtem el ismerkedni az STM32 vezérlőkkel és a hozzá tartozó alap könyvtárakkal.
Jelen pillanatban a GPIO-k adott belső perifériákhoz való illesztését bújom ("I/O pin multiplexer and mapping") és ennek a konfigurálása nem teljesen világos a számomra.
Adott pl. hogy én a USART 1-et szeretném használni, melyhez valamely 2 db GPIO lábat hozzárendelek az Rx és Tx vonal megvalósítása érdekében, a "GPIO_PinAFConfig()" függvény segítségével. Ezzel önmagában még nincsen problémám, azonban számomra ebből még nem derül ki, hogy konkrétan melyik láb lesz a majdani Rx és Tx lábam, csak azt látom ebből, hogy 2 láb hozzá lett multiplexálva a USART 1-hez és ennyi.
Fel tudna ebben valaki világosítani? Vélhetően átsiklottam valami felett a Reference manual-ban.
Köszönöm szépen a gyors segítséget!
Ezek szerint erre a válasz nem a Reference Manual-ban van/volt.
Keresek jóárasított (használt) STM32 F4 discovery kitet megvételre!
Kérem,hogy magánban írjanak.
Köszönöm!
Sziasztok!
STM32F051-el szeretnék 10 db 25 kHz-es PWM jelet elkapni. Használjam a beépített Capture hardvert megszakításokkal (ez ugye 20 * 25000 megszakítás másodpercenként) vagy RC tagokkal konvertàljam ôket analóg jellé és használjam az ADC-t? Melyik a jobb ötlet szerintetek?
Helo.
STM32L0 spi portját szeretném használni de nem nagyon megy. uint8_t readreg(uint8_t address) {
if((SPI1->SR & SPI_SR_TXE) != SPI_SR_TXE) return 0;
uint8_t response;
address &= 0X7F;
reset_nss();
*(__IO uint8_t *)&SPI1->DR = address;
while ((SPI1->SR & SPI_SR_TXE) != SPI_SR_TXE) {/*addsend timeout*/};
while ((SPI1->SR & SPI_SR_RXNE) != SPI_SR_RXNE) {/*no resp timeout*/};
response = (uint8_t)SPI1->DR;
set_nss();
return response;
}
Az spi konfig így néz ki: SPI1->CR1 = (SPI_CR1_MSTR | SPI_CR1_BR_1 | SPI_CR1_SSM | SPI_CR1_SSI); /* (1) */
SPI1->CR2 = 0; /* (2) */
SPI1->CR1 |= SPI_CR1_SPE; /* (3) */
A gpio úgy van beállítva hogy az nss en kívül minden spi szál alternate function. Az nss sima kimenet, szoftverből vezérelném. Egy sx1276 verzió regiszterét olvasnám ki, de 0x12 helyett csak 0 át kapok vissza. Nem az első sor miatt, anélkül is azt csinálja. HAL használatával működött, így nem akar. Mit nem csinálok jól? A hozzászólás módosítva: Júl 25, 2019
A reset_nss(); kellene a rutin elejére!
Igy az első if(vizsgálatnál) nincsen engedélyezve az eszközöd.
Igazából az csak a tx buffert ellenőrzi, hogy üres e, nincs e folyamatban küldés, bár lehet felesleges is. Ha kihagyom belőle, sajnos akkor sem működik. Megszakítással megpróbálom még, de így is mennie kéne. Esetleg még valami időzítési problémára tudok gondolni.
6. sor:
*((__IO uint8_t *)&SPIx->DR) = address
GCC esetén:
__IO uint8_t *spidr = ((__IO uint8_t *)&SPIx->DR);
*spidr = address;
Adatot vagy dummy-t küldesz a cím után? Csak cím írásra nem fog jönni a regiszter érték.
"Adatot vagy dummy-t küldesz a cím után? Csak cím írásra nem fog jönni a regiszter érték." Köszönöm, belegondolva valószínű ez lesz a gond, hazaérek ki is próbálom.
Esetleg ha más is belefutna leírom. 16bites spi keretet be kellett kapcsoljam (SPI1->CR1 |= SPI_CR1_DFF), a küldendő regisztercímet nyolccal balrashifteltem, így kiküld még egy nullás byteot csak az órajel miatt, és rendben visszaér az adat az rxbufferbe. A hozzászólás módosítva: Júl 29, 2019
Nem néztem meg eddig az adatlapot, 16-bites.
Miért nem használsz LL-t, ha már regiszter szinten vagy? Az MX megcsinálja a konfigurálást, ahogy kéred.
|
|