IniSat Modèle 1 Version 2 TP 4 : Etude d'un capteur Exo 1 : Lecture température Exo 2 : GPS, décodage données GGA

Committer:
Giamarchi
Date:
Wed Jun 30 22:59:26 2021 +0000
Revision:
1:ec64d7748431
Parent:
0:8b4bad2aad3f
Publish

Who changed what in which revision?

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