Fórum témák

» Több friss téma
Fórum » STM32 Discovery Kit programozása
 
Témaindító: lolhun1988, idő: Feb 11, 2011
Lapozás: OK   7 / 7
(#) elektros90 válasza kapu48 hozzászólására (») Szept 20, 2016 /
 
Szuper, köszi. Nekem valami más csomag volt ezekkel, de már a Keil v5-höz, a 4-essel nemtudtam megnyitni.
(#) elektros90 válasza elektros90 hozzászólására (») Szept 22, 2016 /
 
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.

  1. #include "stm32f4xx.h"
  2.  
  3. volatile int it_counter = 0;
  4. volatile uint8_t ADC_StartFlag = 0;
  5. volatile uint16_t ADC1_ConversionValue = 0;
  6.  
  7. void TIM2_IRQHandler(){                 //Timer 2 megszakitas kezelese
  8.         TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //Megszakitast jelzo bit torlese
  9.         GPIO_ToggleBits(GPIOG, GPIO_Pin_13)//LED bekapcsolasa - csak hogy lassam a mukodest...
  10.         }
  11.  
  12. void ADC_IRQHandler(){    //ADC megszakítás kezelés
  13.         ADC1_ConversionValue = ADC_GetConversionValue(ADC1); //Eredmeny kiolvasasa
  14.         ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);        //Megszakitast jelzo bit torlese
  15.         GPIO_ToggleBits(GPIOG, GPIO_Pin_14);    //LED bekapcsolasa - csak hogy lassam a mukodest...
  16.         }
  17.  
  18. int main(void){ 
  19.        
  20.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // Ora inicializalas
  21.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); // Ora inicializalas
  22.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE)// Ora inicializalas
  23.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE)// Ora inicializalas
  24.        
  25.         GPIO_InitTypeDef LEDoutput;     //LED pinek inicializalasa a szignalizacio erdekeben
  26.         LEDoutput.GPIO_Mode = GPIO_Mode_OUT;
  27.         LEDoutput.GPIO_OType = GPIO_OType_PP;
  28.         LEDoutput.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
  29.         LEDoutput.GPIO_PuPd = GPIO_PuPd_NOPULL;
  30.         LEDoutput.GPIO_Speed = GPIO_Fast_Speed;
  31.         GPIO_Init(GPIOG, &LEDoutput);
  32.        
  33.         GPIO_InitTypeDef ADC_input;     //Analog pin inicializalasa az ADC szamara
  34.         ADC_input.GPIO_Mode = GPIO_Mode_AN;
  35.         ADC_input.GPIO_Pin = GPIO_Pin_5;
  36.         ADC_input.GPIO_PuPd = GPIO_PuPd_NOPULL;
  37.         ADC_input.GPIO_Speed = GPIO_Fast_Speed;
  38.         GPIO_Init(GPIOA, &ADC_input);
  39.        
  40.         ADC_CommonInitTypeDef ADC_CommonInitStructure; //ADC inicializalas
  41.         ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  42.         ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  43.         ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  44.         ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  45.         ADC_CommonInit(&ADC_CommonInitStructure);
  46.        
  47.         ADC_InitTypeDef ADC1_InitStruct; //ADC1 inicializalas
  48.         ADC1_InitStruct.ADC_ContinuousConvMode = DISABLE;
  49.         ADC1_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
  50.         ADC1_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
  51.         ADC1_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO;
  52.         ADC1_InitStruct.ADC_NbrOfConversion = 1;
  53.         ADC1_InitStruct.ADC_Resolution  =  ADC_Resolution_12b;
  54.         ADC1_InitStruct.ADC_ScanConvMode = DISABLE;
  55.         ADC_Init(ADC1, &ADC1_InitStruct);
  56.         ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_3Cycles);
  57.         ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
  58.        
  59.         TIM_TimeBaseInitTypeDef TIM2_InitStruct;        //TIM2 inicializalas
  60.         TIM2_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
  61.         TIM2_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
  62.         TIM2_InitStruct.TIM_Period =    100 - 1;
  63.         TIM2_InitStruct.TIM_Prescaler  =  450-1;
  64.         TIM2_InitStruct.TIM_RepetitionCounter = 0;
  65.         TIM_TimeBaseInit(TIM2, &TIM2_InitStruct);
  66.         TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
  67.         TIM_ITConfig(TIM2, TIM_IT_Update , ENABLE);
  68.  
  69.         NVIC_InitTypeDef NVIC_InitStructure; //Timer2 megszakitasok inicializalasa
  70.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  71.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  72.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  73.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  74.         NVIC_Init(&NVIC_InitStructure);
  75.        
  76.         NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn; //ADC megszakitasok inicializalasa
  77.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  78.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  79.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  80.         NVIC_Init(&NVIC_InitStructure);
  81.  
  82.         TIM_Cmd(TIM2, ENABLE)//Timer 2 engedelyezese
  83.         ADC_Cmd(ADC1,ENABLE);      //ADC1 engedelyezese
  84.        
  85.         while(1)
  86.         {
  87.         }
  88. }
(#) elektros90 hozzászólása Okt 16, 2016 /
 
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).”
(#) elektros90 hozzászólása Nov 17, 2016 /
 
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.

  1. #include "stm32f4xx.h"
  2. #include <stdio.h>
  3.  
  4. #define MESSAGE1 "Hello!"
  5. #define MESSAGE2 "UART4 Initialized Successfully!"
  6.  
  7. #define UART4_Port GPIOA
  8. #define UART4_Tx_Pin GPIO_Pin_0
  9. #define UART4_Rx_Pin GPIO_Pin_1
  10. #define UART4_BaudRate 9600
  11.  
  12. #define LED3_Pin GPIO_Pin_13
  13. #define LED4_Pin GPIO_Pin_14
  14. #define LED_Port GPIOG
  15.  
  16. #define LED3_On() LED_Port->BSRRL = LED3_Pin
  17. #define LED4_On() LED_Port->BSRRL = LED4_Pin
  18.  
  19. #define MAX_STRLEN 12 // this is the maximum string length of our string in characters
  20. volatile char received_string[MAX_STRLEN+1]; // this will hold the recieved string
  21.  
  22. void USART_SendString(USART_TypeDef* USARTx, volatile char* str){
  23.  
  24.         while(*str){
  25.                 // wait until data register is empty
  26.                 while(!(USARTx->SR & USART_FLAG_TXE));
  27.                 USARTx->DR = (*str++ & (uint16_t)0x01FF);
  28.         }
  29. }
  30.  
  31.  
  32.  
  33. void UART4_Init()
  34. {
  35.                 GPIO_InitTypeDef GPIO_InitStruct;
  36.                 USART_InitTypeDef USART_InitStruct;
  37.                 NVIC_InitTypeDef NVIC_InitStructure;
  38.                
  39.                 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  40.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
  41.                
  42.                 GPIO_PinAFConfig(UART4_Port, GPIO_PinSource0, GPIO_AF_UART4);
  43.                 GPIO_PinAFConfig(UART4_Port, GPIO_PinSource1, GPIO_AF_UART4);
  44.        
  45.                 GPIO_InitStruct.GPIO_Pin = UART4_Tx_Pin | UART4_Rx_Pin;
  46.                 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  47.                 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  48.                 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  49.                 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
  50.                 GPIO_Init(UART4_Port, &GPIO_InitStruct);
  51.                
  52.                 USART_InitStruct.USART_BaudRate = UART4_BaudRate;
  53.                 USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  54.                 USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  55.                 USART_InitStruct.USART_Parity = USART_Parity_No;
  56.                 USART_InitStruct.USART_StopBits = USART_StopBits_1;
  57.                 USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  58.                 USART_Init(UART4, &USART_InitStruct);
  59.                
  60.                 USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
  61.                
  62.                 NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
  63.                 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  64.                 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  65.                 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  66.                 NVIC_Init(&NVIC_InitStructure);
  67.                
  68.                 USART_Cmd(UART4, ENABLE);
  69. }
  70.  
  71. void LED_Init()
  72. {
  73.                 GPIO_InitTypeDef LED_InitStruct;       
  74.        
  75.                 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
  76.                
  77.                 LED_InitStruct.GPIO_Pin = LED3_Pin | LED4_Pin;
  78.                 LED_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  79.                 LED_InitStruct.GPIO_OType = GPIO_OType_PP;
  80.                 LED_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  81.                 LED_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
  82.                 GPIO_Init(LED_Port, &LED_InitStruct);
  83. }
  84.  
  85.  
  86.  
  87. int main(void){
  88.                 LED_Init();
  89.                 UART4_Init();
  90.                 USART_SendString(UART4, MESSAGE1);
  91.                 USART_SendString(UART4, MESSAGE2);
  92.        
  93.        
  94.                 while(1)
  95.                 {
  96.  
  97.                 }
  98.  
  99. }
  100.  
  101. void UART4_IRQHandler(void)
  102. {
  103.           LED3_On();
  104.                 if(USART_GetITStatus(UART4, USART_IT_RXNE))
  105.                 {
  106.                                         LED4_On();
  107.                 }
  108. }
(#) kapu48 válasza elektros90 hozzászólására (») Nov 17, 2016 /
 
Probáld igy:
  1. void UART4_IRQHandler(void)
  2. {
  3.           LED3_On();
  4.      if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET){
  5. ...
(#) elektros90 válasza kapu48 hozzászólására (») Nov 17, 2016 /
 
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.
(#) elektros90 hozzászólása Jan 4, 2017 /
 
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.)
  1. uint16_t SPI_Send(SPI_TypeDef* SPIx, uint16_t data)
  2. {
  3.         SPI_WAIT(SPIx);
  4.         SPIx->DR = data;
  5.         SPI_WAIT(SPIx);
  6.         data = SPIx->DR;
  7.         return data;
  8. }
  9.  
  10. uint8_t L3GD20_SPI5_Read(uint8_t address)
  11. {
  12.         uint8_t data;
  13.         L3GD20_SPI_NCS_PIN_Low();
  14.         SPI_Send(SPI5, address | L3GD20_CMD_Read);
  15.         data = SPI_Send(SPI5 ,0xFF);
  16.         L3GD20_SPI_NCS_PIN_High();
  17.         return data;
  18. }


Ebben az esetben megvalósul a társalgás, meg is kapom a választ.

2.)

  1. uint16_t SPI_Send(SPI_TypeDef* SPIx, uint16_t data)
  2. {
  3.         SPI_WAIT(SPIx);
  4.         SPIx->DR = data;
  5. }
  6.  
  7. uint16_t SPI_Receive(SPI_TypeDef* SPIx)
  8. {       
  9.         uint16_t data;
  10.         SPI_WAIT(SPIx);
  11.         data = SPIx->DR;
  12.         return data;
  13. }
  14.  
  15. uint8_t L3GD20_SPI5_Read(uint8_t address) {
  16.         uint8_t data;
  17.         L3GD20_SPI_NCS_PIN_Low();
  18.         SPI_Send(SPI5, address | L3GD20_CMD_Read);
  19.         SPI_Send(SPI5, 0xFF);
  20.         data = SPI_Receive(SPI5);
  21.         L3GD20_SPI_NCS_PIN_High();
  22.         return data;
  23. }

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?
(#) TonyC hozzászólása Feb 6, 2017 /
 
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:
  1. #include "stm32f0xx.h"
  2. #include "stm32f0xx_gpio.h"
  3. #include "stm32f0xx_rcc.h"
  4.  
  5. GPIO_InitTypeDef GPIO_InitStructure;
  6.  
  7. int main(void)
  8. {
  9.  
  10.          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOC,ENABLE);
  11.  
  12.             GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  13.             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  14.             GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.             GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  16.             GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
  17.             GPIO_Init(GPIOA,&GPIO_InitStructure);
  18.  
  19.             GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  20.             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  21.             GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  22.             GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  23.             GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  24.             GPIO_Init(GPIOC,&GPIO_InitStructure);
  25.  
  26.  
  27.  
  28.   while (1)
  29.   {
  30.  
  31.  
  32.  
  33.   }
  34. }


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!
(#) kapu48 válasza TonyC hozzászólására (») Feb 6, 2017 /
 
Hozzá kel adnod a használni kívánt fájlokat:
Add Source Files to Project
(#) TonyC válasza kapu48 hozzászólására (») Feb 6, 2017 /
 
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!
(#) elektros90 válasza TonyC hozzászólására (») Feb 8, 2017 /
 
Hozzá kell adni a *.c fájlokat is. Valamint az stm32f0xx_conf.h fajlban kikommentelni az rcc es gpio fajlok include-ját.
(#) dzsonszpartan hozzászólása Márc 7, 2017 /
 
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.
(#) cimopata válasza dzsonszpartan hozzászólására (») Márc 7, 2017 /
 
(#) dzsonszpartan válasza cimopata hozzászólására (») Márc 7, 2017 /
 
Köszönöm szépen a gyors segítséget!

Ezek szerint erre a válasz nem a Reference Manual-ban van/volt.
(#) tlorincz72 hozzászólása Nov 13, 2017 /
 
Keresek jóárasított (használt) STM32 F4 discovery kitet megvételre!
Kérem,hogy magánban írjanak.
Köszönöm!
Következő: »»   7 / 7
Bejelentkezés

Belépés

Hirdetés
Frissek
2017. Nov, 21. Kedd
23:43:44
Jelenleg 198 fő olvassa az oldalt
Online tagok:
Lapoda.hu     XDT.hu     HEStore.hu