Update repo
This commit is contained in:
1 parent
dfe8ec02bd
commit
d343e06de2
4 files changed
+180
-12
No files matched your search
@@ -28,7 +28,7 @@ supported, or if both static and dynamic allocation are supported.
|
|||||||
/* Constants that describe the hardware and memory usage. */
|
/* Constants that describe the hardware and memory usage. */
|
||||||
#define configCPU_CLOCK_HZ ( ( unsigned long ) 200000000 )
|
#define configCPU_CLOCK_HZ ( ( unsigned long ) 200000000 )
|
||||||
#define configMINIMAL_STACK_SIZE ( ( uint16_t ) 128 )
|
#define configMINIMAL_STACK_SIZE ( ( uint16_t ) 128 )
|
||||||
#define configMAX_TASK_NAME_LEN ( 12 )
|
#define configMAX_TASK_NAME_LEN ( 16 )
|
||||||
|
|
||||||
|
|
||||||
/* Note heap_5.c is used so this only defines the part of the heap that is in
|
/* Note heap_5.c is used so this only defines the part of the heap that is in
|
||||||
@@ -54,8 +54,8 @@ in main.c.
|
|||||||
// 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 0
|
||||||
#define configUSE_MALLOC_FAILED_HOOK 0
|
#define configUSE_MALLOC_FAILED_HOOK 1
|
||||||
#define configCHECK_FOR_STACK_OVERFLOW 0
|
#define configCHECK_FOR_STACK_OVERFLOW 2
|
||||||
#define configQUEUE_REGISTRY_SIZE 8
|
#define configQUEUE_REGISTRY_SIZE 8
|
||||||
|
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ referenced anyway.
|
|||||||
#define INCLUDE_vTaskSuspend 1
|
#define INCLUDE_vTaskSuspend 1
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
#define INCLUDE_vTaskDelayUntil 1
|
||||||
#define INCLUDE_vTaskDelay 1
|
#define INCLUDE_vTaskDelay 1
|
||||||
#define INCLUDE_uxTaskGetStackHighWaterMark 0
|
#define INCLUDE_uxTaskGetStackHighWaterMark 1
|
||||||
#define INCLUDE_xTaskGetIdleTaskHandle 1
|
#define INCLUDE_xTaskGetIdleTaskHandle 1
|
||||||
#define INCLUDE_xTaskGetHandle 1
|
#define INCLUDE_xTaskGetHandle 1
|
||||||
#define INCLUDE_eTaskGetState 1
|
#define INCLUDE_eTaskGetState 1
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#ifndef SINE_TABLE_H
|
||||||
|
#define SINE_TABLE_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define SINE_TABLE_LENGTH 100U
|
||||||
|
|
||||||
|
extern const uint16_t sineTable[SINE_TABLE_LENGTH];
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <file.h>
|
#include <file.h>
|
||||||
|
#include <limits.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
// Driverlib headers
|
// Driverlib headers
|
||||||
@@ -13,6 +14,7 @@
|
|||||||
// Customized headers
|
// Customized headers
|
||||||
#include "uart_drv.h"
|
#include "uart_drv.h"
|
||||||
#include "at24cm02.h"
|
#include "at24cm02.h"
|
||||||
|
#include "sine_table.h"
|
||||||
|
|
||||||
// FreeRTOS headers
|
// FreeRTOS headers
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
@@ -46,6 +48,18 @@ uint8_t ucHeap[configTOTAL_HEAP_SIZE];
|
|||||||
#define SCI_RXDA_PIN 85U
|
#define SCI_RXDA_PIN 85U
|
||||||
#define SCI_TXDA_PIN 84U
|
#define SCI_TXDA_PIN 84U
|
||||||
|
|
||||||
|
#define EPWM6A_GPIO 10U
|
||||||
|
#define EPWM6A_FREQUENCY_HZ 50000UL // 50KHz
|
||||||
|
#define EPWM6A_DUTY_PERCENT 75U // 75%
|
||||||
|
#define EPWM_CLOCK_HZ (DEVICE_SYSCLK_FREQ / 2UL)
|
||||||
|
#define EPWM6A_PERIOD_COUNTS (EPWM_CLOCK_HZ / EPWM6A_FREQUENCY_HZ)
|
||||||
|
#define EPWM6A_PERIOD_TICKS (EPWM6A_PERIOD_COUNTS - 1UL)
|
||||||
|
#define EPWM6A_COMPARE_TICKS ((EPWM6A_PERIOD_COUNTS * EPWM6A_DUTY_PERCENT) / 100UL)
|
||||||
|
|
||||||
|
#define DAC_SINE_FREQUENCY_HZ 1000UL
|
||||||
|
#define DAC_SAMPLE_FREQUENCY_HZ (DAC_SINE_FREQUENCY_HZ * SINE_TABLE_LENGTH)
|
||||||
|
#define DAC_SAMPLE_PERIOD_TICKS ((EPWM_CLOCK_HZ / DAC_SAMPLE_FREQUENCY_HZ) - 1UL)
|
||||||
|
|
||||||
// UART: SCIA
|
// UART: SCIA
|
||||||
void UartSetup(void);
|
void UartSetup(void);
|
||||||
void UartPutChar(uint16_t charToWrite);
|
void UartPutChar(uint16_t charToWrite);
|
||||||
@@ -54,12 +68,23 @@ void UartPutChar(uint16_t charToWrite);
|
|||||||
void configCPUTimer(uint32_t cpuTimer, uint32_t period_us);
|
void configCPUTimer(uint32_t cpuTimer, uint32_t period_us);
|
||||||
__interrupt void timer1_ISR(void);
|
__interrupt void timer1_ISR(void);
|
||||||
|
|
||||||
|
// ePWM6A: GPIO10, 50KHz, 75% duty cycle
|
||||||
|
void initEPWM6A(void);
|
||||||
|
|
||||||
|
// DACOUTB sine output and ePWM7 supplies the sample interrupt
|
||||||
|
void initDACBSine(void);
|
||||||
|
__interrupt void dacUpdateISR(void);
|
||||||
|
static volatile uint16_t sineTableIndex = 0U;
|
||||||
|
|
||||||
// EEPROM: AT24CM02 (2Mbit)
|
// EEPROM: AT24CM02 (2Mbit)
|
||||||
static EEPROM_Status eepromInitStatus = EEPROM_STATUS_NOT_INITIALIZED;
|
static EEPROM_Status eepromInitStatus = EEPROM_STATUS_NOT_INITIALIZED;
|
||||||
static uint16_t eepromReadData[AT24CM02_PAGE_SIZE_BYTES];
|
static uint16_t eepromReadData[AT24CM02_PAGE_SIZE_BYTES];
|
||||||
static uint16_t eepromWriteData[AT24CM02_PAGE_SIZE_BYTES];
|
static uint16_t eepromWriteData[AT24CM02_PAGE_SIZE_BYTES];
|
||||||
|
|
||||||
// FreeRTOS tasks
|
// FreeRTOS
|
||||||
|
const char * volatile g_overflow_task_name = NULL;
|
||||||
|
TaskHandle_t volatile g_overflow_task_handle = NULL;
|
||||||
|
|
||||||
void RedLED_Task(void *pvParameters);
|
void RedLED_Task(void *pvParameters);
|
||||||
void BlueLED_Task(void *pvParameters);
|
void BlueLED_Task(void *pvParameters);
|
||||||
void EEPROM_Task(void *pvParameters);
|
void EEPROM_Task(void *pvParameters);
|
||||||
@@ -86,9 +111,6 @@ void main(void) {
|
|||||||
GPIO_setDirectionMode(LED_B, GPIO_DIR_MODE_OUT);
|
GPIO_setDirectionMode(LED_B, GPIO_DIR_MODE_OUT);
|
||||||
GPIO_writePin(LED_B, 0);
|
GPIO_writePin(LED_B, 0);
|
||||||
|
|
||||||
// GPIO91/GPIO92 and I2CA are configured by the EEPROM driver.
|
|
||||||
eepromInitStatus = EEPROM_init();
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
// Clear all interrupts and initialize PIE vector table
|
// Clear all interrupts and initialize PIE vector table
|
||||||
@@ -124,8 +146,9 @@ void main(void) {
|
|||||||
ERTM;
|
ERTM;
|
||||||
// Enable Global real-time interrupt DBGM
|
// Enable Global real-time interrupt DBGM
|
||||||
|
|
||||||
// ------------------------ Redirect STDOUT to SCI ------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// SCIA: GPIO84/GPIO85
|
||||||
// Add the UART device. When fopen is called with a filename that
|
// Add the UART device. When fopen is called with a filename that
|
||||||
// begins "uart:", the UART device will be used to handle the file
|
// begins "uart:", the UART device will be used to handle the file
|
||||||
add_device("uart", _SSA, UART_open, UART_close, UART_read, UART_write,
|
add_device("uart", _SSA, UART_open, UART_close, UART_read, UART_write,
|
||||||
@@ -134,11 +157,21 @@ void main(void) {
|
|||||||
// Assign stdout to be a UART device
|
// Assign stdout to be a UART device
|
||||||
assert(freopen("uart:", "w", stdout) != NULL);
|
assert(freopen("uart:", "w", stdout) != NULL);
|
||||||
|
|
||||||
|
// GPIO91/GPIO92 and I2CA are configured by the EEPROM driver
|
||||||
|
eepromInitStatus = EEPROM_init();
|
||||||
|
|
||||||
|
// GPIO10 outputs ePWM6A at 50KHz with a 75% duty cycle
|
||||||
|
initEPWM6A();
|
||||||
|
|
||||||
|
// Generate a 1 kHz sine wave on DACOUTB
|
||||||
|
initDACBSine();
|
||||||
|
|
||||||
// ------------------------------- FreeRTOS -------------------------------
|
// ------------------------------- FreeRTOS -------------------------------
|
||||||
|
|
||||||
xSemaphore = xSemaphoreCreateBinary();
|
xSemaphore = xSemaphoreCreateBinary();
|
||||||
|
|
||||||
// Create tasks dynamically
|
// 1 stack element = 1 * uint16_t = 16 bits = 2 conventional bytes
|
||||||
|
// 256 stack elements * 2 bytes = 512 conventional bytes
|
||||||
xTaskCreate(RedLED_Task,
|
xTaskCreate(RedLED_Task,
|
||||||
(const char*) "RedLED_Task",
|
(const char*) "RedLED_Task",
|
||||||
256,
|
256,
|
||||||
@@ -168,12 +201,16 @@ void main(void) {
|
|||||||
void RedLED_Task(void *pvParameters) {
|
void RedLED_Task(void *pvParameters) {
|
||||||
(void)pvParameters;
|
(void)pvParameters;
|
||||||
int uart_count = 0;
|
int uart_count = 0;
|
||||||
|
UBaseType_t uxRemainingWords;
|
||||||
while (1) {
|
while (1) {
|
||||||
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) {
|
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) {
|
||||||
GPIO_togglePin(LED_R);
|
GPIO_togglePin(LED_R);
|
||||||
uart_count++;
|
uart_count++;
|
||||||
printf("Hello from FreeRTOS running on the F28377S Coreboard, %d!\r\n",
|
printf("FreeRTOS running on the F28377S Coreboard V1.3, %d!\r\n", uart_count);
|
||||||
uart_count);
|
uxRemainingWords = uxTaskGetStackHighWaterMark(NULL);
|
||||||
|
printf("RedLED_Task unused stack: %d stack elements (%d bytes)\r\n",
|
||||||
|
(int)uxRemainingWords,
|
||||||
|
(int)(uxRemainingWords * sizeof(StackType_t) * (CHAR_BIT / 8U)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -240,6 +277,110 @@ void EEPROM_Task(void *pvParameters) {
|
|||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) {
|
||||||
|
g_overflow_task_handle = xTask;
|
||||||
|
g_overflow_task_name = pcTaskName; // points to the task name string
|
||||||
|
taskDISABLE_INTERRUPTS();
|
||||||
|
for (;;) {
|
||||||
|
__asm(" NOP"); // set breakpoint here and inspect g_overflow_task_name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void vApplicationMallocFailedHook(void) {
|
||||||
|
taskDISABLE_INTERRUPTS();
|
||||||
|
for(;;){}
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void initEPWM6A(void) {
|
||||||
|
// Route ePWM6A to GPIO10
|
||||||
|
GPIO_setMasterCore(EPWM6A_GPIO, GPIO_CORE_CPU1);
|
||||||
|
GPIO_setPadConfig(EPWM6A_GPIO, GPIO_PIN_TYPE_STD);
|
||||||
|
GPIO_setPinConfig(GPIO_10_EPWM6A);
|
||||||
|
|
||||||
|
// The F28377S runs at 200 MHz. Divide EPWMCLK by two so TBCLK is
|
||||||
|
// 100 MHz, then freeze all ePWM time-base clocks during configuration
|
||||||
|
SysCtl_setEPWMClockDivider(SYSCTL_EPWMCLK_DIV_2);
|
||||||
|
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
|
||||||
|
|
||||||
|
EPWM_setClockPrescaler(EPWM6_BASE,
|
||||||
|
EPWM_CLOCK_DIVIDER_1,
|
||||||
|
EPWM_HSCLOCK_DIVIDER_1);
|
||||||
|
EPWM_setTimeBaseCounterMode(EPWM6_BASE, EPWM_COUNTER_MODE_UP);
|
||||||
|
EPWM_setTimeBasePeriod(EPWM6_BASE, (uint16_t)EPWM6A_PERIOD_TICKS);
|
||||||
|
EPWM_setTimeBaseCounter(EPWM6_BASE, 0U);
|
||||||
|
EPWM_disablePhaseShiftLoad(EPWM6_BASE);
|
||||||
|
EPWM_setPhaseShift(EPWM6_BASE, 0U);
|
||||||
|
|
||||||
|
EPWM_setCounterCompareValue(EPWM6_BASE,
|
||||||
|
EPWM_COUNTER_COMPARE_A,
|
||||||
|
(uint16_t)EPWM6A_COMPARE_TICKS);
|
||||||
|
EPWM_setCounterCompareShadowLoadMode(EPWM6_BASE,
|
||||||
|
EPWM_COUNTER_COMPARE_A,
|
||||||
|
EPWM_COMP_LOAD_ON_CNTR_ZERO);
|
||||||
|
|
||||||
|
// Drive ePWM6A high at the start of each period and low at CMPA
|
||||||
|
EPWM_setActionQualifierAction(EPWM6_BASE,
|
||||||
|
EPWM_AQ_OUTPUT_A,
|
||||||
|
EPWM_AQ_OUTPUT_HIGH,
|
||||||
|
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
|
||||||
|
EPWM_setActionQualifierAction(EPWM6_BASE,
|
||||||
|
EPWM_AQ_OUTPUT_A,
|
||||||
|
EPWM_AQ_OUTPUT_LOW,
|
||||||
|
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
|
||||||
|
|
||||||
|
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void initDACBSine(void) {
|
||||||
|
// Configure DACOUTB for 12-bit output referenced to ADC VREFHI.
|
||||||
|
DAC_setReferenceVoltage(DACB_BASE, DAC_REF_ADC_VREFHI);
|
||||||
|
DAC_setLoadMode(DACB_BASE, DAC_LOAD_SYSCLK);
|
||||||
|
DAC_setShadowValue(DACB_BASE, sineTable[0U]);
|
||||||
|
DAC_enableOutput(DACB_BASE);
|
||||||
|
DEVICE_DELAY_US(10U);
|
||||||
|
|
||||||
|
// Use ePWM7 only as a 100 kHz sample clock. With a 100 MHz TBCLK,
|
||||||
|
// up-count mode and TBPRD = 999 produce one interrupt every 10 us.
|
||||||
|
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
|
||||||
|
SysCtl_setEPWMClockDivider(SYSCTL_EPWMCLK_DIV_2);
|
||||||
|
EPWM_setClockPrescaler(EPWM7_BASE,
|
||||||
|
EPWM_CLOCK_DIVIDER_1,
|
||||||
|
EPWM_HSCLOCK_DIVIDER_1);
|
||||||
|
EPWM_setTimeBaseCounterMode(EPWM7_BASE, EPWM_COUNTER_MODE_UP);
|
||||||
|
EPWM_setTimeBasePeriod(EPWM7_BASE,
|
||||||
|
(uint16_t)DAC_SAMPLE_PERIOD_TICKS);
|
||||||
|
EPWM_setTimeBaseCounter(EPWM7_BASE, 0U);
|
||||||
|
EPWM_disablePhaseShiftLoad(EPWM7_BASE);
|
||||||
|
EPWM_setPhaseShift(EPWM7_BASE, 0U);
|
||||||
|
|
||||||
|
EPWM_setInterruptSource(EPWM7_BASE, EPWM_INT_TBCTR_ZERO);
|
||||||
|
EPWM_setInterruptEventCount(EPWM7_BASE, 1U);
|
||||||
|
EPWM_clearEventTriggerInterruptFlag(EPWM7_BASE);
|
||||||
|
|
||||||
|
Interrupt_register(INT_EPWM7, &dacUpdateISR);
|
||||||
|
Interrupt_enable(INT_EPWM7);
|
||||||
|
EPWM_enableInterrupt(EPWM7_BASE);
|
||||||
|
|
||||||
|
sineTableIndex = 1U;
|
||||||
|
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
__interrupt void dacUpdateISR(void) {
|
||||||
|
DAC_setShadowValue(DACB_BASE, sineTable[sineTableIndex]);
|
||||||
|
|
||||||
|
sineTableIndex++;
|
||||||
|
if (sineTableIndex >= SINE_TABLE_LENGTH) {
|
||||||
|
sineTableIndex = 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
EPWM_clearEventTriggerInterruptFlag(EPWM7_BASE);
|
||||||
|
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// This function initializes the selected timer to the period specified
|
// This function initializes the selected timer to the period specified
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#include "sine_table.h"
|
||||||
|
|
||||||
|
// One complete sine-wave cycle for the F28377S 12-bit buffered DAC.
|
||||||
|
// The waveform is centered at mid-scale (2048) and spans 0 through 4095.
|
||||||
|
const uint16_t sineTable[SINE_TABLE_LENGTH] =
|
||||||
|
{
|
||||||
|
2048U, 2176U, 2304U, 2431U, 2557U, 2680U, 2801U, 2919U, 3034U, 3145U,
|
||||||
|
3251U, 3353U, 3449U, 3540U, 3625U, 3704U, 3776U, 3842U, 3900U, 3951U,
|
||||||
|
3995U, 4031U, 4059U, 4079U, 4091U, 4095U, 4091U, 4079U, 4059U, 4031U,
|
||||||
|
3995U, 3951U, 3900U, 3842U, 3776U, 3704U, 3625U, 3540U, 3449U, 3353U,
|
||||||
|
3251U, 3145U, 3034U, 2919U, 2801U, 2680U, 2557U, 2431U, 2304U, 2176U,
|
||||||
|
2048U, 1919U, 1791U, 1664U, 1538U, 1415U, 1294U, 1176U, 1061U, 950U,
|
||||||
|
844U, 742U, 646U, 555U, 470U, 391U, 319U, 253U, 195U, 144U,
|
||||||
|
100U, 64U, 36U, 16U, 4U, 0U, 4U, 16U, 36U, 64U,
|
||||||
|
100U, 144U, 195U, 253U, 319U, 391U, 470U, 555U, 646U, 742U,
|
||||||
|
844U, 950U, 1061U, 1176U, 1294U, 1415U, 1538U, 1664U, 1791U, 1919U
|
||||||
|
};
|
||||||
Reference in new issue
Block a user