Added FreeRTOS

This commit is contained in:
Alexei 2023-01-22 15:25:15 +07:00
parent 22a382e475
commit 35635fe2ea
6 changed files with 269 additions and 78 deletions

View File

@ -40,7 +40,7 @@
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h> ; </h>
Stack_Size EQU 0x00002000 Stack_Size EQU 0x00000200
AREA STACK, NOINIT, READWRITE, ALIGN = 3 AREA STACK, NOINIT, READWRITE, ALIGN = 3
Stack_Mem SPACE Stack_Size Stack_Mem SPACE Stack_Size
@ -51,7 +51,7 @@ __initial_sp
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h> ; </h>
Heap_Size EQU 0x00002000 Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN = 3 AREA HEAP, NOINIT, READWRITE, ALIGN = 3
__heap_base __heap_base
@ -166,6 +166,7 @@ Reset_Handler PROC
EXPORT Reset_Handler [WEAK] EXPORT Reset_Handler [WEAK]
IMPORT __main IMPORT __main
IMPORT SystemInit IMPORT SystemInit
IMPORT prvGetRegistersFromStack
LDR R0, =SystemInit LDR R0, =SystemInit
BLX R0 BLX R0
LDR R0, =__main LDR R0, =__main
@ -178,9 +179,24 @@ NMI_Handler PROC
B . B .
ENDP ENDP
HardFault_Handler PROC HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK] EXPORT HardFault_Handler [WEAK]
B .
movs r1, #4
mov r2, lr
tst r1, r2
bne lable
mrs r0, msp
nop
b lable1
lable
mrs r0, psp
lable1
ldr r1, [r0, #24]
ldr r2, =prvGetRegistersFromStack
bx r2
ENDP ENDP
MemManage_Handler PROC MemManage_Handler PROC

View File

@ -50,7 +50,7 @@ extern uint32_t SystemCoreClock;
/* Constants that describe the hardware and memory usage. */ /* Constants that describe the hardware and memory usage. */
#define configCPU_CLOCK_HZ (SystemCoreClock) #define configCPU_CLOCK_HZ (SystemCoreClock)
#define configTICK_RATE_HZ ((TickType_t)1000) #define configTICK_RATE_HZ ((TickType_t)1000)
#define configTOTAL_HEAP_SIZE ((size_t)4096) #define configTOTAL_HEAP_SIZE ((size_t)8192)
#define configMINIMAL_STACK_SIZE ((uint16_t)256) #define configMINIMAL_STACK_SIZE ((uint16_t)256)
#define configSUPPORT_DYNAMIC_ALLOCATION 1 #define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configSUPPORT_STATIC_ALLOCATION 0 #define configSUPPORT_STATIC_ALLOCATION 0
@ -82,15 +82,15 @@ extern uint32_t SystemCoreClock;
#define configUSE_CO_ROUTINES 0 #define configUSE_CO_ROUTINES 0
/* Constants provided for debugging and optimisation assistance. */ /* Constants provided for debugging and optimisation assistance. */
#define configCHECK_FOR_STACK_OVERFLOW 0 #define configCHECK_FOR_STACK_OVERFLOW 1
#define configQUEUE_REGISTRY_SIZE 0 #define configQUEUE_REGISTRY_SIZE 0
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } #define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
/* Constants that define which hook (callback) functions should be used. */ /* Constants that define which hook (callback) functions should be used. */
#define configUSE_IDLE_HOOK 0 #define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0 #define configUSE_TICK_HOOK 1
#define configUSE_DAEMON_TASK_STARTUP_HOOK 0 #define configUSE_DAEMON_TASK_STARTUP_HOOK 0
#define configUSE_MALLOC_FAILED_HOOK 0 #define configUSE_MALLOC_FAILED_HOOK 1
/* Port specific configuration. */ /* Port specific configuration. */
#define configENABLE_MPU 0 #define configENABLE_MPU 0
@ -106,7 +106,7 @@ extern uint32_t SystemCoreClock;
#define configPRIO_BITS __NVIC_PRIO_BITS #define configPRIO_BITS __NVIC_PRIO_BITS
#else #else
/* 7 priority levels */ /* 7 priority levels */
#define configPRIO_BITS 3 #define configPRIO_BITS 4
#endif #endif
/* The lowest interrupt priority that can be used in a call to a "set priority" function. */ /* The lowest interrupt priority that can be used in a call to a "set priority" function. */

View File

@ -20,8 +20,8 @@
#define RTE_RTOS_FreeRTOS_CONFIG /* RTOS FreeRTOS Config for FreeRTOS API */ #define RTE_RTOS_FreeRTOS_CONFIG /* RTOS FreeRTOS Config for FreeRTOS API */
/* ARM.FreeRTOS::RTOS:Core:Cortex-M:10.5.1 */ /* ARM.FreeRTOS::RTOS:Core:Cortex-M:10.5.1 */
#define RTE_RTOS_FreeRTOS_CORE /* RTOS FreeRTOS Core */ #define RTE_RTOS_FreeRTOS_CORE /* RTOS FreeRTOS Core */
/* ARM.FreeRTOS::RTOS:Heap:Heap_4:10.5.1 */ /* ARM.FreeRTOS::RTOS:Heap:Heap_2:10.5.1 */
#define RTE_RTOS_FreeRTOS_HEAP_4 /* RTOS FreeRTOS Heap 4 */ #define RTE_RTOS_FreeRTOS_HEAP_2 /* RTOS FreeRTOS Heap 2 */
/* GigaDevice::Device:GD32F10x_StdPeripherals:EXTI:2.0.2 */ /* GigaDevice::Device:GD32F10x_StdPeripherals:EXTI:2.0.2 */
#define RTE_DEVICE_STDPERIPHERALS_EXTI #define RTE_DEVICE_STDPERIPHERALS_EXTI
/* GigaDevice::Device:GD32F10x_StdPeripherals:GPIO:2.0.2 */ /* GigaDevice::Device:GD32F10x_StdPeripherals:GPIO:2.0.2 */

View File

@ -153,24 +153,7 @@
<Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F10x_CL -FS08000000 -FL040000 -FP0($$Device:GD32F107VC$Flash\GD32F10x_CL.FLM))</Name> <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F10x_CL -FS08000000 -FL040000 -FP0($$Device:GD32F107VC$Flash\GD32F10x_CL.FLM))</Name>
</SetRegEntry> </SetRegEntry>
</TargetDriverDllRegistry> </TargetDriverDllRegistry>
<Breakpoint> <Breakpoint/>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>0</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134218370</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename></Filename>
<ExecCommand></ExecCommand>
<Expression>0x08000282</Expression>
</Bp>
</Breakpoint>
<MemoryWindow1> <MemoryWindow1>
<Mm> <Mm>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
@ -180,7 +163,7 @@
</Mm> </Mm>
</MemoryWindow1> </MemoryWindow1>
<ScvdPack> <ScvdPack>
<Filename>C:\Users\User\AppData\Local\Arm\Packs\ARM\CMSIS-FreeRTOS\10.5.1\CMSIS\RTOS2\FreeRTOS\FreeRTOS.scvd</Filename> <Filename>E:\Arm\Packs\ARM\CMSIS-FreeRTOS\10.5.1\CMSIS\RTOS2\FreeRTOS\FreeRTOS.scvd</Filename>
<Type>ARM.CMSIS-FreeRTOS.10.5.1</Type> <Type>ARM.CMSIS-FreeRTOS.10.5.1</Type>
<SubType>1</SubType> <SubType>1</SubType>
</ScvdPack> </ScvdPack>
@ -231,7 +214,7 @@
<Group> <Group>
<GroupName>Source Group 1</GroupName> <GroupName>Source Group 1</GroupName>
<tvExp>0</tvExp> <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>

View File

@ -317,28 +317,28 @@
<interw>1</interw> <interw>1</interw>
<Optim>1</Optim> <Optim>1</Optim>
<oTime>0</oTime> <oTime>0</oTime>
<SplitLS>0</SplitLS> <SplitLS>1</SplitLS>
<OneElfS>1</OneElfS> <OneElfS>1</OneElfS>
<Strict>0</Strict> <Strict>0</Strict>
<EnumInt>0</EnumInt> <EnumInt>0</EnumInt>
<PlainCh>0</PlainCh> <PlainCh>0</PlainCh>
<Ropi>0</Ropi> <Ropi>0</Ropi>
<Rwpi>0</Rwpi> <Rwpi>0</Rwpi>
<wLevel>4</wLevel> <wLevel>3</wLevel>
<uThumb>0</uThumb> <uThumb>0</uThumb>
<uSurpInc>0</uSurpInc> <uSurpInc>0</uSurpInc>
<uC99>0</uC99> <uC99>1</uC99>
<uGnu>1</uGnu> <uGnu>1</uGnu>
<useXO>0</useXO> <useXO>0</useXO>
<v6Lang>5</v6Lang> <v6Lang>5</v6Lang>
<v6LangP>3</v6LangP> <v6LangP>5</v6LangP>
<vShortEn>1</vShortEn> <vShortEn>1</vShortEn>
<vShortWch>1</vShortWch> <vShortWch>1</vShortWch>
<v6Lto>0</v6Lto> <v6Lto>1</v6Lto>
<v6WtE>0</v6WtE> <v6WtE>0</v6WtE>
<v6Rtti>0</v6Rtti> <v6Rtti>0</v6Rtti>
<VariousControls> <VariousControls>
<MiscControls></MiscControls> <MiscControls>-D DEBUG</MiscControls>
<Define></Define> <Define></Define>
<Undefine></Undefine> <Undefine></Undefine>
<IncludePath></IncludePath> <IncludePath></IncludePath>
@ -406,6 +406,75 @@
</Group> </Group>
<Group> <Group>
<GroupName>::FreeRTOS</GroupName> <GroupName>::FreeRTOS</GroupName>
<GroupOption>
<CommonProperty>
<UseCPPCompiler>0</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>0</IncludeInBuild>
<AlwaysBuild>2</AlwaysBuild>
<GenerateAssemblyFile>2</GenerateAssemblyFile>
<AssembleAssemblyFile>2</AssembleAssemblyFile>
<PublicsOnly>2</PublicsOnly>
<StopOnExitCode>11</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
</CommonProperty>
<GroupArmAds>
<Cads>
<interw>2</interw>
<Optim>0</Optim>
<oTime>2</oTime>
<SplitLS>2</SplitLS>
<OneElfS>2</OneElfS>
<Strict>2</Strict>
<EnumInt>2</EnumInt>
<PlainCh>2</PlainCh>
<Ropi>2</Ropi>
<Rwpi>2</Rwpi>
<wLevel>0</wLevel>
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Cads>
<Aads>
<interw>2</interw>
<Ropi>2</Ropi>
<Rwpi>2</Rwpi>
<thumb>2</thumb>
<SplitLS>2</SplitLS>
<SwStkChk>2</SwStkChk>
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Aads>
</GroupArmAds>
</GroupOption>
</Group> </Group>
<Group> <Group>
<GroupName>::RTOS</GroupName> <GroupName>::RTOS</GroupName>
@ -429,7 +498,7 @@
<targetInfo name="Target 1"/> <targetInfo name="Target 1"/>
</targetInfos> </targetInfos>
</component> </component>
<component Cbundle="FreeRTOS" Cclass="RTOS" Cgroup="Heap" Cvariant="Heap_4" Cvendor="ARM" Cversion="10.5.1" condition="FreeRTOS Heap"> <component Cbundle="FreeRTOS" Cclass="RTOS" Cgroup="Heap" Cvariant="Heap_2" Cvendor="ARM" Cversion="10.5.1" condition="FreeRTOS Heap">
<package name="CMSIS-FreeRTOS" schemaVersion="1.7.7" url="https://www.keil.com/pack/" vendor="ARM" version="10.5.1"/> <package name="CMSIS-FreeRTOS" schemaVersion="1.7.7" url="https://www.keil.com/pack/" vendor="ARM" version="10.5.1"/>
<targetInfos> <targetInfos>
<targetInfo name="Target 1"/> <targetInfo name="Target 1"/>
@ -444,25 +513,25 @@
<component Cclass="FreeRTOS" Cgroup="FreeRTOS+ TCP" Csub="Buffer Allocation" Cvariant="Buffer Allocation 1" Cvendor="AWS" Cversion="2.3.2-LTS-Patch-2" condition="freertos_plus_tcp_lts_buffer_allocation_1 Condition"> <component Cclass="FreeRTOS" Cgroup="FreeRTOS+ TCP" Csub="Buffer Allocation" Cvariant="Buffer Allocation 1" Cvendor="AWS" Cversion="2.3.2-LTS-Patch-2" condition="freertos_plus_tcp_lts_buffer_allocation_1 Condition">
<package name="FreeRTOS-Plus-TCP" schemaVersion="1.7.2" url="https://freertos-cmsis-packs.s3.us-west-2.amazonaws.com/" vendor="AWS" version="4.0.1"/> <package name="FreeRTOS-Plus-TCP" schemaVersion="1.7.2" url="https://freertos-cmsis-packs.s3.us-west-2.amazonaws.com/" vendor="AWS" version="4.0.1"/>
<targetInfos> <targetInfos>
<targetInfo name="Target 1"/> <targetInfo excluded="1" name="Target 1" versionMatchMode=""/>
</targetInfos> </targetInfos>
</component> </component>
<component Cclass="FreeRTOS" Cgroup="FreeRTOS+ TCP" Csub="Compiler Port" Cvariant="Keil" Cvendor="AWS" Cversion="2.3.2-LTS-Patch-2" condition="freertos_plus_tcp_lts_keil_compiler Condition"> <component Cclass="FreeRTOS" Cgroup="FreeRTOS+ TCP" Csub="Compiler Port" Cvariant="Keil" Cvendor="AWS" Cversion="2.3.2-LTS-Patch-2" condition="freertos_plus_tcp_lts_keil_compiler Condition">
<package name="FreeRTOS-Plus-TCP" schemaVersion="1.7.2" url="https://freertos-cmsis-packs.s3.us-west-2.amazonaws.com/" vendor="AWS" version="4.0.1"/> <package name="FreeRTOS-Plus-TCP" schemaVersion="1.7.2" url="https://freertos-cmsis-packs.s3.us-west-2.amazonaws.com/" vendor="AWS" version="4.0.1"/>
<targetInfos> <targetInfos>
<targetInfo name="Target 1"/> <targetInfo excluded="1" name="Target 1" versionMatchMode=""/>
</targetInfos> </targetInfos>
</component> </component>
<component Cclass="FreeRTOS" Cgroup="FreeRTOS+ TCP" Csub="Core Library" Cvendor="AWS" Cversion="2.3.2-LTS-Patch-2" condition="freertos_plus_tcp_lts_library Condition"> <component Cclass="FreeRTOS" Cgroup="FreeRTOS+ TCP" Csub="Core Library" Cvendor="AWS" Cversion="2.3.2-LTS-Patch-2" condition="freertos_plus_tcp_lts_library Condition">
<package name="FreeRTOS-Plus-TCP" schemaVersion="1.7.2" url="https://freertos-cmsis-packs.s3.us-west-2.amazonaws.com/" vendor="AWS" version="4.0.1"/> <package name="FreeRTOS-Plus-TCP" schemaVersion="1.7.2" url="https://freertos-cmsis-packs.s3.us-west-2.amazonaws.com/" vendor="AWS" version="4.0.1"/>
<targetInfos> <targetInfos>
<targetInfo name="Target 1"/> <targetInfo excluded="1" name="Target 1" versionMatchMode=""/>
</targetInfos> </targetInfos>
</component> </component>
<component Cclass="FreeRTOS" Cgroup="FreeRTOS+ TCP" Csub="Network Interface" Cvariant="STM32Fxx" Cvendor="AWS" Cversion="2.3.2-LTS-Patch-2" condition="freertos_plus_tcp_lts_stm32fxx_network_interface_port Condition"> <component Cclass="FreeRTOS" Cgroup="FreeRTOS+ TCP" Csub="Network Interface" Cvariant="STM32Fxx" Cvendor="AWS" Cversion="2.3.2-LTS-Patch-2" condition="freertos_plus_tcp_lts_stm32fxx_network_interface_port Condition">
<package name="FreeRTOS-Plus-TCP" schemaVersion="1.7.2" url="https://freertos-cmsis-packs.s3.us-west-2.amazonaws.com/" vendor="AWS" version="4.0.1"/> <package name="FreeRTOS-Plus-TCP" schemaVersion="1.7.2" url="https://freertos-cmsis-packs.s3.us-west-2.amazonaws.com/" vendor="AWS" version="4.0.1"/>
<targetInfos> <targetInfos>
<targetInfo name="Target 1"/> <targetInfo excluded="1" name="Target 1" versionMatchMode=""/>
</targetInfos> </targetInfos>
</component> </component>
<component Cclass="Device" Cgroup="EVAL" Csub="GD32F107C" Cvendor="GigaDevice" Cversion="2.0.2" condition="GD32F10x STDPERIPHERALS EVAL"> <component Cclass="Device" Cgroup="EVAL" Csub="GD32F107C" Cvendor="GigaDevice" Cversion="2.0.2" condition="GD32F10x STDPERIPHERALS EVAL">

191
main.c
View File

@ -1,24 +1,177 @@
#include "FreeRTOS.h" #include "FreeRTOS.h"
#include "FreeRTOSConfig.h" #include "task.h"
#include "gd32f107c_eval.h" #include "gd32f107c_eval.h"
#include "gd32f10x_gpio.h" #include "gd32f10x_gpio.h"
#include "stdio.h" #include "stdio.h"
#define BUTTON_USER GPIO_PIN_14 #define BUTTON_USER GPIO_PIN_14
#define LED_USER GPIO_PIN_0 #define LED2_USER GPIO_PIN_0
char ButtonState = 0; #define LED5_TICK GPIO_PIN_1
void vTaskHelloWorld( void *pvParameters);
void vTaskToggleLed( void *pvParameters);
int stdout_putchar (int ch); int stdout_putchar (int ch);
int stdin_getchar (void); int stdin_getchar (void);
void DelayMS(unsigned char ms); void DelayMS(unsigned char ms);
int stdout_putchar (int ch) int stdout_putchar (int ch)
{ {
usart_data_transmit(EVAL_COM1, (uint16_t)ch); usart_data_transmit(EVAL_COM1, (uint16_t)ch);
DelayMS(1); while (!usart_flag_get(EVAL_COM1, USART_FLAG_TBE)){}
return ch; return ch;
} }
int stdin_getchar (void) int stdin_getchar (void)
{ {
return usart_data_receive(EVAL_COM1); return usart_data_receive(EVAL_COM1);
} }
/*! \brief InitMCU
* Initial MCU configuration
*/
static void InitMCU(void)
{
SystemInit();
//gd_eval_led_init(LED2);
//gd_eval_led_on(LED2);
rcu_periph_clock_enable(RCU_GPIOC);
gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, LED2_USER);
gpio_bit_set(GPIOC, LED2_USER);
rcu_periph_clock_enable(RCU_GPIOE);
gpio_init(GPIOE, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, LED5_TICK);
gpio_bit_set(GPIOE, LED5_TICK);
gd_eval_com_init(EVAL_COM1);
rcu_periph_clock_enable(RCU_GPIOB);
gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ, BUTTON_USER);
}
/*! \brief vTaskHelloWorld procedure
*
* \param Not Used.
*/
void vTaskHelloWorld( void *pvParameters)
{
char ButtonState = 0;
for( ;; )
{
ButtonState = !gpio_input_bit_get(GPIOB, BUTTON_USER);
if (ButtonState)
{
printf("Hello world\n");
vTaskDelay(500);
}
}
}
/*! \brief vTaskToggleLed procedure
*
* \param Not Used.
*/
void vTaskToggleLed( void *pvParameters)
{
char toggle = 1;
for( ;; )
{
if (toggle)
{
gpio_bit_reset(GPIOC, LED2_USER);
}
else
{
gpio_bit_set(GPIOC, LED2_USER);
}
toggle = !toggle;
vTaskDelay(125);
}
}
int main(void)
{
InitMCU();
xTaskCreate(vTaskToggleLed, "ToggleLed", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL);
xTaskCreate(vTaskHelloWorld, "HelloWorld", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL);
vTaskStartScheduler();
while(1);
}
/**
* task.h
* @code{c}
* void vApplicationMallocFailedHook( void )
* @endcode
*
* This hook function is called when allocation failed.
*/
void vApplicationMallocFailedHook( void )
{
#if defined (DEBUG)
__ASM("BKPT #0\n");
#endif
NVIC_SystemReset();
while(TRUE){}
}
/*! \func vApplicationTickHook( void )
* \brief Toggles LED5_TICK to indicate RTOS running well
*/
void vApplicationTickHook( void )
{
static uint16_t tickCounter = 0;
if(++tickCounter == configTICK_RATE_HZ)
{
gpio_bit_reset(GPIOE, LED5_TICK);
tickCounter = 0;
}
else if(tickCounter == configTICK_RATE_HZ/2)
{
gpio_bit_set(GPIOE, LED5_TICK);
}
}
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )
{
#if defined (DEBUG)
__ASM("BKPT #0\n");
#endif
NVIC_SystemReset();
while(TRUE){}
}
__attribute__((used)) void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress )
{
/* These are volatile to try and prevent the compiler/linker optimising them
away as the variables never actually get used. If the debugger won't show the
values of the variables, make them global my moving their declaration outside
of this function. */
static volatile uint32_t r0;
static volatile uint32_t r1;
static volatile uint32_t r2;
static volatile uint32_t r3;
static volatile uint32_t r12;
static volatile uint32_t lr; /* Link register. */
static volatile uint32_t pc; /* Program counter. */
static volatile uint32_t psr;/* Program status register. */
r0 = pulFaultStackAddress[ 0 ];
r1 = pulFaultStackAddress[ 1 ];
r2 = pulFaultStackAddress[ 2 ];
r3 = pulFaultStackAddress[ 3 ];
r12 = pulFaultStackAddress[ 4 ];
lr = pulFaultStackAddress[ 5 ];
pc = pulFaultStackAddress[ 6 ];
psr = pulFaultStackAddress[ 7 ];
#ifdef DEBUG
__asm volatile("BKPT #0\n") ;
#endif
NVIC_SystemReset();
/* When the following line is hit, the variables contain the register values. */
for( ;; );
}
void DelayMS(unsigned char ms) void DelayMS(unsigned char ms)
{ {
unsigned long us = 1000*ms; unsigned long us = 1000*ms;
@ -28,33 +181,3 @@ while (us--)
__NOP(); __NOP();
} }
} }
{
while (1)
{
ButtonState = !gpio_input_bit_get(GPIOB, BUTTON_USER);
if (ButtonState)
{
printf("Hello world\n");
DelayMS(250);
DelayMS(250);
}
}
}
int main(void)
{
SystemInit();
//gd_eval_led_init(LED2);
//gd_eval_led_on(LED2);
rcu_periph_clock_enable(RCU_GPIOC);
gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, LED_USER);
gpio_bit_set(GPIOC, LED_USER);
gd_eval_com_init(EVAL_COM1);
rcu_periph_clock_enable(RCU_GPIOB);
gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ, BUTTON_USER);
xPortStartScheduler();
while(1);
}