STM32F103 UART przerwanie

Tu możesz pisać o swoich problemach z pisaniem programów w języku C/C++ dla STM.
mrmiikeee
Posty: 7
Rejestracja: czwartek 05 sty 2017, 18:15

STM32F103 UART przerwanie

Postautor: mrmiikeee » czwartek 05 sty 2017, 22:14

Cześć

Mam kłopot, wykonuję ćwiczenia według "Poradnik STM32 v1_9" z elektrody,Chodzi o cykl STM32 bez bibliotek SPL.
Problem jest kiedy staram się odebrać dane w przerwaniu, po wysłaniu jakiegoś znaku z terminala, procesor się zawiesza.
Natomiast jeśli wyłączę przerwania NVIC_EnableIRQ(USART1_IRQn); a całą procedurę obsługi przerwania przeniosę do
głównej pętli while to wszystko śmiga wyśmienicie.
Ktoś ma może jakieś sugestie?

Kod: Zaznacz cały

#include "stm32f10x.h"

int main(void)
{
RCC->APB2ENR = RCC_APB2ENR_USART1EN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN;

gpio_pin_cfg(GPIOB, PB1, gpio_mode_output_PP_2MHz);

gpio_pin_cfg(GPIOA, PA9, gpio_mode_alternate_PP_2MHz);
gpio_pin_cfg(GPIOA, PA10, gpio_mode_input_floating);

SysTick_Config(8000000/2);

USART1->BRR = 8000000/9600;
USART1->CR1 = USART_CR1_UE | USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE;

NVIC_EnableIRQ(USART1_IRQn);


while(1)
{
//__WFI();

}
}

__attribute__((interrupt)) void USART1_IRQHandler(void)
{
if ( USART1->SR & USART_SR_RXNE)
{
USART1->SR &= ~USART_SR_RXNE;
uint16_t tmp;
tmp = USART1->DR;
USART1->DR = tmp+1;
}
}

__attribute__((interrupt)) void SysTick_Handler(void){
GPIOB->ODR ^= PB1;
}

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

Re: STM32F103 UART przerwanie

Postautor: dambo » czwartek 05 sty 2017, 22:52

Procesor się zawiesza tzn? wchodzi w "default interrupt handler"? Możesz to sprawdzić w debugu?
Nowy blog o tematyce embedded -> https://www.embedownik.pl/

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: STM32F103 UART przerwanie

Postautor: Antystatyczny » piątek 06 sty 2017, 02:26

W Reference Manual dla F103 napisane jest, że nie musisz kasować flagi RXNE, wystarczy odczytać rejestr DR. Przede wszystkim jednak wywaliłbym z przerwania ostatnia linię, czyli USART1->DR = tmp +1;
A tak z innej beczki... na PB1 widzisz przebieg prostokątny?
A tutaj sposób, w jaki ja odbieram dane przez usart:

Kod: Zaznacz cały

void USART2_IRQHandler(void)

{

   uint16_t status, rxTmp;



   status = USART2->SR;



   /* Transmit data register empty flag */

   if((status & USART_SR_TXE) != 0)

   {

      /* currently unused */

   }



   /* Transmission complete flag */

   if((status & USART_SR_TC) != 0)

   {

      if(BUFFER_IsEmpty(&hBufferTx) == BUFFER_STATE_NOT_EMPTY)

      {

         USART2->DR = (uint16_t)BUFFER_GetByte(&hBufferTx);

      }

      else

      {

         USART2->CR1 &= ~USART_CR1_TCIE;

      }

   }



   /* (Read) data register not empty flag */

   if((status & USART_SR_RXNE) != 0)

   {

      rxTmp = USART2->DR;

      if(BUFFER_IsFull(&hBufferRx) == BUFFER_STATE_NOT_FULL)

      {

         BUFFER_PutByte(&hBufferRx, rxTmp);



         if(rxTmp == frameLimiter)

         {

            flag++;

         }

      }

   }

}
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

mrmiikeee
Posty: 7
Rejestracja: czwartek 05 sty 2017, 18:15

Re: STM32F103 UART przerwanie

Postautor: mrmiikeee » piątek 06 sty 2017, 12:08

dambo pisze:Procesor się zawiesza tzn? wchodzi w "default interrupt handler"? Możesz to sprawdzić w debugu?


Nie mam pojęcia i nawet nie wiem jak to sprawdzić.
w programie mam migającą diodę , po wysłaniu jakiegoś znaku z terminala, dioda przestaje migać, po naciśnięciu resetu na płytce z procesorem miganie diodą się wznawia i tak w kółko.


W debugerze wygląda to tak ze po wysłaniu znaku z konsoli widzę jej wartość w rejestrze DR następnie setuje się flaga RXNE i IDLE w natepnym kroku obie flagi sie resetują i nic wiecej sie nie dzieje, debugera mi nie wysypuje.

mrmiikeee
Posty: 7
Rejestracja: czwartek 05 sty 2017, 18:15

Re: STM32F103 UART przerwanie

Postautor: mrmiikeee » piątek 06 sty 2017, 12:21

Antystatyczny pisze:W Reference Manual dla F103 napisane jest, że nie musisz kasować flagi RXNE, wystarczy odczytać rejestr DR. Przede wszystkim jednak wywaliłbym z przerwania ostatnia linię, czyli USART1->DR = tmp +1;
A tak z innej beczki... na PB1 widzisz przebieg prostokątny?
A tutaj sposób, w jaki ja odbieram dane przez usart:


Hey,
Rzeczywiscie, masz racje z ta flagą RXNE, dziekuje za cenna uwagę, odnośnie PB1 nie mam oscyloskopu:) ale dioda ładnie sobie mruga, wiec napewno jest protokątny.
Jeśli chodzi o zapis programu to powinien być ok, wszystko działa bez przerwań ,a nie zauważyłem aby ktoś zgłaszał jakiekolwiek zastrzeżenia do tego kawałka kodu z tego poradnika.

Taka ciekawostka, wcześniej próbowałem odpalić uarta użwając bibliotek STL, i problem był podobny , ze w pętli main wszystko smigało a w przerwaniu juz nie.
Dlatego zrezygnowałem z tych bibliotek ale problem widocznie tkwi w czymś innym.

Dziękuję za odpowiedz, postaram się zaimplementować twój kawałek kodu i odpalić Uarat-a nr. 2 ,zobaczymy czy problem tez bedzie występował.
Pozdrawiam

ps19
Newb
Newb
Posty: 56
Rejestracja: poniedziałek 05 paź 2015, 22:27
Lokalizacja: Opole
Kontaktowanie:

Re: STM32F103 UART przerwanie

Postautor: ps19 » piątek 06 sty 2017, 12:52

Jak nie będzie działać pokaż plik startup - jakiego edytora używasz Attolic/Keil/Workbench STM32 ?

Pamiętam, żemiałem podobny problem z przerwaniami i okazało się, że w pliku startup nie ma wektorów.

mrmiikeee
Posty: 7
Rejestracja: czwartek 05 sty 2017, 18:15

Re: STM32F103 UART przerwanie

Postautor: mrmiikeee » piątek 06 sty 2017, 13:12

ps19 pisze:Jak nie będzie działać pokaż plik startup - jakiego edytora używasz Attolic/Keil/Workbench STM32 ?

Pamiętam, żemiałem podobny problem z przerwaniami i okazało się, że w pliku startup nie ma wektorów.



Hey,
Używam System Workbench for STM32 poniżej plik startup_stm32.s

Kod: Zaznacz cały

/**
  ******************************************************************************
  * @file      startup_stm32.s
  * @author    Ac6
  * @version   V1.0.0
  * @date      12-June-2014
  ******************************************************************************
  */

  .syntax unified
  .cpu cortex-m3
  .thumb

.global   g_pfnVectors
.global   Default_Handler

/* start address for the initialization values of the .data section.
defined in linker script */
.word   _sidata
/* start address for the .data section. defined in linker script */
.word   _sdata
/* end address for the .data section. defined in linker script */
.word   _edata
/* start address for the .bss section. defined in linker script */
.word   _sbss
/* end address for the .bss section. defined in linker script */
.word   _ebss

.equ  BootRAM,        0xF1E0F85F
/**
 * @brief  This is the code that gets called when the processor first
 *          starts execution following a reset event. Only the absolutely
 *          necessary set is performed, after which the application
 *          supplied main() routine is called.
 * @param  None
 * @retval : None
*/

    .section   .text.Reset_Handler
   .weak   Reset_Handler
   .type   Reset_Handler, %function
Reset_Handler:

/* Copy the data segment initializers from flash to SRAM */
  movs   r1, #0
  b   LoopCopyDataInit

CopyDataInit:
   ldr   r3, =_sidata
   ldr   r3, [r3, r1]
   str   r3, [r0, r1]
   adds   r1, r1, #4

LoopCopyDataInit:
   ldr   r0, =_sdata
   ldr   r3, =_edata
   adds   r2, r0, r1
   cmp   r2, r3
   bcc   CopyDataInit
   ldr   r2, =_sbss
   b   LoopFillZerobss
/* Zero fill the bss segment. */
FillZerobss:
   movs r3, #0
    str  r3, [r2]
   adds r2, r2, #4

LoopFillZerobss:
   ldr   r3, = _ebss
   cmp   r2, r3
   bcc   FillZerobss

/* Call the clock system intitialization function.*/
    bl  SystemInit
/* Call static constructors */
    bl __libc_init_array
/* Call the application's entry point.*/
   bl   main

LoopForever:
    b LoopForever

.size   Reset_Handler, .-Reset_Handler

/**
 * @brief  This is the code that gets called when the processor receives an
 *         unexpected interrupt.  This simply enters an infinite loop, preserving
 *         the system state for examination by a debugger.
 *
 * @param  None
 * @retval : None
*/
    .section   .text.Default_Handler,"ax",%progbits
Default_Handler:
Infinite_Loop:
   b   Infinite_Loop
   .size   Default_Handler, .-Default_Handler
/******************************************************************************
*
* The minimal vector table for a Cortex-M.  Note that the proper constructs
* must be placed on this to ensure that it ends up at physical address
* 0x0000.0000.
*
******************************************************************************/
    .section   .isr_vector,"a",%progbits
   .type   g_pfnVectors, %object
   .size   g_pfnVectors, .-g_pfnVectors

g_pfnVectors:
   .word   _estack
   .word   Reset_Handler
   .word   NMI_Handler
   .word   HardFault_Handler
   .word   MemManage_Handler
   .word   BusFault_Handler
   .word   UsageFault_Handler
   .word   0
   .word   0
   .word   0
   .word   0
   .word   SVC_Handler
   .word   DebugMon_Handler
   .word   0
   .word   PendSV_Handler
   .word   SysTick_Handler
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0
   .word   0

/*******************************************************************************
*
* Provide weak aliases for each Exception handler to the Default_Handler.
* As they are weak aliases, any function with the same name will override
* this definition.
*
*******************************************************************************/

     .weak   NMI_Handler
   .thumb_set NMI_Handler,Default_Handler

     .weak   HardFault_Handler
   .thumb_set HardFault_Handler,Default_Handler

     .weak   MemManage_Handler
   .thumb_set MemManage_Handler,Default_Handler

     .weak   BusFault_Handler
   .thumb_set BusFault_Handler,Default_Handler

   .weak   UsageFault_Handler
   .thumb_set UsageFault_Handler,Default_Handler

   .weak   SVC_Handler
   .thumb_set SVC_Handler,Default_Handler

   .weak   DebugMon_Handler
   .thumb_set DebugMon_Handler,Default_Handler

   .weak   PendSV_Handler
   .thumb_set PendSV_Handler,Default_Handler

   .weak   SysTick_Handler
   .thumb_set SysTick_Handler,Default_Handler

   .weak   SystemInit

/************************ (C) COPYRIGHT Ac6 *****END OF FILE****/

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

Re: STM32F103 UART przerwanie

Postautor: dambo » piątek 06 sty 2017, 13:16

to musisz używać jakiejś mega starej wersji - nie masz tam wektorów przerwań zapisanych, więc procesor nie wie co ma zrobić gdy zobaczy takie coś.
Mogę Ci podesłać ten plik, ale żeby w przyszłości nie mieć tego problemu spróbuj pobrać najnowszą wersję, pamiętam, że kiedyś też tak miałem dla F0, ze nie było w pliku wektorów przerwań. W tych nowych jest ok.
Nowy blog o tematyce embedded -> https://www.embedownik.pl/

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: STM32F103 UART przerwanie

Postautor: Antystatyczny » piątek 06 sty 2017, 13:43

O kurczę, faktycznie. Na to bym nie wpadł, że w tzw. rozbiegówce brakuje wektorów przerwań. No tak... w takim przypadku program skacze w zasadzie w nicość. Widać, że wektor dla SysTicka jest, dlatego dioda sobie radośnie migała.

Dambo, szacun! :)
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

Re: STM32F103 UART przerwanie

Postautor: dambo » piątek 06 sty 2017, 13:55

to kolega ps19 dał pomysł ze startupem :)

ja dla f0 dopisywałem kiedyś je ręcznie :) zmarnowany dzień miałem na szukanie czemu to nie działa, ale czegoś się nauczyłem :p
Nowy blog o tematyce embedded -> https://www.embedownik.pl/

mrmiikeee
Posty: 7
Rejestracja: czwartek 05 sty 2017, 18:15

Re: STM32F103 UART przerwanie

Postautor: mrmiikeee » piątek 06 sty 2017, 14:00

A widzisz..podmieniłem plik i wszystko śmiga, dziękuje wam bardzo wszystkim za pomoc:)
Problem rozwiązany
Pozadrawiam:)

ps19
Newb
Newb
Posty: 56
Rejestracja: poniedziałek 05 paź 2015, 22:27
Lokalizacja: Opole
Kontaktowanie:

Re: STM32F103 UART przerwanie

Postautor: ps19 » piątek 06 sty 2017, 17:46

Ja to sprawdzam zawsze na początku i między innymi dlatego nie korzystam z Eclipsa od ST (Nie dodawał kompletnych startup`ów i sypał się na Debug`u) tylko Attolic Studio i myślę nad studencką wersją SysProg (VisualGDB). Java zawsze sypie się w najbardziej krytycznych momentach.

mrmiikeee
Posty: 7
Rejestracja: czwartek 05 sty 2017, 18:15

Re: STM32F103 UART przerwanie

Postautor: mrmiikeee » piątek 06 sty 2017, 19:25

Powiem Ci ze na początku próbowałem z Atolic Studio ale miałem problemy z ST- linkiem zawsze dostawałem:

"Error in initializing ST-Link device."
dlatego korzystam z Workbench-a, ale rzeczywiscie jak tak teraz patrze na plik startup z Atolic studio to tam wszystko jest...
A jak się tworzy nowy projekt w Atolic bez użycia bibliotek? jest w ogóle taka możliwość?
pozdrawaim

ps19
Newb
Newb
Posty: 56
Rejestracja: poniedziałek 05 paź 2015, 22:27
Lokalizacja: Opole
Kontaktowanie:

Re: STM32F103 UART przerwanie

Postautor: ps19 » piątek 06 sty 2017, 19:42

Jest, tworzysz z HAL i potem w ustawieniach projektu trzeba wyrzucić definicję USE_HAL.... i wyrzucić w linkera linki z halem, albo zostawić bibliotekę niech sobie jest i poprostu nie inkludować jej. Później postaram się napisać dokładniej bo nie pamiętam dokładnie.

mrmiikeee
Posty: 7
Rejestracja: czwartek 05 sty 2017, 18:15

Re: STM32F103 UART przerwanie

Postautor: mrmiikeee » sobota 07 sty 2017, 18:05

Na razie, póki co Workbench daje rade, jak będę się przesiadał na Atolic-a , to będę sie odzywał ewentualnie:P


Wróć do „Programowanie STM w C/C++”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 6 gości