2021-07-01 14:34:34 +02:00

149 lines
3.8 KiB
Plaintext

#include "chip.h"
#include "string.h"
#define DE 26
#define RX 27
#define TX 16
#define UART_RB_SIZE 64
#define LPC_USART LPC_USART1
#define LPC_IRQNUM UART1_IRQn
#define LPC_UARTHNDLR UART1_IRQHandler
#define UART_BAUDRATE 19200
STATIC RINGBUFF_T txring, rxring;
static uint8_t rxbuff[UART_RB_SIZE], txbuff[UART_RB_SIZE];
const char inst1[] = "Blocking Test\n";
const char inst2[] = "NonBlocking Test\n";
static void delay(uint32_t cntr) {
/* very simply delay routine */
while(cntr>0) { /* burn some cycles */
cntr--;
__asm volatile("nop\n");
}
}
static void Init_UART_PinMux(void)
{
Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);
Chip_Clock_SetUARTClockDiv(1);
Chip_SWM_MovablePinAssign(SWM_U1_TXD_O, TX); //U1 = uart1, options: 0,1,2 for LPC824
Chip_SWM_MovablePinAssign(SWM_U1_RXD_I, RX);
Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);
Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 0, DE);
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, DE, false);
}
static void UART_Init(void){
Init_UART_PinMux();
Chip_UART_Init(LPC_USART);
Chip_UART_ConfigData(LPC_USART, UART_CFG_DATALEN_8 | UART_CFG_PARITY_NONE | UART_CFG_STOPLEN_1);
Chip_Clock_SetUSARTNBaseClockRate((UART_BAUDRATE * 16), true);
Chip_UART_SetBaud(LPC_USART, UART_BAUDRATE);
Chip_UART_Enable(LPC_USART);
Chip_UART_TXEnable(LPC_USART);
RingBuffer_Init(&rxring, rxbuff, 1, UART_RB_SIZE);
RingBuffer_Init(&txring, txbuff, 1, UART_RB_SIZE);
Chip_UART_IntEnable(LPC_USART, UART_INTEN_RXRDY);
Chip_UART_IntDisable(LPC_USART, UART_INTEN_TXRDY);
NVIC_EnableIRQ(LPC_IRQNUM);
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, DE, true);
Chip_UART_SendBlocking(LPC_USART, inst1, sizeof(inst1));
Chip_UART_SendRB(LPC_USART, &txring, inst2, sizeof(inst2));
delay(0x800);
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, DE, false);
}
void LPC_UARTHNDLR(void)
{
/* Want to handle any errors? Do it here. */
/* Use default ring buffer handler. Override this with your own
code if you need more capability. */
Chip_UART_IRQRBHandler(LPC_USART, &rxring, &txring);
}
void dbg(unsigned long n){//16.7
char operator = '+';
if(n > 4294967296/2){
n = 4294967296 - n;
operator = '-';
}
char tmp[11];
int i = sizeof(tmp);
for(int j = 0; j<i-1; j++){
tmp[j] = '0';
}
do
{
tmp[--i] = '0' + n % 10;
n /= 10;
} while (n);
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, DE, true);
Chip_UART_SendBlocking(LPC_USART, &operator, 1);
Chip_UART_SendBlocking(LPC_USART, &tmp, sizeof(tmp));
delay(0x800);
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, DE, false);
}
void dbg_nl(){
Chip_UART_SendBlocking(DBG_USART, &"\n", 1);
}
uint8_t intToAscii(uint8_t number){
if(number > 9){
return number + 55;
}
else{
return number + 48;
}
}
void dbg_ASCII(uint8_t *arr, int size){ //array charu nebo char a prevede to na ascii, mysleno hlavne pro HEX
for(int i = 0; i<size; i++){
uint8_t lo,hi;
lo = arr[i] & 0x0f;
hi = (arr[i] >> 4) & 0x0f;
hi = intToAscii(hi);
lo = intToAscii(lo);
Chip_UART_SendBlocking(DBG_USART, &hi, 1);
Chip_UART_SendBlocking(DBG_USART, &lo, 1);
Chip_UART_SendBlocking(DBG_USART, &" ", 1);
}
dbg_nl();
}
int main(void) {
SystemCoreClockUpdate();
UART_Init();
while(1) {
uint8_t byte;
uint8_t rec[UART_RB_SIZE];
if(RingBuffer_IsEmpty(&rxring) != 1){
for(int i = 0; i<sizeof(rxring); i++){
Chip_UART_ReadRB(LPC_USART, &rxring, &byte, 1);
rec[i] = byte;
delay(0x10);
}
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, DE, true);
Chip_UART_SendBlocking(LPC_USART, &rec, sizeof(rec));
delay(0x800);
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, DE, false);
RingBuffer_Flush(&rxring); //Flush must be after sending response for @Creys hardware coz RE is enabled nonstop = sent msg is received
}
}
return 0 ;
}