LpcUart: [#22] This could have worked.

* It appears that LPC11u68 has ony USART0 redirected to USB as debug UART.
* The code here was written only for USART1-4.
This commit is contained in:
RedHawk 2023-05-05 19:31:30 +03:00
parent 620439fff4
commit 13e392f37b
5 changed files with 124 additions and 6 deletions

View File

@ -6,12 +6,17 @@
#include "ThreadCommon.h"
#include "Master.h"
#include "Rotary.h"
#include "retarget_uart.h"
int main(void)
{
SystemCoreClockUpdate();
Board_Init();
retarget_init();
printf("Hello there!\r\n");
ThreadCommon::ThreadManager* manager = new ThreadCommon::ThreadManager;
ThreadCommon::QueueManager* qmanager = new ThreadCommon::QueueManager;
//Creating queues

View File

@ -13,6 +13,10 @@
* We don't have movable pins -> not needed.
*
* Muxing is like this:
* Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 14, (IOCON_FUNC4 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
* Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 13, (IOCON_FUNC4 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
*
* USART0 (the only debug uart):
* Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 18, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
* Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 19, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
*/
@ -90,7 +94,7 @@ LpcUart::LpcUart(const LpcUartConfig &cfg) {
* UARTs.
* */
/* Use main clock rate as base for UART baud rate divider */
Chip_Clock_SetUSARTNBaseClockRate(Chip_Clock_GetMainClockRate(), false);
Chip_Clock_SetUSARTNBaseClockRate(Chip_Clock_GetMainClockRate(), false); //(115200 * 256), false);
}
uart = nullptr; // set default value before checking which UART to configure
@ -123,19 +127,19 @@ LpcUart::LpcUart(const LpcUartConfig &cfg) {
if(cfg.tx.port >= 0) {
Chip_IOCON_PinMuxSet(LPC_IOCON, cfg.tx.port, cfg.tx.pin, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
Chip_IOCON_PinMuxSet(LPC_IOCON, cfg.tx.port, cfg.tx.pin, (IOCON_FUNC4 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
}
if(cfg.rx.port >= 0) {
Chip_IOCON_PinMuxSet(LPC_IOCON, cfg.rx.port, cfg.rx.pin, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
Chip_IOCON_PinMuxSet(LPC_IOCON, cfg.rx.port, cfg.rx.pin, (IOCON_FUNC4 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
}
if(use_cts) {
Chip_IOCON_PinMuxSet(LPC_IOCON, cfg.cts.port, cfg.cts.pin, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
Chip_IOCON_PinMuxSet(LPC_IOCON, cfg.cts.port, cfg.cts.pin, (IOCON_FUNC4 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
}
if(use_rts) {
Chip_IOCON_PinMuxSet(LPC_IOCON, cfg.rts.port, cfg.rts.pin, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
Chip_IOCON_PinMuxSet(LPC_IOCON, cfg.rts.port, cfg.rts.pin, (IOCON_FUNC4 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
}
notify_rx = nullptr;

View File

@ -0,0 +1,91 @@
/*
* retarget_uart.cpp
*
* Created on: 28.9.2021
* Author: keijo
*/
#include "LpcUart.h"
static LpcUart *dbgu;
void retarget_init()
{
LpcPinMap none = {-1, -1}; // unused pin has negative values in it
//Sadly, it seems that only USART0 is redirected to USB.
//It means that those are pins PIO0_18 and PIO0_19
LpcPinMap txpin = { 0, 14 }; // transmit pin that goes to debugger's UART->USB converter
LpcPinMap rxpin = { 0, 13 }; // receive pin that goes to debugger's UART->USB converter
LpcUartConfig cfg = { LPC_USART1, 115200, UARTN_CFG_DATALEN_8 | UARTN_CFG_PARITY_NONE | UARTN_CFG_STOPLEN_1, false, txpin, rxpin, none, none };
dbgu = new LpcUart(cfg);
}
extern "C" {
// ******************************************************************
// Redlib C Library function : __sys_write
// Newlib C library function : _write
//
// Function called by bottom level of printf routine within C library.
// With the default semihosting stub, this would write the
// character(s) to the debugger console window (which acts as
// stdout). But this version writes the character(s) to UART
// ******************************************************************
#if defined (__REDLIB__)
int __sys_write(int iFileHandle, char *pcBuffer, int iLength) {
#elif defined (__NEWLIB__)
int _write(int iFileHandle, char *pcBuffer, int iLength) {
#endif
if(dbgu) {
int len = iLength;
while(len > 0) {
if(*pcBuffer == '\n') { // send a CR before every LF
while(dbgu->write('\r')==0);
}
while(dbgu->write(*pcBuffer)==0);
++pcBuffer;
--len;
}
}
// Function returns number of bytes written
return iLength;
}
#if defined (__REDLIB__)
// ******************************************************************
// Redlib C Library function : __sys_readc
//
// Called by bottom level of scanf routine within RedLib C library
// to read a character. With the default semihosting stub, this
// would read the character from the debugger console window (which
// acts as stdin). But this version reads the character from UART
// ******************************************************************
int __sys_readc(void) {
char c;
if(dbgu && dbgu->read(c)) return c;
else return -1;
}
// #endif REDLIB __sys_readc()
#elif defined (__NEWLIB__)
// ******************************************************************
// Function _read
//
// Called by bottom level of scanf routine within Newlib C library
// to read multiple characters. With the default semihosting stub, this
// would read characters from the debugger console window (which
// acts as stdin). But this version reads the characters from UART
// ******************************************************************
int _read(int iFileHandle, char *pcBuffer, int iLength) {
// TODO : Should potentially check that iFileHandle == 0 to confirm
// that read is from stdin
if(!dbgu) return 0;
return dbgu->read(pcBuffer, iLength);
}
#endif // NEWLIB _read()
}

View File

@ -0,0 +1,14 @@
/*
* retarget_uart.h
*
* Created on: 28.9.2021
* Author: keijo
*/
#ifndef RETARGET_UART_H_
#define RETARGET_UART_H_
void retarget_init();
#endif /* RETARGET_UART_H_ */

View File

@ -21,15 +21,19 @@ void Master::taskFunction() {
{
case ThreadCommon::RotaryAction::Right:
Board_LED_Set(ThreadCommon::RotaryAction::Right, LedState);
printf("Right\r\n");
break;
case ThreadCommon::RotaryAction::Left:
Board_LED_Set(ThreadCommon::RotaryAction::Left, LedState);
printf("Left\r\n");
break;
case ThreadCommon::RotaryAction::Press:
Board_LED_Set(ThreadCommon::RotaryAction::Press, LedState);
printf("Press\r\n");
break;
case ThreadCommon::RotaryAction::Idle:
Board_LED_Set(ThreadCommon::RotaryAction::Right, LedState);
printf("Idle\r\n");
break;
}
LedState = !LedState;