Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
7e5be0b1
Commit
7e5be0b1
authored
Apr 14, 2014
by
Damien George
Browse files
stmhal: Improved usart module a bit.
parent
6dba016a
Changes
2
Hide whitespace changes
Inline
Side-by-side
stmhal/usart.c
View file @
7e5be0b1
...
...
@@ -19,7 +19,7 @@ struct _pyb_usart_obj_t {
pyb_usart_obj_t
*
pyb_usart_global_debug
=
NULL
;
void
usart_init
(
pyb_usart_obj_t
*
usart_obj
,
uint32_t
baudrate
)
{
bool
usart_init
(
pyb_usart_obj_t
*
usart_obj
,
uint32_t
baudrate
)
{
USART_TypeDef
*
USARTx
=
NULL
;
uint32_t
GPIO_Pin
=
0
;
...
...
@@ -27,50 +27,74 @@ void usart_init(pyb_usart_obj_t *usart_obj, uint32_t baudrate) {
GPIO_TypeDef
*
GPIO_Port
=
NULL
;
switch
(
usart_obj
->
usart_id
)
{
case
PYB_USART_NONE
:
return
;
// USART1 is on PA9/PA10, PB6/PB7
case
PYB_USART_1
:
USARTx
=
USART1
;
GPIO_AF_USARTx
=
GPIO_AF7_USART1
;
#if defined(PYBV10)
GPIO_Port
=
GPIOB
;
GPIO_Pin
=
GPIO_PIN_6
|
GPIO_PIN_7
;
#else
GPIO_Port
=
GPIOA
;
GPIO_AF_USARTx
=
GPIO_AF7_USART1
;
GPIO_Pin
=
GPIO_PIN_9
|
GPIO_PIN_10
;
#endif
__USART1_CLK_ENABLE
();
break
;
#if !defined(PYBV10)
// USART2 is on PA2/PA3, PD5/PD6
case
PYB_USART_2
:
USARTx
=
USART2
;
GPIO_AF_USARTx
=
GPIO_AF7_USART2
;
GPIO_Port
=
GPIOD
;
GPIO_AF_USARTx
=
GPIO_AF7_USART2
;
GPIO_Pin
=
GPIO_PIN_5
|
GPIO_PIN_6
;
__USART2_CLK_ENABLE
();
break
;
#endif
// USART3 is on PB10/PB11, PC10/PC11, PD8/PD9
case
PYB_USART_3
:
USARTx
=
USART3
;
GPIO_AF_USARTx
=
GPIO_AF7_USART3
;
#if defined(PYBV3) || defined(PYBV4)
#if defined(PYBV3) || defined(PYBV4)
| defined(PYBV10)
GPIO_Port
=
GPIOB
;
GPIO_AF_USARTx
=
GPIO_AF7_USART3
;
GPIO_Pin
=
GPIO_PIN_10
|
GPIO_PIN_11
;
#else
GPIO_Port
=
GPIOD
;
GPIO_AF_USARTx
=
GPIO_AF7_USART3
;
GPIO_Pin
=
GPIO_PIN_8
|
GPIO_PIN_9
;
#endif
__USART3_CLK_ENABLE
();
break
;
// USART4 is on PA0/PA1, PC10/PC11
case
PYB_USART_4
:
USARTx
=
UART4
;
GPIO_AF_USARTx
=
GPIO_AF8_UART4
;
GPIO_Port
=
GPIOA
;
GPIO_Pin
=
GPIO_PIN_0
|
GPIO_PIN_1
;
__UART4_CLK_ENABLE
();
break
;
// USART6 is on PC6/PC7
case
PYB_USART_6
:
USARTx
=
USART6
;
GPIO_AF_USARTx
=
GPIO_AF8_USART6
;
GPIO_Port
=
GPIOC
;
GPIO_AF_USARTx
=
GPIO_AF8_USART6
;
GPIO_Pin
=
GPIO_PIN_6
|
GPIO_PIN_7
;
__USART6_CLK_ENABLE
();
break
;
default:
return
false
;
}
// Initialize USARTx
...
...
@@ -94,6 +118,8 @@ void usart_init(pyb_usart_obj_t *usart_obj, uint32_t baudrate) {
uh
->
Init
.
HwFlowCtl
=
UART_HWCONTROL_NONE
;
uh
->
Init
.
OverSampling
=
UART_OVERSAMPLING_16
;
HAL_UART_Init
(
uh
);
return
true
;
}
bool
usart_rx_any
(
pyb_usart_obj_t
*
usart_obj
)
{
...
...
@@ -148,17 +174,35 @@ STATIC mp_obj_t usart_obj_make_new(mp_obj_t type_in, uint n_args, uint n_kw, con
nlr_raise
(
mp_obj_new_exception_msg
(
&
mp_type_ValueError
,
"Usart accepts 2 arguments"
));
}
if
(
mp_obj_get_int
(
args
[
0
])
>
PYB_USART_MAX
)
{
return
mp_const_none
;
}
// create object
pyb_usart_obj_t
*
o
=
m_new_obj
(
pyb_usart_obj_t
);
o
->
base
.
type
=
&
pyb_usart_type
;
o
->
usart_id
=
mp_obj_get_int
(
args
[
0
]);
o
->
is_enabled
=
true
;
/* init USART */
usart_init
(
o
,
mp_obj_get_int
(
args
[
1
]));
// work out port
o
->
usart_id
=
0
;
if
(
MP_OBJ_IS_STR
(
args
[
0
]))
{
const
char
*
port
=
mp_obj_str_get_str
(
args
[
0
]);
if
(
strcmp
(
port
,
"XA"
)
==
0
)
{
o
->
usart_id
=
PYB_USART_XA
;
}
else
if
(
strcmp
(
port
,
"XB"
)
==
0
)
{
o
->
usart_id
=
PYB_USART_XB
;
}
else
if
(
strcmp
(
port
,
"YA"
)
==
0
)
{
o
->
usart_id
=
PYB_USART_YA
;
}
else
if
(
strcmp
(
port
,
"YB"
)
==
0
)
{
o
->
usart_id
=
PYB_USART_YB
;
}
else
{
nlr_raise
(
mp_obj_new_exception_msg_varg
(
&
mp_type_ValueError
,
"Usart port %s does not exist"
,
port
));
}
}
else
if
(
MP_OBJ_IS_INT
(
args
[
0
]))
{
o
->
usart_id
=
mp_obj_get_int
(
args
[
0
]);
}
// init USART (if it fails, it's because the port doesn't exist)
if
(
!
usart_init
(
o
,
mp_obj_get_int
(
args
[
1
])))
{
nlr_raise
(
mp_obj_new_exception_msg_varg
(
&
mp_type_ValueError
,
"Usart port %d does not exist"
,
o
->
usart_id
));
}
o
->
is_enabled
=
true
;
return
o
;
}
...
...
stmhal/usart.h
View file @
7e5be0b1
...
...
@@ -3,13 +3,17 @@ typedef enum {
PYB_USART_1
=
1
,
PYB_USART_2
=
2
,
PYB_USART_3
=
3
,
PYB_USART_6
=
4
,
PYB_USART_MAX
=
4
,
PYB_USART_4
=
4
,
PYB_USART_5
=
5
,
PYB_USART_6
=
6
,
//PYB_USART_XA = // USART4 on X1, X2 = PA0, PA1
#if defined(PYBV10)
PYB_USART_XA
=
4
,
// USART4 on X1, X2 = PA0, PA1
PYB_USART_XB
=
1
,
// USART1 on X9, X10 = PB6, PB7
PYB_USART_YA
=
4
,
// USART6 on Y1, Y2 = PC6, PC7
PYB_USART_YA
=
6
,
// USART6 on Y1, Y2 = PC6, PC7
PYB_USART_YB
=
3
,
// USART3 on Y9, Y10 = PB10, PB11
#endif
}
pyb_usart_t
;
typedef
struct
_pyb_usart_obj_t
pyb_usart_obj_t
;
...
...
@@ -17,7 +21,7 @@ typedef struct _pyb_usart_obj_t pyb_usart_obj_t;
extern
pyb_usart_obj_t
*
pyb_usart_global_debug
;
extern
const
mp_obj_type_t
pyb_usart_type
;
void
usart_init
(
pyb_usart_obj_t
*
usart_obj
,
uint32_t
baudrate
);
bool
usart_init
(
pyb_usart_obj_t
*
usart_obj
,
uint32_t
baudrate
);
bool
usart_rx_any
(
pyb_usart_obj_t
*
usart_obj
);
int
usart_rx_char
(
pyb_usart_obj_t
*
usart_obj
);
void
usart_tx_str
(
pyb_usart_obj_t
*
usart_obj
,
const
char
*
str
);
...
...
Write
Preview
Supports
Markdown
0%
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!
Cancel
Please
register
or
sign in
to comment