Merge pull request #32 from vas-dav/periph-lcd

Periph lcd
This commit is contained in:
RedHawk 2023-05-07 17:44:27 +03:00 committed by GitHub
commit a5c28afd61
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 103 additions and 38 deletions

View File

@ -7,6 +7,9 @@
#include "Master.h" #include "Master.h"
#include "Rotary.h" #include "Rotary.h"
#include "retarget_uart.h" #include "retarget_uart.h"
#include "LiquidCrystal.h"
void lcd_starting();
int main(void) int main(void)
{ {
@ -17,6 +20,8 @@ int main(void)
printf("Hello there!\r\n"); printf("Hello there!\r\n");
lcd_starting();
ThreadCommon::ThreadManager* manager = new ThreadCommon::ThreadManager; ThreadCommon::ThreadManager* manager = new ThreadCommon::ThreadManager;
ThreadCommon::QueueManager* qmanager = new ThreadCommon::QueueManager; ThreadCommon::QueueManager* qmanager = new ThreadCommon::QueueManager;
//Creating queues //Creating queues
@ -36,3 +41,44 @@ int main(void)
return 1; return 1;
} }
/**
* @brief While we don't have UI, this should do for LCD.
*
*/
void lcd_starting() {
// LCD pins init.
//Well, this lpc is a bit different with those. Table 83 from UM10732-11u68.pdf
DigitalIoPin *rs = new DigitalIoPin(1, 9, false);
Chip_IOCON_PinMuxSet (LPC_IOCON, 1, 9, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
DigitalIoPin *en = new DigitalIoPin(0, 14, false);
Chip_IOCON_PinMuxSet (LPC_IOCON, 0, 14, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
DigitalIoPin *d4 = new DigitalIoPin(0, 13, false);
Chip_IOCON_PinMuxSet (LPC_IOCON, 0, 13, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
DigitalIoPin *d5 = new DigitalIoPin(0, 12, false);
Chip_IOCON_PinMuxSet (LPC_IOCON, 0, 12, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
DigitalIoPin *d6 = new DigitalIoPin(0, 23, false);
Chip_IOCON_PinMuxSet (LPC_IOCON, 0, 23, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
DigitalIoPin *d7 = new DigitalIoPin(0, 11, false);
Chip_IOCON_PinMuxSet (LPC_IOCON, 0, 11, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
rs->write(false);
en->write(false);
d4->write(false);
d5->write(false);
d6->write(false);
d7->write(false);
// LCD init.
LiquidCrystal *lcd = new LiquidCrystal(rs, en, d4, d5, d6, d7);
// LCD configure display geometry.
lcd->begin(16, 2);
lcd->setCursor (0, 0);
lcd->print("Hello there");
lcd->setCursor (0, 1);
lcd->print("Starting...");
}

View File

@ -1,39 +1,71 @@
#include "LiquidCrystal.h" #include "LiquidCrystal.h"
// Remove this when code will be reworked.
#ifndef LiquidCrystal_NOT_FIXED
// Remove this when code will be reworked.
#include <cstring> #include <cstring>
#include "chip.h" #include "chip.h"
#include "board.h"
#define LOW 0 #define LOW 0
#define HIGH 1 #define HIGH 1
#define MHz1 1000000
static bool match_flag = false;
extern "C" {
/**
* @brief Handle interrupt from 32-bit timer 0
* Sets match_flag to true when the match occurs.
* @return Nothing
*/
void TIMER32_0_IRQHandler(void)
{
if(Chip_TIMER_MatchPending(LPC_TIMER32_0, 0)) {
Chip_TIMER_ClearMatch(LPC_TIMER32_0, 0);
match_flag = true;
}
}
}
#if 0
void delayMicroseconds(unsigned int us) void delayMicroseconds(unsigned int us)
{ {
// implement with RIT /* Reset match flag */
} match_flag = false;
#else
void delayMicroseconds(uint32_t delay)
{
static int init;
if(!init) {
// start core clock counter
CoreDebug->DEMCR |= 1 << 24;
DWT->CTRL |= 1;
init = 1;
}
uint32_t start = DWT->CYCCNT; /* Initialize 32-bit timer 0 clock */
delay = delay * 72; // assuming 72MHz clock Chip_TIMER_Init(LPC_TIMER32_0);
while(DWT->CYCCNT - start < delay);
}
#endif /* Timer setup for match and interrupt at TICKRATE_HZ */
Chip_TIMER_Reset(LPC_TIMER32_0);
/* Enable timer to generate interrupt when time matches */
Chip_TIMER_MatchEnableInt(LPC_TIMER32_0, 0);
/* Setup 32-bit timer's duration (32-bit match time) */
/* Once_per_microsecond * number_of_microseconds. */
Chip_TIMER_SetMatch(LPC_TIMER32_0, 0, (Chip_Clock_GetSystemClockRate() / MHz1 * us));
/* Setup timer to stop when match occurs */
Chip_TIMER_StopOnMatchEnable(LPC_TIMER32_0, 0);
/* Start timer */
Chip_TIMER_Enable(LPC_TIMER32_0);
/* Clear timer of any pending interrupts */
NVIC_ClearPendingIRQ(TIMER_32_0_IRQn);
/* Enable timer interrupt */
NVIC_EnableIRQ(TIMER_32_0_IRQn);
/* Wait for the interrupt to trigger */
while(!match_flag);
/*Disable the interrupt*/
Chip_TIMER_MatchDisableInt(LPC_TIMER32_0, 0);
/* Disable timer */
Chip_TIMER_Disable(LPC_TIMER32_0);
/* Deinitialise timer. */
Chip_TIMER_DeInit(LPC_TIMER32_0);
}
// When the display powers up, it is configured as follows: // When the display powers up, it is configured as follows:
// //
@ -291,7 +323,3 @@ void LiquidCrystal::write4bits(uint8_t value) {
pulseEnable(); pulseEnable();
} }
// Remove this when code will be reworked.
#endif /* LiquidCrystal_NOT_FIXED */
// Remove this when code will be reworked.

View File

@ -1,11 +1,6 @@
#ifndef LiquidCrystal_h #ifndef LiquidCrystal_h
#define LiquidCrystal_h #define LiquidCrystal_h
// Remove this when code will be reworked.
#define LiquidCrystal_NOT_FIXED
#ifndef LiquidCrystal_NOT_FIXED
// Remove this when code will be reworked.
#include <cstddef> #include <cstddef>
#include <string> #include <string>
#include "chip.h" #include "chip.h"
@ -98,8 +93,4 @@ private:
uint8_t _numlines,_currline; uint8_t _numlines,_currline;
}; };
// Remove this when code will be reworked.
#endif /* LiquidCrystal_NOT_FIXED */
// Remove this when code will be reworked.
#endif /* LiquidCrystal_h */ #endif /* LiquidCrystal_h */