@@ -344,64 +344,47 @@ void serial_free(serial_t *obj)
344344 }
345345}
346346
347- static nrf_uart_baudrate_t baud_translate ( int rate )
347+ void serial_baud ( serial_t * obj , int baudrate )
348348{
349- nrf_uart_baudrate_t baud ;
350-
351- if (rate < 57600 ) {
352- if (rate < 14400 ) {
353- if (rate < 2400 ) {
354- baud = NRF_UART_BAUDRATE_1200 ;
355- } else if (rate < 4800 ) {
356- baud = NRF_UART_BAUDRATE_2400 ;
357- } else if (rate < 9600 ) {
358- baud = NRF_UART_BAUDRATE_4800 ;
359- } else {
360- baud = NRF_UART_BAUDRATE_9600 ;
361- }
362- } else {
363- if (rate < 19200 ) {
364- baud = NRF_UART_BAUDRATE_14400 ;
365- } else if (rate < 28800 ) {
366- baud = NRF_UART_BAUDRATE_19200 ;
367- } else if (rate < 38400 ) {
368- baud = NRF_UART_BAUDRATE_28800 ;
369- } else {
370- baud = NRF_UART_BAUDRATE_38400 ;
371- }
372- }
373- } else {
374- if (rate < 250000 ) {
375- if (rate < 76800 ) {
376- baud = NRF_UART_BAUDRATE_57600 ;
377- } else if (rate < 115200 ) {
378- baud = NRF_UART_BAUDRATE_76800 ;
379- } else if (rate < 230400 ) {
380- baud = NRF_UART_BAUDRATE_115200 ;
381- } else {
382- baud = NRF_UART_BAUDRATE_230400 ;
383- }
384- } else {
385- if (rate < 460800 ) {
386- baud = NRF_UART_BAUDRATE_250000 ;
387- } else if (rate < 921600 ) {
388- baud = NRF_UART_BAUDRATE_460800 ;
389- } else if (rate < 1000000 ) {
390- baud = NRF_UART_BAUDRATE_921600 ;
391- } else {
392- baud = NRF_UART_BAUDRATE_1000000 ;
393- }
349+ // nrf_uart_baudrate_set() is not used here (registers are accessed
350+ // directly) to make it possible to set special baud rates like 56000
351+ // or 31250.
352+
353+ static uint32_t const acceptedSpeeds [][2 ] = {
354+ { 1200 , UART_BAUDRATE_BAUDRATE_Baud1200 },
355+ { 2400 , UART_BAUDRATE_BAUDRATE_Baud2400 },
356+ { 4800 , UART_BAUDRATE_BAUDRATE_Baud4800 },
357+ { 9600 , UART_BAUDRATE_BAUDRATE_Baud9600 },
358+ { 14400 , UART_BAUDRATE_BAUDRATE_Baud14400 },
359+ { 19200 , UART_BAUDRATE_BAUDRATE_Baud19200 },
360+ { 28800 , UART_BAUDRATE_BAUDRATE_Baud28800 },
361+ { 31250 , (0x00800000UL ) /* 31250 baud */ },
362+ { 38400 , UART_BAUDRATE_BAUDRATE_Baud38400 },
363+ { 56000 , (0x00E51000UL ) /* 56000 baud */ },
364+ { 57600 , UART_BAUDRATE_BAUDRATE_Baud57600 },
365+ { 76800 , UART_BAUDRATE_BAUDRATE_Baud76800 },
366+ { 115200 , UART_BAUDRATE_BAUDRATE_Baud115200 },
367+ { 230400 , UART_BAUDRATE_BAUDRATE_Baud230400 },
368+ { 250000 , UART_BAUDRATE_BAUDRATE_Baud250000 },
369+ { 460800 , UART_BAUDRATE_BAUDRATE_Baud460800 },
370+ { 921600 , UART_BAUDRATE_BAUDRATE_Baud921600 },
371+ { 1000000 , UART_BAUDRATE_BAUDRATE_Baud1M }
372+ };
373+
374+ if (baudrate <= 1200 ) {
375+ UART_INSTANCE -> BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1200 ;
376+ return ;
377+ }
378+
379+ int const item_cnt = sizeof (acceptedSpeeds )/sizeof (acceptedSpeeds [0 ]);
380+ for (int i = 1 ; i < item_cnt ; i ++ ) {
381+ if ((uint32_t )baudrate < acceptedSpeeds [i ][0 ]) {
382+ UART_INSTANCE -> BAUDRATE = acceptedSpeeds [i - 1 ][1 ];
383+ return ;
394384 }
395385 }
396- return baud ;
397- }
398- void serial_baud (serial_t * obj , int baudrate )
399- {
400- (void )obj ;
401- UART_CB .baudrate = baud_translate (baudrate );
402386
403- // Reconfigure UART peripheral.
404- nrf_uart_baudrate_set (UART_INSTANCE , UART_CB .baudrate );
387+ UART_INSTANCE -> BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1M ;
405388}
406389
407390void serial_format (serial_t * obj ,
0 commit comments