Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
C
cm510_controller_fw
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
humanoides
cm510_controller_fw
Commits
b79950ec
Commit
b79950ec
authored
9 years ago
by
Sergi Hernandez
Browse files
Options
Downloads
Patches
Plain Diff
Changed the serial_console module to use interrupts instead of polling.
parent
3eb0b8d2
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
communications/src/serial_console.c
+68
-27
68 additions, 27 deletions
communications/src/serial_console.c
with
68 additions
and
27 deletions
communications/src/serial_console.c
+
68
−
27
View file @
b79950ec
...
@@ -3,21 +3,40 @@
...
@@ -3,21 +3,40 @@
#include
<stdio.h>
#include
<stdio.h>
/* private variables */
/* private variables */
volatile
uint8_t
serial_console_buffer
[
SERIAL_CONSOLE_MAX_BUFFER_LEN
];
volatile
uint8_t
serial_console_rx_buffer
[
SERIAL_CONSOLE_MAX_BUFFER_LEN
];
volatile
uint8_t
serial_console_read_ptr
;
volatile
uint8_t
serial_console_rx_read_ptr
;
volatile
uint8_t
serial_console_write_ptr
;
volatile
uint8_t
serial_console_rx_write_ptr
;
volatile
uint8_t
serial_console_num_data
;
volatile
uint8_t
serial_console_rx_num_data
;
volatile
uint8_t
serial_console_tx_buffer
[
SERIAL_CONSOLE_MAX_BUFFER_LEN
];
volatile
uint8_t
serial_console_tx_read_ptr
;
volatile
uint8_t
serial_console_tx_write_ptr
;
volatile
uint8_t
serial_console_tx_num_data
;
volatile
uint8_t
serial_console_sending
;
static
FILE
*
device
;
static
FILE
*
device
;
/* interrupt handlers */
/* interrupt handlers */
SIGNAL
(
USART1_RX_vect
)
SIGNAL
(
USART1_RX_vect
)
{
{
if
(
serial_console_num_data
<
SERIAL_CONSOLE_MAX_BUFFER_LEN
)
cli
();
serial_console_rx_buffer
[
serial_console_rx_write_ptr
]
=
UDR1
;
serial_console_rx_write_ptr
=
(
serial_console_rx_write_ptr
+
1
)
%
SERIAL_CONSOLE_MAX_BUFFER_LEN
;
if
(
serial_console_rx_num_data
<
SERIAL_CONSOLE_MAX_BUFFER_LEN
)
serial_console_rx_num_data
++
;
sei
();
}
SIGNAL
(
USART1_TX_vect
)
{
cli
();
if
(
serial_console_tx_num_data
>
0
)
{
{
serial_console_buffer
[
serial_console_
write_ptr
]
=
UDR1
;
UDR1
=
serial_console_
tx_
buffer
[
serial_console_
tx_read_ptr
]
;
serial_console_
write
_ptr
=
(
serial_console_
write
_ptr
+
1
)
%
SERIAL_CONSOLE_MAX_BUFFER_LEN
;
serial_console_
tx_read
_ptr
=
(
serial_console_
tx_read
_ptr
+
1
)
%
SERIAL_CONSOLE_MAX_BUFFER_LEN
;
serial_console_num_data
++
;
serial_console_
tx_
num_data
--
;
}
}
else
serial_console_sending
=
0x00
;
sei
();
}
}
/* private functions */
/* private functions */
...
@@ -32,14 +51,25 @@ void serial_console_set_baudrate(uint32_t baudrate)
...
@@ -32,14 +51,25 @@ void serial_console_set_baudrate(uint32_t baudrate)
int
serial_console_putchar
(
char
c
,
FILE
*
dev
)
int
serial_console_putchar
(
char
c
,
FILE
*
dev
)
{
{
if
(
c
==
'\n'
)
cli
();
if
(
c
==
'\n'
)
{
{
while
((
UCSR1A
&
(
1
<<
UDRE1
))
==
0x00
);
serial_console_tx_buffer
[
serial_console_tx_write_ptr
]
=
'\r'
;
UDR1
=
'\r'
;
serial_console_tx_write_ptr
=
(
serial_console_tx_write_ptr
+
1
)
%
SERIAL_CONSOLE_MAX_BUFFER_LEN
;
serial_console_tx_num_data
++
;
}
}
serial_console_tx_buffer
[
serial_console_tx_write_ptr
]
=
c
;
while
((
UCSR1A
&
(
1
<<
UDRE1
))
==
0x00
);
serial_console_tx_write_ptr
=
(
serial_console_tx_write_ptr
+
1
)
%
SERIAL_CONSOLE_MAX_BUFFER_LEN
;
UDR1
=
c
;
serial_console_tx_num_data
++
;
if
(
serial_console_sending
==
0x00
)
{
UDR1
=
serial_console_tx_buffer
[
serial_console_tx_read_ptr
];
serial_console_tx_read_ptr
=
(
serial_console_tx_read_ptr
+
1
)
%
SERIAL_CONSOLE_MAX_BUFFER_LEN
;
serial_console_tx_num_data
--
;
serial_console_sending
=
0x01
;
}
sei
();
return
0
;
return
0
;
}
}
...
@@ -48,14 +78,22 @@ int serial_console_getchar(FILE *dev)
...
@@ -48,14 +78,22 @@ int serial_console_getchar(FILE *dev)
{
{
int8_t
rx
;
int8_t
rx
;
while
(
serial_console_num_data
==
0
);
cli
();
rx
=
serial_console_buffer
[
serial_console_read_ptr
];
if
(
serial_console_rx_num_data
>
0
)
serial_console_read_ptr
=
(
serial_console_read_ptr
+
1
)
%
SERIAL_CONSOLE_MAX_BUFFER_LEN
;
{
serial_console_num_data
--
;
rx
=
serial_console_rx_buffer
[
serial_console_rx_read_ptr
];
if
(
rx
==
'\r'
)
serial_console_rx_read_ptr
=
(
serial_console_rx_read_ptr
+
1
)
%
SERIAL_CONSOLE_MAX_BUFFER_LEN
;
rx
=
'\n'
;
serial_console_rx_num_data
--
;
if
(
rx
==
'\r'
)
return
rx
;
rx
=
'\n'
;
sei
();
return
rx
;
}
else
{
sei
();
return
-
1
;
}
}
}
/* pubic functions */
/* pubic functions */
...
@@ -78,7 +116,7 @@ void serial_console_init(uint32_t baudrate)
...
@@ -78,7 +116,7 @@ void serial_console_init(uint32_t baudrate)
// bit4: enable rx
// bit4: enable rx
// bit3: enable tx
// bit3: enable tx
// bit2: set sendding size(0 = 8bit)
// bit2: set sendding size(0 = 8bit)
UCSR1B
=
0
b1
0
011000
;
UCSR1B
=
0
b1
1
011000
;
// set UART register C
// set UART register C
// bit6: communication mode (1 = synchronize, 0 = asynchronize)
// bit6: communication mode (1 = synchronize, 0 = asynchronize)
...
@@ -88,10 +126,13 @@ void serial_console_init(uint32_t baudrate)
...
@@ -88,10 +126,13 @@ void serial_console_init(uint32_t baudrate)
UCSR1C
=
0
b00000110
;
UCSR1C
=
0
b00000110
;
// initialize
// initialize
UDR1
=
0xFF
;
serial_console_rx_read_ptr
=
0
;
serial_console_read_ptr
=
0
;
serial_console_rx_write_ptr
=
0
;
serial_console_write_ptr
=
0
;
serial_console_rx_num_data
=
0
;
serial_console_num_data
=
0
;
serial_console_tx_read_ptr
=
0
;
serial_console_tx_write_ptr
=
0
;
serial_console_tx_num_data
=
0
;
serial_console_sending
=
0x00
;
// set baudrate
// set baudrate
serial_console_set_baudrate
(
baudrate
);
serial_console_set_baudrate
(
baudrate
);
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment