今天用库函数跑下RTT,这个程序很简单用串口同单片机通读,可以输入R复位RTT,也可输入S来设定报警时间、
程序如下:
#include "asf.h"
#include "stdio_serial.h"
#include "conf_board.h"
#include "conf_clock.h"
/** Device state: in the main menu. */
#define STATE_MAIN_MENU 0
/** Device state: user is setting an alarm time. */
#define STATE_SET_ALARM 1
/** ASCII char definition for backspace. */
#define ASCII_BS 8
/** ASCII char definition for carriage return. */
#define ASCII_CR 13
#define STRING_EOL "\r"
#define STRING_HEADER "-- RTT Example --\r\n" \
"-- "BOARD_NAME" --\r\n" \
"-- Compiled: "__DATE__" "__TIME__" --"STRING_EOL
/** Current device state. */
volatile uint8_t g_uc_state;
/** New alarm time being currently entered. */
volatile uint32_t g_ul_new_alarm;
/** Indicate that an alarm has occurred but has not been cleared. */
volatile uint8_t g_uc_alarmed;
/**
* \brief Refresh display on terminal.
*
* Update the terminal display to show the current menu and the current time
* depending on the device state.
*/
static void refresh_display(void)
{
printf("%c[2J\r", 27);
printf("Time: %u\n\r", (unsigned int)rtt_read_timer_value(RTT));
/* Display alarm */
if (g_uc_alarmed) {
puts("!!! ALARM !!!\r");
}
/* Main menu */
if (g_uc_state == STATE_MAIN_MENU) {
puts("Menu:\n\r"
" r - Reset timer\n\r"
" s - Set alarm\r");
if (g_uc_alarmed) {
puts(" c - Clear alarm notification\r");
}
puts("\n\rChoice? ");
} else {
if (g_uc_state == STATE_SET_ALARM) {
puts("Enter alarm time: ");
if (g_ul_new_alarm != 0) {
printf("%u", (unsigned)g_ul_new_alarm);
}
}
}
}
/**
* \brief RTT configuration function.
*
* Configure the RTT to generate a one second tick, which triggers the RTTINC
* interrupt.
*/
static void configure_rtt(void)
{
uint32_t ul_previous_time;
/* Configure RTT for a 1 second tick interrupt */
#if SAM4N || SAM4S || SAM4E || SAM4C || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70
rtt_sel_source(RTT, false);
#endif
rtt_init(RTT, 32768);
ul_previous_time = rtt_read_timer_value(RTT);
while (ul_previous_time == rtt_read_timer_value(RTT));
/* Enable RTT interrupt */
NVIC_DisableIRQ(RTT_IRQn);
NVIC_ClearPendingIRQ(RTT_IRQn);
NVIC_SetPriority(RTT_IRQn, 0);
NVIC_EnableIRQ(RTT_IRQn);
rtt_enable_interrupt(RTT, RTT_MR_RTTINCIEN);
}
/**
* \brief Configure the console UART.
*/
static void configure_console(void)
{
const usart_serial_options_t uart_serial_options = {
.baudrate = CONF_UART_BAUDRATE,
#ifdef CONF_UART_CHAR_LENGTH
.charlength = CONF_UART_CHAR_LENGTH,
#endif
.paritytype = CONF_UART_PARITY,
#ifdef CONF_UART_STOP_BITS
.stopbits = CONF_UART_STOP_BITS,
#endif
};
/* Configure console UART. */
sysclk_enable_peripheral_clock(CONSOLE_UART_ID);
stdio_serial_init(CONF_UART, &uart_serial_options);
}
/**
* \brief Interrupt handler for the RTT.
*
* Display the current time on the terminal.
*/
void RTT_Handler(void)
{
uint32_t ul_status;
/* Get RTT status */
ul_status = rtt_get_status(RTT);
/* Time has changed, refresh display */
if ((ul_status & RTT_SR_RTTINC) == RTT_SR_RTTINC) {
refresh_display();
}
/* Alarm */
if ((ul_status & RTT_SR_ALMS) == RTT_SR_ALMS) {
g_uc_alarmed = 1;
refresh_display();
}
}
/**
* \brief Application entry point for RTT example.
*
* Initialize the RTT, display the current time and allow the user to
* perform several actions: clear the timer, set an alarm, etc.
*
* \return Unused (ANSI-C compatibility).
*/
int main(void)
{
uint8_t c;
/* Initialize the SAM system */
sysclk_init();
board_init();
/* Configure console UART */
configure_console();
/* Output example information */
puts(STRING_HEADER);
/* Configure RTT */
configure_rtt();
/* Initialize state machine */
g_uc_state = STATE_MAIN_MENU;
g_uc_alarmed = 0;
refresh_display();
/* User input loop */
while (1) {
/* Wait for user input */
scanf("%c", (char *)&c);
/* Main menu mode */
if (g_uc_state == STATE_MAIN_MENU) {
/* Reset timer */
if (c == 'r') {
configure_rtt();
refresh_display();
} else if (c == 's') { /* Set alarm */
g_uc_state = STATE_SET_ALARM;
g_ul_new_alarm = 0;
refresh_display();
} else { /* Clear alarm */
if ((c == 'c') && g_uc_alarmed) {
g_uc_alarmed = 0;
refresh_display();
}
}
} else if (g_uc_state == STATE_SET_ALARM) { /* Set alarm mode */
/* Number */
if ((c >= '0') && (c <= '9')) {
g_ul_new_alarm = g_ul_new_alarm * 10 + c - '0';
refresh_display();
} else if (c == ASCII_BS) {
printf("%c", c);
g_ul_new_alarm /= 10;
refresh_display();
} else if (c == ASCII_CR) {
/* Avoid newAlarm = 0 case */
if (g_ul_new_alarm != 0) {
rtt_write_alarm_time(RTT, g_ul_new_alarm);
}
g_uc_state = STATE_MAIN_MENU;
refresh_display();
}
}
}
}
以下是运行截图:
|