-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbsp.c
151 lines (133 loc) · 5.82 KB
/
bsp.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*****************************************************************************
* BSP for EK-TM4C123GXL with uC/OS-II RTOS
*****************************************************************************/
#include "uc_ao.h" /* uC/AO API */
#include "bsp.h"
#include <stdbool.h> /* needed by the TI drivers */
#include "TM4C123GH6PM.h" /* the device specific header (TI) */
#include "rom.h" /* the built-in ROM functions (TI) */
#include "sysctl.h" /* system control driver (TI) */
#include "gpio.h" /* GPIO driver (TI) */
/* add other drivers if necessary... */
/* Local-scope objects -----------------------------------------------------*/
/* LEDs on the board */
#define LED_RED (1U << 1)
#define LED_GREEN (1U << 3)
#define LED_BLUE (1U << 2)
/* Buttons on the board */
#define BTN_SW1 (1U << 4)
#define BTN_SW2 (1U << 0)
/* uCOS-II application hooks ===============================================*/
void App_TimeTickHook(void) {
/* state of the button debouncing, see below */
static struct ButtonsDebouncing {
uint32_t depressed;
uint32_t previous;
} buttons = { 0U, 0U };
uint32_t current;
uint32_t tmp;
TimeEvent_tick(); /* process all uC/AO time events */
/* Perform the debouncing of buttons. The algorithm for debouncing
* adapted from the book "Embedded Systems Dictionary" by Jack Ganssle
* and Michael Barr, page 71.
*/
current = ~GPIOF_AHB->DATA_Bits[BTN_SW1]; /* read SW1 */
tmp = buttons.depressed; /* save the debounced depressed buttons */
buttons.depressed |= (buttons.previous & current); /* set depressed */
buttons.depressed &= (buttons.previous | current); /* clear released */
buttons.previous = current; /* update the history */
tmp ^= buttons.depressed; /* changed debounced depressed */
if ((tmp & BTN_SW1) != 0U) { /* debounced SW1 state changed? */
if ((buttons.depressed & BTN_SW1) != 0U) { /* is SW1 depressed? */
/* post the "button-pressed" event from ISR */
static Event const buttonPressedEvt = {BUTTON_PRESSED_SIG};
Active_post(AO_TimeBomb, &buttonPressedEvt);
}
else { /* the button is released */
/* post the "button-released" event from ISR */
static Event const buttonReleasedEvt = {BUTTON_RELEASED_SIG};
Active_post(AO_TimeBomb, &buttonReleasedEvt);
}
}
}
/*..........................................................................*/
void App_TaskIdleHook(void) {
#ifdef NDEBUG
/* Put the CPU and peripherals to the low-power mode.
* you might need to customize the clock management for your application,
* see the datasheet for your particular Cortex-M3 MCU.
*/
__WFI(); /* Wait-For-Interrupt */
#endif
}
/*..........................................................................*/
void App_TaskCreateHook (OS_TCB *ptcb) { (void)ptcb; }
void App_TaskDelHook (OS_TCB *ptcb) { (void)ptcb; }
void App_TaskReturnHook (OS_TCB *ptcb) { (void)ptcb; }
void App_TaskStatHook (void) {}
void App_TaskSwHook (void) {}
void App_TCBInitHook (OS_TCB *ptcb) { (void)ptcb; }
/* BSP functions ===========================================================*/
void BSP_init(void) {
/* NOTE: SystemInit() has been already called from the startup code
* but SystemCoreClock needs to be updated
*/
SystemCoreClockUpdate();
SYSCTL->RCGCGPIO |= (1U << 5); /* enable Run mode for GPIOF */
SYSCTL->GPIOHBCTL |= (1U << 5); /* enable AHB for GPIOF */
GPIOF_AHB->DIR |= (LED_RED | LED_BLUE | LED_GREEN);
GPIOF_AHB->DEN |= (LED_RED | LED_BLUE | LED_GREEN);
/* configure switch SW1 */
GPIOF_AHB->DIR &= ~BTN_SW1; /* input */
GPIOF_AHB->DEN |= BTN_SW1; /* digital enable */
GPIOF_AHB->PUR |= BTN_SW1; /* pull-up resistor enable */
}
/*..........................................................................*/
void BSP_start(void) {
/* set up the SysTick timer to fire at BSP_TICKS_PER_SEC rate
* NOTE: do NOT call OS_CPU_SysTickInit() from uC/OS-II
*/
SysTick_Config(SystemCoreClock / OS_TICKS_PER_SEC);
/* set priorities of ALL ISRs used in the system, see NOTE1 */
NVIC_SetPriority(SysTick_IRQn, CPU_CFG_KA_IPL_BOUNDARY + 1U);
/* ... */
/* enable IRQs in the NVIC... */
/* ... */
}
/*..........................................................................*/
void BSP_ledRedOn(void) {
GPIOF_AHB->DATA_Bits[LED_RED] = LED_RED;
}
/*..........................................................................*/
void BSP_ledRedOff(void) {
GPIOF_AHB->DATA_Bits[LED_RED] = 0U;
}
/*..........................................................................*/
void BSP_ledBlueOn(void) {
GPIOF_AHB->DATA_Bits[LED_BLUE] = LED_BLUE;
}
/*..........................................................................*/
void BSP_ledBlueOff(void) {
GPIOF_AHB->DATA_Bits[LED_BLUE] = 0U;
}
/*..........................................................................*/
void BSP_ledGreenOn(void) {
GPIOF_AHB->DATA_Bits[LED_GREEN] = LED_GREEN;
}
/*..........................................................................*/
void BSP_ledGreenOff(void) {
GPIOF_AHB->DATA_Bits[LED_GREEN] = 0U;
}
/*..........................................................................*/
/* error-handling function called by exception handlers in the startup code */
void Q_onAssert(char const *module, int loc) {
/* TBD: damage control */
(void)module; /* avoid the "unused parameter" compiler warning */
(void)loc; /* avoid the "unused parameter" compiler warning */
GPIOF_AHB->DATA_Bits[LED_RED | LED_GREEN | LED_BLUE] = 0xFFU; /* all ON */
#ifndef NDEBUG /* debug build? */
while (loc != 0) { /* tie the CPU in this endless loop */
}
#endif
NVIC_SystemReset(); /* reset the CPU */
}