Skip to content
Snippets Groups Projects
Commit 6e12d2aa authored by dwf1m12's avatar dwf1m12
Browse files

testbench and code updated for 38K4 UART2 @240MHz

parent e74aa0b1
No related branches found
No related tags found
No related merge requests found
......@@ -35,7 +35,7 @@
Define clocks
*----------------------------------------------------------------------------*/
#define XTAL (100000000UL) /* Oscillator frequency */
#define XTAL (240000000UL) /* Oscillator frequency 240MHz */
/*----------------------------------------------------------------------------
......
......@@ -54,23 +54,26 @@
void UartStdOutInit(void)
{
// CMSDK_UART2->BAUDDIV = 16;
// CMSDK_UART2->CTRL = 0x41; // High speed test mode, TX only
CMSDK_UART2->BAUDDIV = 2080; //(20MHz/9600)
CMSDK_UART2->CTRL = 0x01; //TX only, standard UART
CMSDK_USRT2->CTRL = 0x01; //TX only, FT1248 USRT
CMSDK_UART2->CTRL = 0x00; // re-init
CMSDK_UART2->BAUDDIV = 6250; //(240MHz/384000) in 16.4 format
CMSDK_UART2->CTRL = 0x01; //TX, UART2
CMSDK_USRT2->CTRL = 0x00; //re-init
CMSDK_USRT2->CTRL = 0x03; //RX+TX, FT1248 USRT
CMSDK_GPIO1->ALTFUNCSET = (1<<5);
if ((CMSDK_USRT2->STATE & 1)==0) CMSDK_USRT2->DATA = 0x23; // write 8'b01000011 / "#"
if ((CMSDK_UART2->STATE & 1)==0) CMSDK_UART2->DATA = 0x7e; // write 8'b01111110 / "~"
return;
}
// Output a character
unsigned char UartPutc(unsigned char my_ch)
{
/// while ((CMSDK_UART2->STATE & 1)); // Wait if Transmit Holding register is full
/// CMSDK_UART2->DATA = my_ch; // write to transmit holding register
/// if ((CMSDK_USRT2->STATE & 1) == 0)
while ((CMSDK_USRT2->STATE & 1)); // Wait if Transmit Holding register is full
if ((CMSDK_USRT2->STATE & 1) == 0)
CMSDK_USRT2->DATA = my_ch; // write to transmit holding register
// while ((CMSDK_UART2->STATE & 1)); // Wait if Transmit Holding register is full
// CMSDK_UART2->DATA = my_ch; // write to transmit holding register
// return (my_ch);
while (((CMSDK_USRT2->STATE & 1)==1) && ((CMSDK_UART2->STATE & 1)==1)); // Wait if both Transmit Holding registers full
if ((CMSDK_USRT2->STATE & 1)==0) CMSDK_USRT2->DATA = my_ch; // write to transmit holding register
if ((CMSDK_UART2->STATE & 1)==0) CMSDK_UART2->DATA = my_ch; // write to transmit holding register
return (my_ch);
}
// Uart string output
......@@ -118,11 +121,11 @@ void FlashLoader(void)
Likely that the user is trying to run bootloader as a test,
which is not what this program is for.
*/
UartPuts("@Error: REMAP cleared\n");
UartPuts("!REMAP!\n");
UartPutc(0x4); // Terminate simulation
while (1);
}
UartPuts("** Remap->IMEM0\n"); // CMSDK boot loader\n");
UartPuts("REMAP->IMEM0\n"); // CMSDK boot loader\n");
CMSDK_SYSCON->REMAP = 0; // Clear remap
__DSB();
__ISB();
......@@ -135,7 +138,8 @@ int main (void)
// UART init
UartStdOutInit();
UartPuts("\n\n\nSoCLabs NanoSoC\n");
UartPuts("\nSoCLabs NanoSoC ARM-CM0+ADP+FT1+U38400 20240110\n");
// UartPuts("\nSoCLabs NanoSoC\n");
FlashLoader();
return 0;
}
......
......@@ -43,31 +43,64 @@
#include "CMSDK_CM4.h"
#endif
#define CLKFREQ 240000000
#define BAUDRATE 38400
#define BAUDCLKDIV (CLKFREQ / BAUDRATE)
void UartStdOutInit(void)
{
// CMSDK_UART2->BAUDDIV = 16;
// CMSDK_UART2->CTRL = 0x41; // High speed test mode, TX only
CMSDK_UART2->BAUDDIV = 2080; //(1MHz/9600)
CMSDK_UART2->CTRL = 0x01; //TX only, standard UART
CMSDK_USRT2->BAUDDIV = 2080; //(1MHz/9600)
CMSDK_USRT2->CTRL = 0x03; //RX+TX, standard UART
CMSDK_GPIO1->ALTFUNCSET = (1<<5);
CMSDK_UART2->CTRL = 0x00; // disable whie reprogramming
CMSDK_UART2->BAUDDIV = BAUDCLKDIV; // (240MHz/BAUDRATE) in 16.4 format
CMSDK_UART2->CTRL = 0x01; // TX, standard UART2
CMSDK_USRT2->BAUDDIV = 3; // (prescaler value)
CMSDK_USRT2->CTRL = 0x03; // RX+TX, FT1248 USRT
CMSDK_GPIO1->ALTFUNCSET = (1<<5); // UART2 mapped to GP1[5,4]
return;
}
void Uart2StdOutInit(void)
{
// ensure full character shift before reprogramming UART2
CMSDK_DUALTIMER->Timer1Load = (11 * BAUDCLKDIV); // 10+1 x baud tick clock
CMSDK_DUALTIMER->Timer1BGLoad = (10 * BAUDCLKDIV); // 10 x baud tick clock
CMSDK_DUALTIMER->Timer1IntClr = 1;
CMSDK_DUALTIMER->Timer1Control = 0xC3; // enable, periodic, 32-bit
while ((CMSDK_DUALTIMER->Timer1RIS & 1)== 0) ; // wait until any UART character time
// reinitialize UART2
/// CMSDK_UART2->CTRL = 0x00; // disable whie reprogramming
/// CMSDK_UART2->BAUDDIV = BAUDCLKDIV; // (240MHz/BAUDRATE) in 16.4 format
/// CMSDK_UART2->CTRL = 0x01; // RX+TX, standard UART2
CMSDK_GPIO1->ALTFUNCSET = (1<<5); // UART2 mapped to GP1[5,4]
CMSDK_USRT2->CTRL = 0x00; // RX+TX, FT1248 USRT disabled
CMSDK_USRT2->BAUDDIV = 0x30; // (prescaler low value)
CMSDK_USRT2->CTRL = 0x03; // RX+TX, FT1248 USRT disabled
return;
}
// Output a character
unsigned char UartPutc(unsigned char my_ch)
{
// while ((CMSDK_UART2->STATE & 1)); // Wait if Transmit Holding register is full
// CMSDK_UART2->DATA = my_ch; // write to transmit holding register
while ((CMSDK_USRT2->STATE & 1)); // Wait if Transmit Holding register is full
CMSDK_USRT2->DATA = my_ch; // write to transmit holding register
if ((CMSDK_USRT2->CTRL & 1)==0) {
while (CMSDK_UART2->STATE & 1); // Wait if Transmit Holding register full
CMSDK_UART2->DATA = my_ch; // write to transmit holding register
CMSDK_USRT2->DATA = my_ch; // (also write to transmit holding register)
} else {
while (CMSDK_USRT2->STATE & 1); // Wait if Transmit Holding register full
CMSDK_USRT2->DATA = my_ch; // write to transmit holding register
}
return (my_ch);
}
// Get a character
unsigned char UartGetc(void)
{
while ((CMSDK_USRT2->STATE & 2)==0); // Wait if Receive Holding register is empty
return (CMSDK_USRT2->DATA);
if ((CMSDK_USRT2->CTRL & 1)==0) {
while ((CMSDK_UART2->STATE & 2)==0);
return (CMSDK_UART2->DATA);
} else {
while ((CMSDK_USRT2->STATE & 2)==0);
return (CMSDK_USRT2->DATA);
}
}
void UartEndSimulation(void)
......
......@@ -25,6 +25,7 @@
/* The functions are implemented in shared/software/common/uart_stdout.c */
extern void UartStdOutInit(void);
extern void Uart2StdOutInit(void);
extern unsigned char UartPutc(unsigned char my_ch);
extern unsigned char UartGetc(void);
extern unsigned char UartEndSimulation(void);
......@@ -229,20 +229,20 @@ initial begin
// seem unable to use the following (due to generate instance naming?)
// wire baudx16_clk = u_cmsdk_mcu.u_cmsdk_mcu.u_cmsdk_mcu_system.u_apb_subsystem.u_apb_uart_2.BAUDTICK;
// 2000000/208 = 9615 baud (+0.16%)
// 208 / 16
`define BAUDPROG 130
// 240000000/6250 = 38400 baud
// 6250/16 = 390.625
`define BAUDPROGDIV16 389
reg [7:0] bauddiv;
wire baudclken = (bauddiv == 8'b00000000);
reg [8:0] bauddiv;
wire baudclken = (bauddiv == 9'b0);
always @(negedge NRST or posedge PCLK)
if (!NRST)
bauddiv <=0;
else
bauddiv <= (baudclken) ? (`BAUDPROG-1) : (bauddiv -1) ; // count down of BAUDPROG
bauddiv <= (baudclken) ? (`BAUDPROGDIV16-1) : (bauddiv -1) ; // count down of BAUDPROG
wire baudx16_clk = bauddiv[7]; //prefer:// !baudclken;
wire baudx16_clk = bauddiv[8]; //prefer:// !baudclken;
wire UARTXD = P1[5];
reg UARTXD_del;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment