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 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;
}
}
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:
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?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.