Правильно ли сделано прерывание при приеме символа через USART? Нужны ваши советы для улучшения программы. МК ATSAM3S.
Код
#include "board.h"
/*Настройка Pin.*/
const Pin pins[] = { BOARD_PIN_USART_RXD,
BOARD_PIN_USART_TXD,
PIN_USART1_SCK,
};
/* Считывание символа */
uint16_t USART_Read(Usart *usart)
{
while (!(usart->US_CSR & US_CSR_RXRDY) == 1) {
}
return usart->US_RHR;
}
/* обработчик прерываний */
void USART1_IrqHandler(void)
{
uint32_t status;
/* получение состояния */
status = BOARD_USART_BASE->US_CSR;
/* если это прерывание при приеме символа, то обрабатываем его */
if (status & US_CSR_RXRDY)
{
USART_Read(BOARD_USART_BASE);
}
}
static void _ConfigureUsart(uint32_t freq)
{
uint32_t mode = US_MR_USART_MODE_NORMAL | US_MR_USCLKS_MCK
| US_MR_CHMODE_NORMAL | US_MR_CLKO
| US_MR_SYNC | US_MR_MSBF
| US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT| US_MR_PAR_NO;
/* Enable the peripheral clock in the PMC */
PMC_EnablePeripheral( BOARD_ID_USART );
USART_Configure( BOARD_USART_BASE, mode, freq, BOARD_MCK );
/* включает устройство прерываний */
NVIC_EnableIRQ( USART1_IRQn );
/* разрешение прерывания при приеме символа */
BOARD_USART_BASE->US_IER = US_IER_RXRDY;
/* Enable receiver & transmitter */
USART_SetTransmitterEnabled( BOARD_USART_BASE, 1 );
USART_SetReceiverEnabled( BOARD_USART_BASE, 1 );
}
extern int main( void )
{
/* Configure pins */
PIO_Configure( pins, PIO_LISTSIZE( pins ) );
/* конфигурация USART; Baudrate 115200 */
_ConfigureUsart(115200);
while ( 1 )
{
USART1_IrqHandler();
}
}
Сообщение отредактировал wizzzi - Nov 8 2012, 12:45