Strona 1 z 1
STM32F103 UART przerwanie
: czwartek 05 sty 2017, 22:14
autor: mrmiikeee
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;
}
Re: STM32F103 UART przerwanie
: czwartek 05 sty 2017, 22:52
autor: dambo
Procesor się zawiesza tzn? wchodzi w "default interrupt handler"? Możesz to sprawdzić w debugu?
Re: STM32F103 UART przerwanie
: piątek 06 sty 2017, 02:26
autor: Antystatyczny
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++;
}
}
}
}
Re: STM32F103 UART przerwanie
: piątek 06 sty 2017, 12:08
autor: mrmiikeee
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.
Re: STM32F103 UART przerwanie
: piątek 06 sty 2017, 12:21
autor: mrmiikeee
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
Re: STM32F103 UART przerwanie
: piątek 06 sty 2017, 12:52
autor: ps19
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.
Re: STM32F103 UART przerwanie
: piątek 06 sty 2017, 13:12
autor: mrmiikeee
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****/
Re: STM32F103 UART przerwanie
: piątek 06 sty 2017, 13:16
autor: dambo
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.
Re: STM32F103 UART przerwanie
: piątek 06 sty 2017, 13:43
autor: Antystatyczny
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!

Re: STM32F103 UART przerwanie
: piątek 06 sty 2017, 13:55
autor: dambo
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
Re: STM32F103 UART przerwanie
: piątek 06 sty 2017, 14:00
autor: mrmiikeee
A widzisz..podmieniłem plik i wszystko śmiga, dziękuje wam bardzo wszystkim za pomoc:)
Problem rozwiązany
Pozadrawiam:)
Re: STM32F103 UART przerwanie
: piątek 06 sty 2017, 17:46
autor: ps19
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.
Re: STM32F103 UART przerwanie
: piątek 06 sty 2017, 19:25
autor: mrmiikeee
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
Re: STM32F103 UART przerwanie
: piątek 06 sty 2017, 19:42
autor: ps19
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.
Re: STM32F103 UART przerwanie
: sobota 07 sty 2017, 18:05
autor: mrmiikeee
Na razie, póki co Workbench daje rade, jak będę się przesiadał na Atolic-a , to będę sie odzywał ewentualnie:P