FabLab Nîmes / Mbed 2 deprecated FabLab_Station_Meteo

Dependencies:   mbed

Committer:
Giamarchi
Date:
Thu Jun 16 17:05:58 2022 +0000
Revision:
6:5a2c3d7d4623
Parent:
5:46a732673cc5
maj

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Giamarchi 5:46a732673cc5 1 // UART.C
Giamarchi 5:46a732673cc5 2 //
Giamarchi 5:46a732673cc5 3 // Generic software uart written in C, requiring a timer set to 3 times
Giamarchi 5:46a732673cc5 4 // the baud rate, and two software read/write pins for the receive and
Giamarchi 5:46a732673cc5 5 // transmit functions.
Giamarchi 5:46a732673cc5 6 //
Giamarchi 5:46a732673cc5 7 // * Received characters are buffered
Giamarchi 5:46a732673cc5 8 // * putchar(), getchar(), kbhit() and flush_input_buffer() are available
Giamarchi 5:46a732673cc5 9 // * There is a facility for background processing while waiting for input
Giamarchi 5:46a732673cc5 10 //
Giamarchi 5:46a732673cc5 11 // Colin Gittins, Software Engineer, Halliburton Energy Services
Giamarchi 5:46a732673cc5 12 //
Giamarchi 5:46a732673cc5 13 // The baud rate can be configured by changing the BAUD_RATE macro as
Giamarchi 5:46a732673cc5 14 // follows:
Giamarchi 5:46a732673cc5 15 //
Giamarchi 5:46a732673cc5 16 // #define BAUD_RATE 19200.0
Giamarchi 5:46a732673cc5 17 //
Giamarchi 5:46a732673cc5 18 // The function init_uart() must be called before any comms can take place
Giamarchi 5:46a732673cc5 19 //
Giamarchi 5:46a732673cc5 20 // Interface routines required:
Giamarchi 5:46a732673cc5 21 // 1. get_rx_pin_status()
Giamarchi 5:46a732673cc5 22 // Returns 0 or 1 dependent on whether the receive pin is high or low.
Giamarchi 5:46a732673cc5 23 // 2. set_tx_pin_high()
Giamarchi 5:46a732673cc5 24 // Sets the transmit pin to the high state.
Giamarchi 5:46a732673cc5 25 // 3. set_tx_pin_low()
Giamarchi 5:46a732673cc5 26 // Sets the transmit pin to the low state.
Giamarchi 5:46a732673cc5 27 // 4. idle()
Giamarchi 5:46a732673cc5 28 // Background functions to execute while waiting for input.
Giamarchi 5:46a732673cc5 29 // 5. timer_set( BAUD_RATE )
Giamarchi 5:46a732673cc5 30 // Sets the timer to 3 times the baud rate.
Giamarchi 5:46a732673cc5 31 // 6. set_timer_interrupt( timer_isr )
Giamarchi 5:46a732673cc5 32 // Enables the timer interrupt.
Giamarchi 5:46a732673cc5 33 //
Giamarchi 5:46a732673cc5 34 // Functions provided:
Giamarchi 5:46a732673cc5 35 // 1. void flush_input_buffer( void )
Giamarchi 5:46a732673cc5 36 // Clears the contents of the input buffer.
Giamarchi 5:46a732673cc5 37 // 2. char kbhit( void )
Giamarchi 5:46a732673cc5 38 // Tests whether an input character has been received.
Giamarchi 5:46a732673cc5 39 // 3. char getchar( void )
Giamarchi 5:46a732673cc5 40 // Reads a character from the input buffer, waiting if necessary.
Giamarchi 5:46a732673cc5 41 // 4. void turn_rx_on( void )
Giamarchi 5:46a732673cc5 42 // Turns on the receive function.
Giamarchi 5:46a732673cc5 43 // 5. void turn_rx_off( void )
Giamarchi 5:46a732673cc5 44 // Turns off the receive function.
Giamarchi 5:46a732673cc5 45 // 6. void putchar( char )
Giamarchi 5:46a732673cc5 46 // Writes a character to the serial port.
Giamarchi 5:46a732673cc5 47 #include "mbed.h"
Giamarchi 5:46a732673cc5 48 #include <stdio.h>
Giamarchi 5:46a732673cc5 49
Giamarchi 5:46a732673cc5 50 #define BAUD_RATE 9600
Giamarchi 5:46a732673cc5 51 #define IN_BUF_SIZE 256
Giamarchi 5:46a732673cc5 52
Giamarchi 5:46a732673cc5 53 #define TRUE 1
Giamarchi 5:46a732673cc5 54 #define FALSE 0
Giamarchi 5:46a732673cc5 55
Giamarchi 5:46a732673cc5 56 static unsigned char inbuf[IN_BUF_SIZE];
Giamarchi 5:46a732673cc5 57 static unsigned char qin = 0;
Giamarchi 5:46a732673cc5 58 static unsigned char qout = 0;
Giamarchi 5:46a732673cc5 59
Giamarchi 5:46a732673cc5 60 static char flag_rx_waiting_for_stop_bit;
Giamarchi 5:46a732673cc5 61 static char flag_rx_off;
Giamarchi 5:46a732673cc5 62 static char rx_mask;
Giamarchi 5:46a732673cc5 63 static char flag_rx_ready;
Giamarchi 5:46a732673cc5 64 static char flag_tx_ready;
Giamarchi 5:46a732673cc5 65 static char timer_rx_ctr;
Giamarchi 5:46a732673cc5 66 static char timer_tx_ctr;
Giamarchi 5:46a732673cc5 67 static char bits_left_in_rx;
Giamarchi 5:46a732673cc5 68 static char bits_left_in_tx;
Giamarchi 5:46a732673cc5 69 static char rx_num_of_bits;
Giamarchi 5:46a732673cc5 70 static char tx_num_of_bits;
Giamarchi 5:46a732673cc5 71 static int internal_rx_buffer;
Giamarchi 5:46a732673cc5 72 static int internal_tx_buffer;
Giamarchi 5:46a732673cc5 73 static int user_tx_buffer;
Giamarchi 5:46a732673cc5 74
Giamarchi 5:46a732673cc5 75 DigitalOut TX(PA_6);
Giamarchi 5:46a732673cc5 76 DigitalIn RX(PA_7);
Giamarchi 5:46a732673cc5 77 Ticker ticker;
Giamarchi 5:46a732673cc5 78
Giamarchi 5:46a732673cc5 79 //Background functions to execute while waiting for input.
Giamarchi 5:46a732673cc5 80 void idle(){
Giamarchi 5:46a732673cc5 81 wait_us(0.2);
Giamarchi 5:46a732673cc5 82 }
Giamarchi 5:46a732673cc5 83
Giamarchi 5:46a732673cc5 84 //Sets the transmit pin to the high state.
Giamarchi 5:46a732673cc5 85 void set_tx_pin_high() {
Giamarchi 5:46a732673cc5 86 TX = 1;
Giamarchi 5:46a732673cc5 87 }
Giamarchi 5:46a732673cc5 88
Giamarchi 5:46a732673cc5 89 //Sets the transmit pin to the low state.
Giamarchi 5:46a732673cc5 90 void set_tx_pin_low() {
Giamarchi 5:46a732673cc5 91 TX = 0;
Giamarchi 5:46a732673cc5 92 }
Giamarchi 5:46a732673cc5 93
Giamarchi 5:46a732673cc5 94 //Returns 0 or 1 dependent on whether the receive pin is high or low
Giamarchi 5:46a732673cc5 95 int get_rx_pin_status() {
Giamarchi 5:46a732673cc5 96 return RX.read();
Giamarchi 5:46a732673cc5 97 }
Giamarchi 5:46a732673cc5 98
Giamarchi 5:46a732673cc5 99 void timer_isr(void)
Giamarchi 5:46a732673cc5 100 {
Giamarchi 5:46a732673cc5 101 char mask, start_bit, flag_in;
Giamarchi 5:46a732673cc5 102
Giamarchi 5:46a732673cc5 103 // Transmitter Section
Giamarchi 5:46a732673cc5 104 if ( flag_tx_ready )
Giamarchi 5:46a732673cc5 105 {
Giamarchi 5:46a732673cc5 106
Giamarchi 5:46a732673cc5 107 if ( --timer_tx_ctr<=0 )
Giamarchi 5:46a732673cc5 108 {
Giamarchi 5:46a732673cc5 109 mask = internal_tx_buffer&1;
Giamarchi 5:46a732673cc5 110 internal_tx_buffer >>= 1;
Giamarchi 5:46a732673cc5 111 if ( mask )
Giamarchi 5:46a732673cc5 112 {
Giamarchi 5:46a732673cc5 113 set_tx_pin_high();
Giamarchi 5:46a732673cc5 114 }
Giamarchi 5:46a732673cc5 115 else
Giamarchi 5:46a732673cc5 116 {
Giamarchi 5:46a732673cc5 117 set_tx_pin_low();
Giamarchi 5:46a732673cc5 118 }
Giamarchi 5:46a732673cc5 119 timer_tx_ctr = 3;
Giamarchi 5:46a732673cc5 120 if ( --bits_left_in_tx<=0 )
Giamarchi 5:46a732673cc5 121 {
Giamarchi 5:46a732673cc5 122 flag_tx_ready = FALSE;
Giamarchi 5:46a732673cc5 123 }
Giamarchi 5:46a732673cc5 124 }
Giamarchi 5:46a732673cc5 125 }
Giamarchi 5:46a732673cc5 126 // Receiver Section
Giamarchi 5:46a732673cc5 127 if ( flag_rx_off==FALSE )
Giamarchi 5:46a732673cc5 128 {
Giamarchi 5:46a732673cc5 129 if ( flag_rx_waiting_for_stop_bit )
Giamarchi 5:46a732673cc5 130 {
Giamarchi 5:46a732673cc5 131 if ( --timer_rx_ctr<=0 )
Giamarchi 5:46a732673cc5 132 {
Giamarchi 5:46a732673cc5 133 flag_rx_waiting_for_stop_bit = FALSE;
Giamarchi 5:46a732673cc5 134 flag_rx_ready = FALSE;
Giamarchi 5:46a732673cc5 135 internal_rx_buffer &= 0xFF;
Giamarchi 5:46a732673cc5 136 if ( internal_rx_buffer!=0xC2 )
Giamarchi 5:46a732673cc5 137 {
Giamarchi 5:46a732673cc5 138 inbuf[qin] = internal_rx_buffer;
Giamarchi 5:46a732673cc5 139 if ( ++qin>=IN_BUF_SIZE )
Giamarchi 5:46a732673cc5 140 {
Giamarchi 5:46a732673cc5 141 qin = 0;
Giamarchi 5:46a732673cc5 142 }
Giamarchi 5:46a732673cc5 143 }
Giamarchi 5:46a732673cc5 144 }
Giamarchi 5:46a732673cc5 145 }
Giamarchi 5:46a732673cc5 146 else // rx_test_busy
Giamarchi 5:46a732673cc5 147 {
Giamarchi 5:46a732673cc5 148 if ( flag_rx_ready==FALSE )
Giamarchi 5:46a732673cc5 149 {
Giamarchi 5:46a732673cc5 150 start_bit = get_rx_pin_status();
Giamarchi 5:46a732673cc5 151 // Test for Start Bit
Giamarchi 5:46a732673cc5 152 if ( start_bit==0 )
Giamarchi 5:46a732673cc5 153 {
Giamarchi 5:46a732673cc5 154 flag_rx_ready = TRUE;
Giamarchi 5:46a732673cc5 155 internal_rx_buffer = 0;
Giamarchi 5:46a732673cc5 156 timer_rx_ctr = 4;
Giamarchi 5:46a732673cc5 157 bits_left_in_rx = rx_num_of_bits;
Giamarchi 5:46a732673cc5 158 rx_mask = 1;
Giamarchi 5:46a732673cc5 159 }
Giamarchi 5:46a732673cc5 160 }
Giamarchi 5:46a732673cc5 161 else // rx_busy
Giamarchi 5:46a732673cc5 162 {
Giamarchi 5:46a732673cc5 163 if ( --timer_rx_ctr<=0 )
Giamarchi 5:46a732673cc5 164 { // rcv
Giamarchi 5:46a732673cc5 165 timer_rx_ctr = 3;
Giamarchi 5:46a732673cc5 166 flag_in = get_rx_pin_status();
Giamarchi 5:46a732673cc5 167 if ( flag_in )
Giamarchi 5:46a732673cc5 168 {
Giamarchi 5:46a732673cc5 169 internal_rx_buffer |= rx_mask;
Giamarchi 5:46a732673cc5 170 }
Giamarchi 5:46a732673cc5 171 rx_mask <<= 1;
Giamarchi 5:46a732673cc5 172 if ( --bits_left_in_rx<=0 )
Giamarchi 5:46a732673cc5 173 {
Giamarchi 5:46a732673cc5 174 flag_rx_waiting_for_stop_bit = TRUE;
Giamarchi 5:46a732673cc5 175 }
Giamarchi 5:46a732673cc5 176 }
Giamarchi 5:46a732673cc5 177 }
Giamarchi 5:46a732673cc5 178 }
Giamarchi 5:46a732673cc5 179 }
Giamarchi 5:46a732673cc5 180 }
Giamarchi 5:46a732673cc5 181
Giamarchi 5:46a732673cc5 182 void init_uart( void )
Giamarchi 5:46a732673cc5 183 {
Giamarchi 5:46a732673cc5 184 flag_tx_ready = FALSE;
Giamarchi 5:46a732673cc5 185 flag_rx_ready = FALSE;
Giamarchi 5:46a732673cc5 186 flag_rx_waiting_for_stop_bit = FALSE;
Giamarchi 5:46a732673cc5 187 flag_rx_off = FALSE;
Giamarchi 5:46a732673cc5 188 rx_num_of_bits = 8;//10
Giamarchi 5:46a732673cc5 189 tx_num_of_bits = 10;//10
Giamarchi 5:46a732673cc5 190
Giamarchi 5:46a732673cc5 191 set_tx_pin_high();
Giamarchi 5:46a732673cc5 192 ticker.attach_us(&timer_isr, 1000000.0 / (BAUD_RATE * 3.0));
Giamarchi 5:46a732673cc5 193
Giamarchi 5:46a732673cc5 194 }
Giamarchi 5:46a732673cc5 195
Giamarchi 5:46a732673cc5 196 char _getchar( void )
Giamarchi 5:46a732673cc5 197 {
Giamarchi 5:46a732673cc5 198 char ch;
Giamarchi 5:46a732673cc5 199
Giamarchi 5:46a732673cc5 200 do
Giamarchi 5:46a732673cc5 201 {
Giamarchi 5:46a732673cc5 202 while ( qout==qin )
Giamarchi 5:46a732673cc5 203 {
Giamarchi 5:46a732673cc5 204 idle();
Giamarchi 5:46a732673cc5 205 }
Giamarchi 5:46a732673cc5 206 ch = inbuf[qout] & 0xFF;
Giamarchi 5:46a732673cc5 207 if ( ++qout>=IN_BUF_SIZE )
Giamarchi 5:46a732673cc5 208 {
Giamarchi 5:46a732673cc5 209 qout = 0;
Giamarchi 5:46a732673cc5 210 }
Giamarchi 5:46a732673cc5 211 }
Giamarchi 5:46a732673cc5 212 while ( ch==0x0A || ch==0xC2 );
Giamarchi 5:46a732673cc5 213 return( ch );
Giamarchi 5:46a732673cc5 214 }
Giamarchi 5:46a732673cc5 215
Giamarchi 5:46a732673cc5 216 void _putchar( int ch )
Giamarchi 5:46a732673cc5 217 {
Giamarchi 5:46a732673cc5 218 while ( flag_tx_ready );
Giamarchi 5:46a732673cc5 219 user_tx_buffer = ch;
Giamarchi 5:46a732673cc5 220
Giamarchi 5:46a732673cc5 221 // invoke_UART_transmit
Giamarchi 5:46a732673cc5 222 timer_tx_ctr = 3;
Giamarchi 5:46a732673cc5 223 bits_left_in_tx = tx_num_of_bits;
Giamarchi 5:46a732673cc5 224 internal_tx_buffer = (user_tx_buffer<<1) | 0x200;;
Giamarchi 5:46a732673cc5 225 flag_tx_ready = TRUE;
Giamarchi 5:46a732673cc5 226 }
Giamarchi 5:46a732673cc5 227
Giamarchi 5:46a732673cc5 228 void flush_input_buffer( void )
Giamarchi 5:46a732673cc5 229 {
Giamarchi 5:46a732673cc5 230 qin = 0;
Giamarchi 5:46a732673cc5 231 qout = 0;
Giamarchi 5:46a732673cc5 232 }
Giamarchi 5:46a732673cc5 233
Giamarchi 5:46a732673cc5 234 char kbhit( void )
Giamarchi 5:46a732673cc5 235 {
Giamarchi 5:46a732673cc5 236 return( qin!=qout );
Giamarchi 5:46a732673cc5 237 }
Giamarchi 5:46a732673cc5 238
Giamarchi 5:46a732673cc5 239 void turn_rx_on( void )
Giamarchi 5:46a732673cc5 240 {
Giamarchi 5:46a732673cc5 241 flag_rx_off = FALSE;
Giamarchi 5:46a732673cc5 242 }
Giamarchi 5:46a732673cc5 243
Giamarchi 5:46a732673cc5 244 void turn_rx_off( void )
Giamarchi 5:46a732673cc5 245 {
Giamarchi 5:46a732673cc5 246 flag_rx_off = TRUE;
Giamarchi 5:46a732673cc5 247 }
Giamarchi 5:46a732673cc5 248
Giamarchi 5:46a732673cc5 249 void printStr(char* str){
Giamarchi 5:46a732673cc5 250 int i = 0;
Giamarchi 5:46a732673cc5 251 int len = strlen(str);
Giamarchi 5:46a732673cc5 252 for(i = 0; i<len; i++){
Giamarchi 5:46a732673cc5 253 wait(0.01);
Giamarchi 5:46a732673cc5 254 _putchar(str[i]);
Giamarchi 5:46a732673cc5 255 }
Giamarchi 5:46a732673cc5 256 }