📄 bsp.c
字号:
/*********************************************************************
* SEGGER MICROCONTROLLER GmbH & Co. KG *
* Solutions for real time microcontroller applications *
**********************************************************************
* *
* (C) 2008 SEGGER Microcontroller GmbH & CO. KG *
* *
* www.segger.com Support: support@segger.com *
* *
**********************************************************************
* *
* embOS * Real time operating system for microcontrollers *
* *
* *
* Please note: *
* *
* Knowledge of this file may under no circumstances *
* be used to write a similar product or a real-time *
* operating system for in-house use. *
* *
* Thank you for your fairness ! *
* *
**********************************************************************
* *
* embOS version: 3.60c *
* *
**********************************************************************
----------------------------------------------------------------------
File : BSP.c
Purpose : BSP for STM32F103 (ST MB672)
-------- END-OF-HEADER ---------------------------------------------
*/
#define BSP_C
#include "BSP.h"
#include "RTOS.h"
#include "GUI.h"
static OS_STACKPTR int _Stack[4096]; // Task stacks
static OS_TASK _TCB; // Task-control-blocks
/*********************************************************************
*
* Defines
*
**********************************************************************
*/
#define _GPIO_PORT3 (12)
#define _GPIO_PORT7 (28)
#define _GPIO_PORT13 (20)
#define _GPIO_PORT14 (24)
#define _GPIO_PORT15 (28)
#define _GPIO_PIN3 (3)
#define _GPIO_PIN7 (7)
#define _GPIO_PIN13 (13)
#define _GPIO_PIN14 (14)
#define _GPIO_PIN15 (15)
#define _GPIO_PORT_JOYSTICK_SELECT _GPIO_PORT7
#define _GPIO_PORT_JOYSTICK_DOWN _GPIO_PORT3
#define _GPIO_PORT_JOYSTICK_LEFT _GPIO_PORT14
#define _GPIO_PORT_JOYSTICK_RIGHT _GPIO_PORT13
#define _GPIO_PORT_JOYSTICK_UP _GPIO_PORT15
#define JOYSTICK_STATE_NONE (0)
#define JOYSTICK_STATE_SELECT (1)
#define JOYSTICK_STATE_DOWN (2)
#define JOYSTICK_STATE_LEFT (3)
#define JOYSTICK_STATE_RIGHT (4)
#define JOYSTICK_STATE_UP (5)
#if 0
#define _GPIO_IDR_BIT_JOYSTICK_DOWN (3)
#define _GPIO_IDR_BIT_JOYSTICK_SELECT (7)
#define _GPIO_IDR_BIT_JOYSTICK_LEFT (14)
#define _GPIO_IDR_BIT_JOYSTICK_RIGHT (13)
#define _GPIO_IDR_BIT_JOYSTICK_UP (15)
#endif
#define _GPIO_IDR_BIT_JOYSTICK_SELECT _GPIO_PIN7
#define _GPIO_IDR_BIT_JOYSTICK_DOWN _GPIO_PIN3
#define _GPIO_IDR_BIT_JOYSTICK_LEFT _GPIO_PIN14
#define _GPIO_IDR_BIT_JOYSTICK_RIGHT _GPIO_PIN13
#define _GPIO_IDR_BIT_JOYSTICK_UP _GPIO_PIN15
#define _GPIO_PORT_JOYSTICK_CONF (0x04)
#define _GPIO_BASE_ADDR (0x40010800)
#define _GPIODL_OFFS (0x0C00)
#define _GPIOGL_OFFS (0x1800)
#define _GPIOGH_OFFS (0x1804)
#define _GPIO_IDR_OFFS (0x08)
#define _GPIODL (*(volatile unsigned long*) (_GPIO_BASE_ADDR + _GPIODL_OFFS))
#define _GPIOGL (*(volatile unsigned long*) (_GPIO_BASE_ADDR + _GPIOGL_OFFS))
#define _GPIOGH (*(volatile unsigned long*) (_GPIO_BASE_ADDR + _GPIOGH_OFFS))
#define _GPIOD_IDR (*(volatile unsigned long*) (_GPIO_BASE_ADDR + _GPIODL_OFFS + _GPIO_IDR_OFFS))
#define _GPIOG_IDR (*(volatile unsigned long*) (_GPIO_BASE_ADDR + _GPIOGL_OFFS + _GPIO_IDR_OFFS))
/****** SFRs used for LED-Port **************************************/
/****** Assign LEDs to Ports ****************************************/
#define _LED0_BIT (6)
#define _LED1_BIT (7)
#define _LED2_BIT (8)
#define _LED3_BIT (9)
#define _LED_MASK_ALL ((1uL << _LED0_BIT) | (1uL << _LED1_BIT) | (1uL << _LED2_BIT) | (1uL << _LED3_BIT) )
#define _GPIO_PF0_BASE_ADDR (0x40011C00)
#define _LED_PORT_BASE_ADDR (_GPIO_PF0_BASE_ADDR)
#define GPIOF_CRL *(volatile unsigned int*)(_LED_PORT_BASE_ADDR)
#define GPIOF_CRH *(volatile unsigned int*)(_LED_PORT_BASE_ADDR + 0x04)
#define GPIOF_ODR *(volatile unsigned int*)(_LED_PORT_BASE_ADDR + 0x0C)
#define GPIOF_BSRR *(volatile unsigned int*)(_LED_PORT_BASE_ADDR + 0x10)
#define GPIOF_BRR *(volatile unsigned int*)(_LED_PORT_BASE_ADDR + 0x14)
#define _SYSCTRL_RCC_APB2 *(volatile unsigned int*)(0x40021018)
#define _SYSCTRL_LEDPORT_BIT (7)
/*********************************************************************
*
* Static functions
*
**********************************************************************
*/
/*********************************************************************
*
* _HW_InitJoystick
*
* Purpose: Configures the GPIO interface to enable the joystick
*/
static void _HW_InitJoystick(void) {
U32 TempReg;
TempReg = _GPIODL;
TempReg &= ~0xB000;
TempReg |= (_GPIO_PORT_JOYSTICK_CONF << _GPIO_PORT_JOYSTICK_DOWN);
_GPIODL = TempReg;
TempReg = _GPIOGL;
TempReg &= ~0xB0000000;
TempReg |= (_GPIO_PORT_JOYSTICK_CONF << _GPIO_PORT_JOYSTICK_SELECT);
_GPIOGL = TempReg;
TempReg = _GPIOGH;
TempReg &= ~0xBBB00000;
TempReg |= ((_GPIO_PORT_JOYSTICK_CONF << _GPIO_PORT_JOYSTICK_LEFT)
| (_GPIO_PORT_JOYSTICK_CONF << _GPIO_PORT_JOYSTICK_RIGHT)
| (_GPIO_PORT_JOYSTICK_CONF << _GPIO_PORT_JOYSTICK_UP))
;
_GPIOGH = TempReg;
}
/*********************************************************************
*
* _GetJoystickStatus
*/
static U8 _GetJoystickStatus(void) {
U32 GPIOD_IDR;
U32 GPIOG_IDR;
GPIOD_IDR = _GPIOD_IDR;
if ((GPIOD_IDR & (1 << _GPIO_IDR_BIT_JOYSTICK_DOWN)) == 0) {
return JOYSTICK_STATE_DOWN; // Joystick down
}
GPIOG_IDR = _GPIOG_IDR;
if ((GPIOG_IDR & (1 << _GPIO_IDR_BIT_JOYSTICK_SELECT)) == 0) {
return JOYSTICK_STATE_SELECT; // Joystick select
}
if ((GPIOG_IDR & (1 << _GPIO_IDR_BIT_JOYSTICK_LEFT)) == 0) {
return JOYSTICK_STATE_LEFT; // Joystick left
}
if ((GPIOG_IDR & (1 << _GPIO_IDR_BIT_JOYSTICK_RIGHT)) == 0) {
return JOYSTICK_STATE_RIGHT; // Joystick right
}
if ((GPIOG_IDR & (1 << _GPIO_IDR_BIT_JOYSTICK_UP)) == 0) {
return JOYSTICK_STATE_UP; // Joystick up
}
return JOYSTICK_STATE_NONE; // No joystick input
}
/*********************************************************************
*
* _JoystickTask
*/
static void _JoystickTask(void) {
U8 Status;
while (1) {
GUI_PID_STATE State = {0};
Status = _GetJoystickStatus();
switch (Status) {
case JOYSTICK_STATE_UP:
State.y--;
break;
case JOYSTICK_STATE_DOWN:
State.y++;
break;
case JOYSTICK_STATE_LEFT:
State.x--;
break;
case JOYSTICK_STATE_RIGHT:
State.x++;
break;
case JOYSTICK_STATE_SELECT:
State.Pressed++;
break;
}
GUI_JOYSTICK_StoreState(&State);
OS_Delay(40);
}
}
/*********************************************************************
*
* Global functions
*
**********************************************************************
*/
/*********************************************************************
*
* BSP_Init()
*/
void BSP_Init(void) {
_SYSCTRL_RCC_APB2 |= (1 << _SYSCTRL_LEDPORT_BIT);
GPIOF_CRL = 0x33444444;
GPIOF_CRH = 0x44444433;
GPIOF_BRR |= _LED_MASK_ALL; // disable leds
}
/*********************************************************************
*
* BSP_GUI_Init()
*/
void BSP_GUI_Init(void) {
GUI_Init();
_HW_InitJoystick();
OS_CREATETASK(&_TCB, "ReadJoystickState", _JoystickTask, 101, _Stack);
}
/*********************************************************************
*
* LED switching routines
* LEDs are switched on with low level on port lines
*/
void BSP_SetLED(int Index) {
GPIOF_BSRR |= (1 << (_LED0_BIT + Index)); /* Switch on LED 0 */
}
void BSP_ClrLED(int Index) {
GPIOF_BRR |= (1 << (_LED0_BIT + Index)); /* Switch off LED 0 */
}
void BSP_ToggleLED(int Index) {
if ((GPIOF_ODR & (1 << (_LED0_BIT + Index))) == 0) { /* LED is switched off */
BSP_SetLED(Index);
} else {
BSP_ClrLED(Index);
}
}
/****** EOF *********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -