Keil / STM32F4 - Simulering av GPIO

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Mr Andersson
Inlägg: 1409
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Keil / STM32F4 - Simulering av GPIO

Inlägg av Mr Andersson »

Hej.
Jag försöker lära mig lite embedded-programmering men jag har lite problem med att få Keils hårdvarusimulering att samarbeta. Att jag valde just Keil är för att det är det enda IDE jag hittat som har simulering av 'peripherals' och inte bara själva ARM-instruktionerna. Jag har en STM32F4-Discovery på gång men tullen verkar vara på strejk, den har legat på Arlanda i nästan 2 veckor nu.

Vad jag har gjort:
Nytt projekt. Valde STM32F407VG som MCU och under Components -> Device valde jag GPIO och alla dependencies.
Under target options har jag valt 'Use Simulator'
Testkörning bara så att se att allt fungerar..
Oops "*** error 65: access violation at 0x40023800 : no 'read' permission" i SystemInit() (det är en funktion som ST skrivit och som MDK-ARM inkluderar)
Enligt databladet så är 0x40023800 i Peripheral memory region så jag la till

Kod: Markera allt

MAP 0x40000000, 0x5FFFFFFF READ WRITE
Som 'initialization file' till simulatorn. Allt verkar fungera.

Som main.c har jag

Kod: Markera allt

#include "stm32f4xx_gpio.h"

void init_gpio()
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef i;
    i.GPIO_Pin = GPIO_Pin_All;
    i.GPIO_Mode = GPIO_Mode_OUT;
    i.GPIO_Speed = GPIO_Speed_2MHz;
    i.GPIO_OType = GPIO_OType_PP;
    i.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &i);
}

int main()
{
    init_gpio();
    
    while(1)
    {
        GPIOA->BSRRL |= 0xFFFF;
        GPIOA->BSRRH |= 0xFFFF;
    }
}
Om jag förstår databladet rätt så ska en 1a i BSRRL (BS15:BS0 i databladet) sätta motsvarande pinne hög och en 1a i BSRRH (BR15:BR0 i databladet) sätta pinnen låg, men ingenting händer. (Peripherals -> System Viewer -> GPIOA i simulatorn). Om jag däremot skriver direkt till ODR så ser jag i simulatorn att värdet ändras.
Så nu är min fråga; Är det jag som gjort något fel eller är det μVision som inte simulerar BSRR korrekt?
En sak jag tyckte verkade konstigt är att enligt databladet så är GPIOx_ODR 16 bitar men i Keils include-filer är dom 32 bitar.

Nu är det ju egentligen inget problem att ändra koden till att skriva till ODR direkt. Det stör mig bara att inte veta varför det här inte fungerar :)

En annan sak från databladet jag funderar över:
Using the GPIOx_BSRR register to change the values of individual bits in GPIOx_ODR is a
“one-shot” effect that does not lock the GPIOx_ODR bits. The GPIOx_ODR bits can always
be accessed directly. The GPIOx_BSRR register provides a way of performing atomic
bitwise handling.
There is no need for the software to disable interrupts when programming the GPIOx_ODR
at bit level: it is possible to modify one or more bits in a single atomic AHB write access.
Menar dom att det är enbart om man ändrar ODR genom BSRR som det är det en atomisk operation, eller att det går att skriva direkt till ODR som en atomisk operation? Och vad betyder AHB?
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 15546
Blev medlem: 16 april 2006, 17:04:10

Re: Keil / STM32F4 - Simulering av GPIO

Inlägg av mrfrenzy »

Jag kan inte ge några tips om Keil men däremot har jag mycket bra erfarenhet av Proteus VSM.
Det är en komplett simulator med inbyggd debugger där man kan koppla upp microcontrollers med analog elektronik, lcd-displayer, ethernetmoduler och det mesta man kan tänka sig. Den stödjer bland annat Cortex M3.


Nedanstående bild visar ett exempel med en klon av PICDEM2+
"containing PIC18F452,Alpha LCD, TC74 temp sensor, 24LC256 I2C EEPROM, RS232 terminal and various buttons, pots, LED's etc."
Bild
Skriv svar