This file gives an example of using the MMU to manage the memory on AVR32 MCUs.
$Name$
Definition in file usart.c.
#include "usart.h"

Go to the source code of this file.
Functions | |
| int | _write_r (struct _reent *ptr, int fd, const void *buf, size_t cnt) |
| Function to overload the standard _write_r, makes it possible to use printf() to output data. | |
| int | usart_linit (volatile avr32_usart_t *usart, const struct usart_options_t *opt, const long cpuHz) |
| Setup the usart to use the standard RS232 protocol. | |
| int | usart_putchar (volatile avr32_usart_t *usart, const short character) |
| Send a character with the usart. | |
| void | usart_reset (volatile avr32_usart_t *usart) |
| This function will reset the USART, and disable TX and RX. | |
| static int | usart_set_baudrate (volatile avr32_usart_t *usart, unsigned int baudrate, const long cpuHz) |
| This function will calculate a clock divider(CD) and fractional part(FP) that gets the usart as close to a wanted baudrate as possible. | |
| int _write_r | ( | struct _reent * | ptr, | |
| int | fd, | |||
| const void * | buf, | |||
| size_t | cnt | |||
| ) |
Function to overload the standard _write_r, makes it possible to use printf() to output data.
| ptr | not used | |
| fd | not used | |
| buf | the buffer to send | |
| cnt | number of bytes to send |
Definition at line 252 of file usart.c.
00253 { 00254 volatile char *msg = (char *) buf; 00255 volatile int i; 00256 00257 for (i=0; i < cnt; i++) { 00258 usart_putchar(&USART_MODULE, *msg++); 00259 } 00260 00261 return cnt; 00262 }
| int usart_linit | ( | volatile avr32_usart_t * | usart, | |
| const struct usart_options_t * | opt, | |||
| const long | cpuHz | |||
| ) |
Setup the usart to use the standard RS232 protocol.
| usart | base address of the usart | |
| opt | options needed to set up RS232 communcation (see usart_options_t) | |
| cpuHz | frequency of the selected clock |
| USART_OK | on success | |
| USART_ERROR_ARGUMENT | on wrong arguments |
Definition at line 152 of file usart.c.
Referenced by main().
00155 { 00156 int retval; 00157 00158 /* reset the usart and shutdown RX and TX */ 00159 usart_reset(usart); 00160 00161 /* control input values */ 00162 if (opt == 0) { 00163 return USART_ERROR_ARGUMENT; 00164 } 00165 if (opt->charlength < 5 || opt->charlength > 9) { 00166 return USART_ERROR_ARGUMENT; 00167 } 00168 if (opt->paritytype > 7) { 00169 return USART_ERROR_ARGUMENT; 00170 } 00171 if (opt->stopbits > 2+255) { 00172 return USART_ERROR_ARGUMENT; 00173 } 00174 if (opt->channelmode > 3) { 00175 return USART_ERROR_ARGUMENT; 00176 } 00177 00178 retval = usart_set_baudrate(usart, opt->baudrate, cpuHz); 00179 00180 if (retval != USART_OK) { 00181 return retval; 00182 } 00183 00184 if (opt->charlength == 9) { 00185 /* charlength set to 9 bits; MODE9 dominates CHRL */ 00186 usart->mr |= AVR32_USART_MR_MODE9_MASK; 00187 } else { 00188 /* CHRL gives the charlength(- 5) when USART_MODE9=0 */ 00189 usart->mr |= 00190 ((opt->charlength-5)<<AVR32_USART_MR_CHRL_OFFSET); 00191 } 00192 00193 usart->mr |= (opt->channelmode<<AVR32_USART_MR_CHMODE_OFFSET)| 00194 (opt->paritytype<<AVR32_USART_MR_PAR_OFFSET); 00195 00196 if (opt->stopbits > 2) { 00197 /* set two stop bits */ 00198 usart->mr |= (2<<AVR32_USART_MR_NBSTOP_OFFSET); 00199 /* and a timeguard period gives the rest */ 00200 usart->ttgr = (opt->stopbits-2); 00201 } else { 00202 /* insert 1, 1.5 or 2 stop bits */ 00203 usart->mr |= (opt->stopbits<<AVR32_USART_MR_NBSTOP_OFFSET); 00204 } 00205 00206 /* enable TX and RX */ 00207 usart->cr |= AVR32_USART_CR_TXEN_MASK|AVR32_USART_CR_RXEN_MASK; 00208 00209 return USART_OK; 00210 }
| int usart_putchar | ( | volatile avr32_usart_t * | usart, | |
| const short | character | |||
| ) |
Send a character with the usart.
| usart | base address of the usart | |
| character | character to write |
| USART_OK | on success | |
| USART_TX_BUSY | on timeout |
Definition at line 222 of file usart.c.
Referenced by _write_r().
00223 { 00224 int timeout = USART_DEFAULT_TIMEOUT; 00225 00226 do { 00227 --timeout; 00228 } while ((usart->csr & AVR32_USART_CSR_TXRDY_MASK) == 0 && timeout > 0); 00229 00230 if (timeout == 0) { 00231 return USART_TX_BUSY; 00232 } 00233 00234 usart->thr = character; 00235 00236 return USART_OK; 00237 }
| void usart_reset | ( | volatile avr32_usart_t * | usart | ) |
This function will reset the USART, and disable TX and RX.
| usart | Base address of the usart |
Definition at line 56 of file usart.c.
Referenced by usart_linit().
00057 { 00058 /* Disable all usart interrupts, interrupts needed should be set 00059 explicitly on every reset */ 00060 usart->idr = 0xFFFFffff; 00061 00062 /* Reset mode and other registers that could cause unpredictable 00063 behaviour after reset */ 00064 usart->mr = 0; 00065 usart->rtor = 0; 00066 usart->ttgr = 0; 00067 00068 /* Shutdown RX and TX (will be reenabled when setup 00069 is completed successfully), reset status bits and turn 00070 off DTR and RTS */ 00071 usart->cr = AVR32_USART_CR_RSTRX_MASK| 00072 AVR32_USART_CR_RSTTX_MASK| 00073 AVR32_USART_CR_RSTSTA_MASK| 00074 AVR32_USART_CR_RSTIT_MASK| 00075 AVR32_USART_CR_RSTNACK_MASK| 00076 AVR32_USART_CR_DTRDIS_MASK| 00077 AVR32_USART_CR_RTSDIS_MASK; 00078 }
| static int usart_set_baudrate | ( | volatile avr32_usart_t * | usart, | |
| unsigned int | baudrate, | |||
| const long | cpuHz | |||
| ) | [static] |
This function will calculate a clock divider(CD) and fractional part(FP) that gets the usart as close to a wanted baudrate as possible.
| usart | base address of the usart | |
| baudrate | wanted baudrate | |
| cpuHz | frequency of the selected clock |
| USART_OK | on success | |
| USART_ERROR_ARGUMENT | if wanted baudrate is impossible with given clockspeed |
Definition at line 94 of file usart.c.
References USART_ERROR_ARGUMENT, and USART_OK.
Referenced by usart_linit().
00097 { 00098 int cd, fp; /* clock divider and fractional part */ 00099 00100 /* 00101 * ** BAUDRATE CALCULATION ** 00102 * 00103 * selected clock selected clock 00104 * baudrate = ---------------- or baudrate = ---------------- 00105 * 16 x (CD + FP/8) 8 x (CD + FP/8) 00106 * 00107 * (with 16x oversampling) (with 8x oversampling) 00108 */ 00109 if (baudrate > (cpuHz/16)) { 00110 /* use 8x oversampling */ 00111 usart->mr |= (AVR32_USART_MR_OVER_MASK); 00112 cd = cpuHz / (8 * baudrate); 00113 00114 if (cd < 2) { 00115 /* wanted baudrate is too high */ 00116 return USART_ERROR_ARGUMENT; 00117 } 00118 00119 fp = cpuHz / baudrate - 8 * cd; 00120 usart->brgr = (fp << AVR32_USART_BRGR_FP_OFFSET) 00121 | (cd << AVR32_USART_BRGR_CD_OFFSET); 00122 } else { 00123 /* use 16x oversampling */ 00124 usart->mr &= ~(AVR32_USART_MR_OVER_MASK); 00125 cd = cpuHz / (16 * baudrate); 00126 00127 if (cd > 65535) { 00128 /* wanted baudrate is too low */ 00129 return USART_ERROR_ARGUMENT; 00130 } 00131 00132 fp = cpuHz / (2 * baudrate) - 16 * cd; 00133 usart->brgr = (fp << AVR32_USART_BRGR_FP_OFFSET) 00134 | (cd << AVR32_USART_BRGR_CD_OFFSET); 00135 } 00136 00137 return USART_OK; 00138 }
1.5.3