MPLAB® Harmony v3 Peripheral Libraries on SAM L10: Step 5
Add Application Code to the Project
The application is already partially developed and is available in the main_l10.c file under <your unzip folder>/saml10_getting_started/dev_files/sam_l10_xpro. The main_l10.c file contains the application logic. It also contains placeholders that you will populate with the necessary code in the next step.
- Go to the saml10_getting_started/dev_files/sam_l10_xpro folder and copy the pre-developed main_l10.c file.
- Replace the main_l10.c file of your project available at <Your project folder>/saml10_getting_started/firmware/src by over-writing it with the copied file.
- Open main_l10.c in MPLAB® X IDE and add the application code by following the next steps.
Under the main_l10.c file, in function main, notice the call to function SYS_Initialize. The generated function SYS_Initialize initializes all the peripheral modules used in the application, which is configured through MPLAB Harmony Configurator (MHC).
In the main_l10.c function, below SYS_Initialize(), add the following code to register callback event handlers.
Following the addition of the code above, add the function call.
RTC_Timer32Start();
Implement the registered callback event handlers for RTC, I²C, Universal Synchronous Asynchronous Receiver Transmitter (USART), and EIC PLIBs by adding the following code before the main() function in main_l10.c.
{
changeTempSamplingRate = true;
}
static void rtcEventHandler (RTC_TIMER32_INT_MASK intCause, uintptr_t context)
{
if (intCause & RTC_TIMER32_INT_MASK_CMP0)
{
isRTCTimerExpired = true;
}
}
static void i2cEventHandler(uintptr_t contextHandle)
{
if (SERCOM1_I2C_ErrorGet() == SERCOM_I2C_ERROR_NONE)
{
isTemperatureRead = true;
}
}
static void usartDmaChannelHandler(DMAC_TRANSFER_EVENT event, uintptr_t contextHandle)
{
if (event == DMAC_TRANSFER_EVENT_COMPLETE)
{
isUSARTTxComplete = true;
}
}
Add the following code to submit an I²C transfer to read the temperature sensor value when the configured time period (default 500 milliseconds) has elapsed. The I²C PLIB calls back the callback event handler (registered in Step 1.2 above) when the submitted request is complete.
SERCOM1_I2C_WriteRead(TEMP_SENSOR_SLAVE_ADDR, &i2cWrData, 1, i2cRdData, 2);
Add the following code to prepare the received temperature value from the sensor to be shown on the serial terminal.
sprintf((char*)uartTxBuffer, "Temperature = %02d F\r\n", temperatureVal);
LED_Toggle();
Add the following code to implement the change of sampling rate and prepare a message for the change on the serial terminal when the user presses the SW0 switch.
if(tempSampleRate == TEMP_SAMPLING_RATE_500MS)
{
tempSampleRate = TEMP_SAMPLING_RATE_1S;
sprintf((char*)uartTxBuffer, "Sampling Temperature every 1 second \r\n");
RTC_Timer32CompareSet(PERIOD_1S);
}
else if(tempSampleRate == TEMP_SAMPLING_RATE_1S)
{
tempSampleRate = TEMP_SAMPLING_RATE_2S;
sprintf((char*)uartTxBuffer, "Sampling Temperature every 2 seconds \r\n");
RTC_Timer32CompareSet(PERIOD_2S);
}
else if(tempSampleRate == TEMP_SAMPLING_RATE_2S)
{
tempSampleRate = TEMP_SAMPLING_RATE_4S;
sprintf((char*)uartTxBuffer, "Sampling Temperature every 4 seconds \r\n");
RTC_Timer32CompareSet(PERIOD_4S);
}
else if(tempSampleRate == TEMP_SAMPLING_RATE_4S)
{
tempSampleRate = TEMP_SAMPLING_RATE_500MS;
sprintf((char*)uartTxBuffer, "Sampling Temperature every 500 ms \r\n");
RTC_Timer32CompareSet(PERIOD_500MS);
}
else
{
;
}
Add code to transfer the buffer containing either:
- the latest temperature value in the format “Temperature = XX F\r\n”, or
- the message mentioning the change of sampling rate over USART using DMA.
You are now ready to build the code!