diff --git a/README.md b/README.md index ec47c73..ab7a6d0 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,6 @@ If you find a bug you can submit an issue here on Renesas site: http://www.renesas.com/contact # Notes -* This repository is a technical preview version. * This repository contains the source code and configuration files of the Arduino RL78/G22 Fast Prototyping Board platform. # More information diff --git a/cores/rl78g22/HardwareUart.cpp b/cores/rl78g22/HardwareUart.cpp index 2f1f607..c01b739 100644 --- a/cores/rl78g22/HardwareUart.cpp +++ b/cores/rl78g22/HardwareUart.cpp @@ -55,7 +55,7 @@ extern "C" { #include "Config_UART0.h" #endif /* ( UART_CHANNEL == 0 ) */ #if ( UART1_CHANNEL == 1 ) - #include "Config_UART1.h" + #include "Config_UART1.h" #endif /* ( UART1_CHANNEL == 1 ) */ #if ( UART2_CHANNEL == 2 ) #include "Config_UART2.h" @@ -369,42 +369,6 @@ fInterruptFunc_t uart_transmit_callback_table[3] __attribute__((weak)); // Constructors //////////////////////////////////////////////////////////////// -/********************************************************************************************************************** - * Function Name: HardwareUart::HardwareUart - * Description : Constructor - * Arguments : ubrrh - (Not Used) - * : ubrrl - (Not Used) - * : ucsra - (Not Used) - * : ucsrb - (Not Used) - * : ucsrc - (Not Used) - * : udr - (Not Used) - * : rxen - UART channel - * : txen - (Not Used) - * : rxcie - (Not Used) - * : udrie - (Not Used) - * : u2x - (Not Used) - * Return Value : void - *********************************************************************************************************************/ -HardwareUart::HardwareUart( - volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, - volatile uint8_t *ucsra, volatile uint8_t *ucsrb, - volatile uint8_t *ucsrc, volatile uint8_t *udr, - uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x) -{ - _urt_channel = rxen; - _rx_buffer_head = 0; - _rx_buffer_tail = 0; - _tx_buffer_head = 0; - _tx_buffer_tail = 0; - _rx_buf_size = 0; - _tx_buf_size = 0; - _rx_buffer = 0; - _tx_buffer = 0; - transmitting = 0; - receive_buffer = 0; -} - - /********************************************************************************************************************** * Function Name: HardwareUart::HardwareUart * Description : Constructor @@ -522,12 +486,12 @@ void HardwareUart::begin(unsigned long baud, uint16_t config, int rx_buf, int tx break; case 1: #if (UART1_CHANNEL==1) - R_Config_UART1_Create(); - Set_Baudrate(baud); - Set_SerialPort(SERIAL_TXD1,SERIAL_RXD1); - Set_Config(config); - R_Config_UART1_Start(); - R_Config_UART1_Receive((uint8_t * const)&receive_buffer,1); + R_Config_UART1_Create(); + Set_Baudrate(baud); + Set_SerialPort(SERIAL_TXD1,SERIAL_RXD1); + Set_Config(config); + R_Config_UART1_Start(); + R_Config_UART1_Receive((uint8_t * const)&receive_buffer,1); #endif /* UART1_CHANNEL==1 */ break; case 2: @@ -565,7 +529,7 @@ void HardwareUart::end() break; case 1: #if (UART1_CHANNEL == 1 ) - R_Config_UART1_Stop(); + R_Config_UART1_Stop(); #endif /* (UART1_CHANNEL == 1 ) */ break; case 2: @@ -663,17 +627,17 @@ void HardwareUart::flush() return; } if (_urt_channel == 0) { - while (SSR00 & 0x0060) { /* check TSF00 and BFF00 */ + while (SSR00 & (_0040_SAU_UNDER_EXECUTE | _0020_SAU_VALID_STORED)) { /* check TSF00 and BFF00 */ ; } } else if (_urt_channel == 1) { - while (SSR02 & 0x0060) { /* check TSF02 and BFF02 */ + while (SSR02 & (_0040_SAU_UNDER_EXECUTE | _0020_SAU_VALID_STORED)) { /* check TSF02 and BFF02 */ ; } } else if (_urt_channel == 2) { - while (SSR10 & 0x0060) { /* check TSF10 and BFF10 */ + while (SSR10 & (_0040_SAU_UNDER_EXECUTE | _0020_SAU_VALID_STORED)) { /* check TSF10 and BFF10 */ ; } } @@ -695,12 +659,11 @@ size_t HardwareUart::UART_Send(uint8_t c) MD_STATUS err = MD_OK; int i; uint8_t isp; - size_t ret = -1; + size_t ret = 0; /* buffer is none */ if (0 == _tx_buf_size){ -// return -1; - return ret; + return ret; } isp = (uint8_t)GET_PSW_ISP(); @@ -708,7 +671,7 @@ size_t HardwareUart::UART_Send(uint8_t c) noInterrupts(); if(_tx_buffer_tail == _tx_buffer_head){ /* Unsent */ - int head = (_tx_buffer_head + 1); + //int head = (_tx_buffer_head + 1); i = (_tx_buffer_head + 1) % _tx_buf_size; _tx_buffer[_tx_buffer_head] = c; _tx_buffer_head = i; @@ -717,23 +680,23 @@ size_t HardwareUart::UART_Send(uint8_t c) switch (_urt_channel) { case 0: - if((SSR00 & 0x20) != 0)/*BFF00*/ + if((SSR00 & _0020_SAU_VALID_STORED) != 0)/*BFF00*/ { - return -1; + return 0; } err = R_Config_UART0_Send((uint8_t * const)&c,1); break; case 1: - if((SSR02 & 0x20) != 0)/*BFF00*/ - { - return -1; - } - err = R_Config_UART1_Send((uint8_t * const)&c,1); + if((SSR02 & _0020_SAU_VALID_STORED) != 0)/*BFF02*/ + { + return 0; + } + err = R_Config_UART1_Send((uint8_t * const)&c,1); break; case 2: - if((SSR10 & 0x20) != 0)/*BFF00*/ + if((SSR10 & _0020_SAU_VALID_STORED) != 0)/*BFF10*/ { - return -1; + return 0; } err = R_Config_UART2_Send((uint8_t * const)&c,1); break; @@ -765,7 +728,7 @@ size_t HardwareUart::UART_Send(uint8_t c) { case 0: #if ( UART_CHANNEL == 0 ) - while((SSR00 & 0x20) != 0)/*BFF00*/ + while((SSR00 & _0020_SAU_VALID_STORED) != 0)/*BFF00*/ { ; } @@ -773,17 +736,17 @@ size_t HardwareUart::UART_Send(uint8_t c) #endif /* ( UART_CHANNEL == 0 ) */ break; case 1: - #if ( UART1_CHANNEL == 1 ) - while((SSR02 & 0x20) != 0)/*BFF00*/ - { - ; - } - STIF1 = 0; - #endif /* ( UART1_CHANNEL == 1 ) */ + #if ( UART1_CHANNEL == 1 ) + while((SSR02 & _0020_SAU_VALID_STORED) != 0)/*BFF02*/ + { + ; + } + STIF1 = 0; + #endif /* ( UART1_CHANNEL == 1 ) */ break; case 2: #if ( UART2_CHANNEL == 2 ) - while((SSR10 & 0x20) != 0)/*BFF00*/ + while((SSR10 & _0020_SAU_VALID_STORED) != 0)/*BFF10*/ { ; } @@ -799,7 +762,6 @@ size_t HardwareUart::UART_Send(uint8_t c) (*uart_transmit_callback_table[_urt_channel])(); } } -// return -1; } _tx_buffer[_tx_buffer_head] = c; _tx_buffer_head = i; @@ -808,8 +770,7 @@ size_t HardwareUart::UART_Send(uint8_t c) if(err == MD_OK){ return 1; } - return ret; -// return -1; + return ret; } /********************************************************************************************************************** @@ -892,7 +853,7 @@ void HardwareUart::load_char(void){ break; case 1: #if (UART1_CHANNEL == 1) - R_Config_UART1_Send((uint8_t * const)&send_buffer,1); + R_Config_UART1_Send((uint8_t * const)&send_buffer,1); #endif /* (UART1_CHANNEL == 1) */ break; case 2: @@ -928,9 +889,9 @@ void HardwareUart::store_char(void){ #endif /* (UART_CHANNEL == 0) */ break; case 1: - #if (UART1_CHANNEL == 1) - R_Config_UART1_Receive((uint8_t * const)&receive_buffer,1); - #endif /* (UART1_CHANNEL == 1) */ + #if (UART1_CHANNEL == 1) + R_Config_UART1_Receive((uint8_t * const)&receive_buffer,1); + #endif /* (UART1_CHANNEL == 1) */ break; case 2: #if (UART2_CHANNEL == 2) @@ -965,7 +926,7 @@ void HardwareUart::store_char(unsigned char c){ * : { 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 31250, 38400, 57600, 115200 } * Return Value : void *********************************************************************************************************************/ -void HardwareUart::Set_Baudrate(unsigned long baurate) +void HardwareUart::Set_Baudrate(unsigned long baudrate) { uint32_t fclk_frequency; uint32_t peri_clk ; @@ -976,12 +937,12 @@ void HardwareUart::Set_Baudrate(unsigned long baurate) peri_clk = (fclk_frequency) ; /* SPSmk0\[3:0] = 0x0 */ - tmp_sdr = (uint16_t)(((peri_clk/baurate) >> 1) -1) ; + tmp_sdr = (uint16_t)(((peri_clk/baudrate) >> 1) -1) ; while(0x007F> 1); - tmp_sdr = (uint16_t)(((peri_clk/baurate) >> 1) -1) ; + tmp_sdr = (uint16_t)(((peri_clk/baudrate) >> 1) -1) ; } sdr = (uint8_t)(tmp_sdr & 0x007F) ; @@ -990,38 +951,26 @@ void HardwareUart::Set_Baudrate(unsigned long baurate) { case 0: #if ( UART_CHANNEL == 0 ) - ST0 &= 0xFC; - SS0 &= 0xFC; - SPS0 &= (0x00F0) ; + SPS0 &= (_00F0_SAU_CK00_CLEAR) ; SPS0 |= prs ; SDR00 = ((uint16_t)sdr) << 9 ; SDR01 = ((uint16_t)sdr) << 9 ; - SS0 |= 0x03; - ST0 |= 0x03; #endif /* ( UART_CHANNEL == 0 ) */ break; case 1: #if ( UART1_CHANNEL == 1 ) - ST0 &= 0xF3; - SS0 &= 0xF3; - SPS0 &= (0x000F) ; - SPS0 |= ((uint16_t)prs << 4); - SDR02 = ((uint16_t)sdr) << 9 ; - SDR03 = ((uint16_t)sdr) << 9 ; - SS0 |= 0x0C; - ST0 |= 0x0C; + SPS0 &= (_000F_SAU_CK01_CLEAR) ; + SPS0 |= ((uint16_t)prs << 4); + SDR02 = ((uint16_t)sdr) << 9 ; + SDR03 = ((uint16_t)sdr) << 9 ; #endif /* ( UART1_CHANNEL == 1 ) */ break; case 2: #if ( UART2_CHANNEL == 2 ) - ST1 &= 0xFC; - SS1 &= 0xFC; - SPS1 &= (0x00F0) ; + SPS1 &= (_00F0_SAU_CK00_CLEAR) ; SPS1 |= prs ; SDR10 = ((uint16_t)sdr) << 9 ; SDR11 = ((uint16_t)sdr) << 9 ; - SS1 |= 0x03; - ST1 |= 0x03; #endif /* ( UART2_CHANNEL == 2 ) */ break; case 3: @@ -1042,6 +991,62 @@ void HardwareUart::Set_Baudrate(unsigned long baurate) *********************************************************************************************************************/ void HardwareUart::Set_Config(uint16_t config ) { + uint16_t converted_config = 0; + + switch(config) + { + case SERIAL_7N1: + case SERIAL_8N1: + case SERIAL_7N2: + case SERIAL_8N2: + case SERIAL_7E1: + case SERIAL_8E1: + case SERIAL_7E2: + case SERIAL_8E2: + case SERIAL_7O1: + case SERIAL_8O1: + case SERIAL_7O2: + case SERIAL_8O2: + /* Do nothing */ + break; + default: + config = SERIAL_8N1; + break; + } + if(SERIAL_DATA_7 == (SERIAL_DATA_MASK & config)) + { + converted_config |= _0002_SAU_LENGTH_7; + } + else + { + /* All other settings are treated as SERIAL_DATA_8(default). */ + converted_config |= _0003_SAU_LENGTH_8; + } + + if(SERIAL_STOP_BIT_2 == (SERIAL_STOP_BIT_MASK & config)) + { + converted_config |= _0020_SAU_STOP_2; + } + else + { + /* All other settings are treated as SERIAL_STOP_BIT_1(default). */ + converted_config |= _0010_SAU_STOP_1; + } + + if(SERIAL_PARITY_EVEN == (SERIAL_PARITY_MASK & config)) + { + converted_config |= _0200_SAU_PARITY_EVEN; + } + else if(SERIAL_PARITY_ODD == (SERIAL_PARITY_MASK & config)) + { + converted_config |= _0300_SAU_PARITY_ODD; + } + else + { + /* All other settings are treated as SERIAL_PARITY_NONE(default). */ + converted_config |= _0000_SAU_PARITY_NONE; + } + switch (_urt_channel) { /* Rewriting prohibited when SEmn = 1 / Set_Config is called between R_Config_UART0_Create () and R_Config_UART0_Start (), so SEmn = 0*/ @@ -1049,14 +1054,14 @@ void HardwareUart::Set_Config(uint16_t config ) { /* SCR00 16bit*/ #if ( UART_CHANNEL == 0 ) - unsigned short SCR00data=_8000_SAU_TRANSMISSION| _0000_SAU_INTSRE_MASK |0x4 |_0080_SAU_LSB | config; + unsigned short SCR00data=_8000_SAU_TRANSMISSION |_0000_SAU_INTSRE_MASK |_0004_SAU_SCRMN_INITIALVALUE |_0080_SAU_LSB | converted_config; /* When sending, _0000_SAU_INTSRE_MASK :EOCmn = 0*/ - unsigned short SCR01data=_4000_SAU_RECEPTION| _0400_SAU_INTSRE_ENABLE |0x4 |_0080_SAU_LSB |config; + unsigned short SCR01data=_4000_SAU_RECEPTION |_0400_SAU_INTSRE_ENABLE |_0004_SAU_SCRMN_INITIALVALUE |_0080_SAU_LSB | converted_config; /* _0400_SAU_INTSRE_ENABLE: EOCmn = 1 Allow the occurrence of the error interrupt INTSREx */ /* SLCmn1: 0 SLCmn0: 1 when receiving XXXXXXXXXX01XXXX*/ - SCR01data &= 0xFFDF; - SCR01data |= 0x0010; + SCR01data &= ~(_0020_SAU_STOP_2); + SCR01data |= _0010_SAU_STOP_1; SCR00 = SCR00data; SCR01 = SCR01data; @@ -1067,25 +1072,25 @@ void HardwareUart::Set_Config(uint16_t config ) case 1: { #if ( UART1_CHANNEL == 1 ) - unsigned short SCR02data=_8000_SAU_TRANSMISSION| _0000_SAU_INTSRE_MASK |0x4 |_0080_SAU_LSB |config; - unsigned short SCR03data=_4000_SAU_RECEPTION| _0400_SAU_INTSRE_ENABLE |0x4 |_0080_SAU_LSB |config; - /* SLCmn1: 0 SLCmn0: 1 when receiving XXXXXXXXXX01XXXX*/ - SCR03data &= 0xFFDF; - SCR03data |= 0x0010; - - SCR02 = SCR02data; - SCR03 = SCR03data; + unsigned short SCR02data=_8000_SAU_TRANSMISSION| _0000_SAU_INTSRE_MASK |_0004_SAU_SCRMN_INITIALVALUE |_0080_SAU_LSB |converted_config; + unsigned short SCR03data=_4000_SAU_RECEPTION| _0400_SAU_INTSRE_ENABLE |_0004_SAU_SCRMN_INITIALVALUE |_0080_SAU_LSB |converted_config; + /* SLCmn1: 0 SLCmn0: 1 when receiving XXXXXXXXXX01XXXX*/ + SCR03data &= ~(_0020_SAU_STOP_2); + SCR03data |= _0010_SAU_STOP_1; + + SCR02 = SCR02data; + SCR03 = SCR03data; #endif /* ( UART1_CHANNEL == 1 ) */ } break; case 2: { #if ( UART2_CHANNEL == 2 ) - unsigned short SCR10data=_8000_SAU_TRANSMISSION| _0000_SAU_INTSRE_MASK |0x4 |_0080_SAU_LSB |config; - unsigned short SCR11data=_4000_SAU_RECEPTION| _0400_SAU_INTSRE_ENABLE |0x4 |_0080_SAU_LSB |config; + unsigned short SCR10data=_8000_SAU_TRANSMISSION| _0000_SAU_INTSRE_MASK |_0004_SAU_SCRMN_INITIALVALUE |_0080_SAU_LSB |converted_config; + unsigned short SCR11data=_4000_SAU_RECEPTION| _0400_SAU_INTSRE_ENABLE |_0004_SAU_SCRMN_INITIALVALUE |_0080_SAU_LSB |converted_config; /* SLCmn1: 0 SLCmn0: 1 when receiving XXXXXXXXXX01XXXX*/ - SCR11data &= 0xFFDF; - SCR11data |= 0x0010; + SCR11data &= ~(_0020_SAU_STOP_2); + SCR11data |= _0010_SAU_STOP_1; SCR10 = SCR10data; SCR11 = SCR11data; #endif /* ( UART2_CHANNEL == 2 ) */ @@ -1220,7 +1225,7 @@ void Set_Char_Serial_to_buf(uint8_t chn) break; case 1: #if (UART1_CHANNEL == 1) - Serial1.store_char(); + Serial1.store_char(); #endif /* (UART1_CHANNEL == 1) */ break; case 2: @@ -1251,7 +1256,7 @@ void Set_Char_Serial_from_buf(uint8_t chn) break; case 1: #if (UART1_CHANNEL == 1) - Serial1.load_char(); + Serial1.load_char(); #endif /* (UART1_CHANNEL == 1) */ break; case 2: @@ -1269,13 +1274,13 @@ void Set_Char_Serial_from_buf(uint8_t chn) // Preinstantiate Objects ////////////////////////////////////////////////////// #if ( UART_CHANNEL == 0 ) - HardwareUart Serial(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + HardwareUart Serial(0); #endif /* ( UART_CHANNEL == 0 ) */ #if ( UART1_CHANNEL == 1 ) - HardwareUart Serial1(0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0); + HardwareUart Serial1(1); #endif /* ( UART1_CHANNEL == 1 ) */ #if ( UART2_CHANNEL == 2 ) - HardwareUart Serial2(0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0); + HardwareUart Serial2(2); #endif /* ( UART2_CHANNEL == 2 ) */ diff --git a/cores/rl78g22/HardwareUart.h b/cores/rl78g22/HardwareUart.h index 5db2ecd..f75f9d3 100644 --- a/cores/rl78g22/HardwareUart.h +++ b/cores/rl78g22/HardwareUart.h @@ -18,7 +18,6 @@ #pragma once -// #include "api/HardwareSerial.h" #include "api/HardwareSerial.h" #ifdef SERIAL_BUFFER_SIZE @@ -30,11 +29,6 @@ class HardwareUart : public arduino::HardwareSerial { public: - HardwareUart( - volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, - volatile uint8_t *ucsra, volatile uint8_t *ucsrb, - volatile uint8_t *ucsrc, volatile uint8_t *udr, - uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x); HardwareUart(uint8_t rxen); /*API*/ void begin(unsigned long baud) override ; @@ -61,7 +55,6 @@ class HardwareUart : public arduino::HardwareSerial void store_char(void); operator bool() override ; - private: private: volatile int _rx_buffer_head; volatile int _rx_buffer_tail; diff --git a/cores/rl78g22/WMath.cpp b/cores/rl78g22/WMath.cpp index ce68e7c..0a200ee 100644 --- a/cores/rl78g22/WMath.cpp +++ b/cores/rl78g22/WMath.cpp @@ -41,13 +41,17 @@ void randomSeed(unsigned long seed) long random(long howbig) { + unsigned long value = 0; if (howbig == 0) { return 0; } #ifndef __RL78__ return random() % howbig; #else - return rand() % howbig; + value = ((unsigned long)rand() << 16); + value |= ((unsigned long)rand() << 1); + value |= ((unsigned long)rand() & 0x01); + return (signed long)value % howbig; #endif } diff --git a/cores/rl78g22/main.cpp b/cores/rl78g22/main.cpp index 9b0e70b..d4cebfa 100644 --- a/cores/rl78g22/main.cpp +++ b/cores/rl78g22/main.cpp @@ -93,11 +93,17 @@ int main(void) SO0 |= 0x08; // 2022/11/18 added by KAD for safety reason for G22, These pins are not available #if defined(G22_FPB) - P2_bit.no3 = 0U; - P2_bit.no4 = 0U; - P2_bit.no5 = 0U; - P2_bit.no6 = 0U; - P3_bit.no0 = 0U; + /* P26,P25,P24,P23,P22 */ + PMCA2 &= 0x83; /* 0 : Use Digital IO */ + PMCT2 &= 0x83; /* 0 : Use Digital IO */ + PM2 &= 0x83; /* 0 : Use Output Mode */ + P2 &= 0x83; /* 0 : Use Output Low */ + + /* P30 */ + PMCT3 &= 0xFE; /* 0 : Use Digital IO */ + PM3 &= 0xFE; /* 0 : Use Output Mode */ + P3 &= 0xFE; /* 0 : Use Output Low */ + #endif /******************************************************/ diff --git a/cores/rl78g22/smc_gen/Config_UART1/Config_UART1.c b/cores/rl78g22/smc_gen/Config_UART1/Config_UART1.c index fb4506b..1443e0f 100644 --- a/cores/rl78g22/smc_gen/Config_UART1/Config_UART1.c +++ b/cores/rl78g22/smc_gen/Config_UART1/Config_UART1.c @@ -59,7 +59,8 @@ uint16_t g_uart1_rx_length; /* uart1 receive data length */ ***********************************************************************************************************************/ void R_Config_UART1_Create(void) { - SPS0 = _0040_SAU_CK01_FCLK_4 | _0004_SAU_CK00_FCLK_4; + SPS0 &= _000F_SAU_CK01_CLEAR; + SPS0 |= _0040_SAU_CK01_FCLK_4; ST0 |= (_0008_SAU_CH3_STOP_TRG_ON | _0004_SAU_CH2_STOP_TRG_ON); STMK1 = 1U; /* disable INTST1 interrupt */ STIF1 = 0U; /* clear INTST1 interrupt flag */ @@ -83,7 +84,7 @@ void R_Config_UART1_Create(void) SDR02 = _1000_SAU0_CH2_TRANSMIT_DIVISOR; NFEN0 |= _04_SAU_RXD1_FILTER_ON; SIR03 = _0004_SAU_SIRMN_FECTMN | _0002_SAU_SIRMN_PECTMN | _0001_SAU_SIRMN_OVCTMN; /* clear error flag */ - SMR03 = _0020_SAU_SMRMN_INITIALVALUE | _8000_SAU_CLOCK_SELECT_CK01 | _0100_SAU_TRIGGER_RXD | _0000_SAU_EDGE_FALL | + SMR03 = _0020_SAU_SMRMN_INITIALVALUE | _8000_SAU_CLOCK_SELECT_CK01 | _0100_SAU_TRIGGER_RXD | _0000_SAU_EDGE_FALL | _0002_SAU_MODE_UART | _0000_SAU_TRANSFER_END; SCR03 = _0004_SAU_SCRMN_INITIALVALUE | _4000_SAU_RECEPTION | _0400_SAU_INTSRE_ENABLE | _0000_SAU_PARITY_NONE | _0080_SAU_LSB | _0010_SAU_STOP_1 | _0003_SAU_LENGTH_8; diff --git a/cores/rl78g22/wiring_analog.c b/cores/rl78g22/wiring_analog.c index f404fd2..77e9e57 100644 --- a/cores/rl78g22/wiring_analog.c +++ b/cores/rl78g22/wiring_analog.c @@ -144,8 +144,8 @@ int analogRead(uint8_t analog_pin) { if(analog_read_flg == 1) { - // アナログ値の読み込み - s16Result = _analogRead(g_au8AnalogPinTable[get_analog_channel(analog_pin)]); + // アナログ値の読み込み + s16Result = _analogRead(g_au8AnalogPinTable[get_analog_channel(analog_pin)]); } return s16Result; } @@ -163,7 +163,8 @@ int analogRead(uint8_t analog_pin) { ***********************************************************************************************************************/ void analogWrite(uint8_t pin, int value) { // uint8_t u8Timer; - if (pin < NUM_DIGITAL_PINS) { + if (pin < NUM_DIGITAL_PINS) + { { value = max(value, PWM_MIN); value = min(value, PWM_MAX); @@ -172,11 +173,6 @@ void analogWrite(uint8_t pin, int value) { uint8_t analog_write_flg = 0; int8_t pwm_channel = get_pwm_channel(pin); - if (-1 ==(*(int8_t*)get_pwm_channel)) - { - NOP(); - } - /* If it is not a PWM output terminal, do nothing and exit */ for(cnt = 0; cnt < PWM_CH_NUM; cnt ++) { @@ -187,27 +183,27 @@ void analogWrite(uint8_t pin, int value) { } else { - analog_write_flg = 0; + analog_write_flg = 0; } } if(analog_write_flg == 1) { - pwm_ch[pwm_channel].open(); + pwm_ch[pwm_channel].open(); - /* Frequency Set */ - if(pwm_ch[pwm_channel].cycle == CYCLE_VALUE) - { - pwm_ch[pwm_channel].cycle = _analogFrequency(pin,FREQUENCY_MIN_VAL); - } - else - { - *(g_timer_period_reg[pwm_channel]) = pwm_ch[pwm_channel].cycle; + /* Frequency Set */ + if(pwm_ch[pwm_channel].cycle == CYCLE_VALUE) + { + pwm_ch[pwm_channel].cycle = _analogFrequency(pin,FREQUENCY_MIN_VAL); + } + else + { + *(g_timer_period_reg[pwm_channel]) = pwm_ch[pwm_channel].cycle; - } - /* Duty set */ - *(g_timer_duty_reg[pwm_channel]) = (uint16_t)_analogDuty(value, pwm_ch[pwm_channel].cycle); - pwm_ch[pwm_channel].start(); + } + /* Duty set */ + *(g_timer_duty_reg[pwm_channel]) = (uint16_t)_analogDuty(value, pwm_ch[pwm_channel].cycle); + pwm_ch[pwm_channel].start(); } } } @@ -233,10 +229,10 @@ void analogWriteFrequency(uint32_t Hz) { */ void analogWriteFrequency(uint32_t Hz) { - for(int i = 0;i> 8; - timer_frequency = (uint32_t)((double)fclk_frequency/( pow((double)2, (double)(2 * operating_clock_select)))); /* fclk/2^2 ~ 2^6 */ - } + timer_frequency = fclk_frequency/2; /* fclk/2 */ } - else if (timer_clock_mode == _C000_TAU_CLOCK_SELECT_CKM3) /* CK03 Clock Selected */ - { - operating_clock_select = *((uint32_t*)g_timer_analog_clock_select_reg) & CK03_OPERATION; - - operating_clock_select = operating_clock_select >> 12; - timer_frequency = (uint32_t)((double)fclk_frequency/( pow((double)2,(double)(2 * operating_clock_select +8)))); /* fclk/2^8 ~ 2^14 */ - } - else /* CK00, CK01 Clock Selected */ + else { - operating_clock_select = *((uint32_t*)g_timer_analog_clock_select_reg) & CK00_CK01_OPERATION; - timer_frequency = (uint32_t)((double)fclk_frequency/( pow((double)2,(double)operating_clock_select))); /* ckm00, ckm01 - fclk/2^0 ~ 2^15 */ + operating_clock_select = operating_clock_select >> 8; + timer_frequency = fclk_frequency / (1 << (operating_clock_select * 2)) ; /* fclk/2^2 ~ 2^6 */ } + } + else if (timer_clock_mode == _C000_TAU_CLOCK_SELECT_CKM3) /* CK03 Clock Selected */ + { + operating_clock_select = *g_timer_analog_clock_select_reg & CK03_OPERATION; + + operating_clock_select = operating_clock_select >> 12; + timer_frequency = fclk_frequency / (1 << (operating_clock_select * 2 + 8)); /* fclk/2^8 ~ 2^14 */ + } + else /* CK00, CK01 Clock Selected */ + { + operating_clock_select = *g_timer_analog_clock_select_reg & CK00_CK01_OPERATION; + timer_frequency = fclk_frequency / (1 << operating_clock_select) ; /* ckm00, ckm01 - fclk/2^0 ~ 2^15 */ + } /* 490 Hz <= frequency <= 8MHz */ u32Hz = max(u32Hz, (uint32_t)FREQUENCY_MIN_VAL); diff --git a/cores/rl78g22/wiring_digital.c b/cores/rl78g22/wiring_digital.c index 656a215..1af51fd 100644 --- a/cores/rl78g22/wiring_digital.c +++ b/cores/rl78g22/wiring_digital.c @@ -123,9 +123,15 @@ void _turnOffPwmPin(uint8_t u8Pin) * Return Value : - *********************************************************************************************************************/ // void pinMode(uint8_t pin, uint8_t u8Mode) -void pinMode(pin_size_t pin, PinMode u8Mode) +void pinMode(pin_size_t pin, PinMode pinMode) { + uint8_t u8Mode = (uint8_t)pinMode; if (pin < NUM_DIGITAL_PINS) { + if(CHECK_PINMODE_INHIBIT_RL78(pin)) + { + return; + } + //PinTableType pin_tbl; //p = (PinTableType*)&pin_tbl; //getPinTable(pin,p); @@ -279,16 +285,19 @@ void digitalWrite(pin_size_t pin, PinStatus val) { const PinTableType ** pp; PinTableType * p; - if (pin < NUM_DIGITAL_PINS) { - pp = &pinTablelist[pin]; - p = (PinTableType *)*pp; + if (pin < NUM_DIGITAL_PINS) + { + if(CHECK_OUTPUT_INHIBIT_RL78(pin)) { - /* When Output Mode */ - if (val == LOW) { - *p->portRegisterAddr &= ~p->mask; /* Write "0" to Port */ - } else { - *p->portRegisterAddr |= p->mask; /* Write "1" to Port */ - } + return; + } + pp = &pinTablelist[pin]; + p = (PinTableType *)*pp; + /* When Output Mode */ + if (val == LOW) { + *p->portRegisterAddr &= ~p->mask; /* Write "0" to Port */ + } else { + *p->portRegisterAddr |= p->mask; /* Write "1" to Port */ } } } diff --git a/cores/rl78g22/wiring_pulse.c b/cores/rl78g22/wiring_pulse.c index a0f57ec..eb6f636 100644 --- a/cores/rl78g22/wiring_pulse.c +++ b/cores/rl78g22/wiring_pulse.c @@ -59,7 +59,7 @@ unsigned long pulseIn(pin_size_t pin, uint8_t state, unsigned long timeout) uint8_t pulse_in_flg = 0; uint8_t l_tau_interrupt_flag = 0; uint32_t Result = 0; - uint32_t timer_clock_mode = 0; + uint16_t timer_clock_mode = 0; uint32_t pulse_frequency = 0; uint32_t timeout_frequency = 0; g_pulse_enable_interrupt_flag = 1; @@ -87,16 +87,16 @@ unsigned long pulseIn(pin_size_t pin, uint8_t state, unsigned long timeout) /* State Set */ if(state == LOW) { - *((uint32_t*)g_timer_pulse_mode_reg[pulse_in_channel]) |= _0200_TAU_TRIGGER_TIMN_BOTH | _0080_TAU_TIMN_EDGE_BOTH_LOW; + *(g_timer_pulse_mode_reg[pulse_in_channel]) |= _0200_TAU_TRIGGER_TIMN_BOTH | _0080_TAU_TIMN_EDGE_BOTH_LOW; } else { - *((uint32_t*)g_timer_pulse_mode_reg[pulse_in_channel]) |= _00C0_TAU_TIMN_EDGE_BOTH_HIGH; + *(g_timer_pulse_mode_reg[pulse_in_channel]) |= _00C0_TAU_TIMN_EDGE_BOTH_HIGH; } /* Get timeout frequency */ - timer_clock_mode = *((uint32_t*)g_timer_timeout_mode_reg) & TAU_OPERATION_CLOCK; - timeout_frequency = get_timer_frequency(timer_clock_mode); + timer_clock_mode = *g_timer_timeout_mode_reg & TAU_OPERATION_CLOCK; + timeout_frequency = get_timer_frequency((uint32_t)timer_clock_mode); /* Timeout Set */ timeout = min(timeout, (uint32_t)TIMEOUT_MAX_VAL); @@ -218,15 +218,15 @@ unsigned long pulseIn(pin_size_t pin, uint8_t state, unsigned long timeout) { pulse_in_ch[pulse_in_channel].get_width(&Result); /* Store capture value */ /* Get pulse frequency */ - timer_clock_mode = *((uint32_t*)g_timer_pulse_mode_reg[pulse_in_channel]) & TAU_OPERATION_CLOCK; - pulse_frequency = get_timer_frequency(timer_clock_mode); + timer_clock_mode = *g_timer_pulse_mode_reg[pulse_in_channel] & TAU_OPERATION_CLOCK; + pulse_frequency = get_timer_frequency((uint32_t)timer_clock_mode); Result = Result * (1000000/pulse_frequency); } else { Result = 0; } - g_tau0_ch0_interrupt_flag = 0; + g_tau0_ch0_interrupt_flag = 0; } return Result; } @@ -235,13 +235,13 @@ static uint32_t get_timer_frequency(uint32_t clock_mode) { uint32_t fclk_frequency = 0; uint32_t timer_frequency = 0; - uint32_t operating_clock_select = 0; + uint16_t operating_clock_select = 0; fclk_frequency = R_BSP_GetFclkFreqHz(); if (clock_mode == _4000_TAU_CLOCK_SELECT_CKM2) { - operating_clock_select = *((uint32_t*)g_timer_pulse_clock_select_reg) & CK02_OPERATION; + operating_clock_select = *g_timer_pulse_clock_select_reg & CK02_OPERATION; if(operating_clock_select == _0000_TAU_CKM2_FCLK_1) { timer_frequency = fclk_frequency/2; @@ -249,20 +249,20 @@ static uint32_t get_timer_frequency(uint32_t clock_mode) else { operating_clock_select = operating_clock_select >> 8; - timer_frequency = (uint32_t)((double)fclk_frequency/( pow((double)2, (double)(2 * operating_clock_select)))); /* fclk/2^2 ~ 2^6 */ + timer_frequency = fclk_frequency / (1 << (operating_clock_select * 2)) ; /* fclk/2^2 ~ 2^6 */ } } else if (clock_mode == _C000_TAU_CLOCK_SELECT_CKM3) { - operating_clock_select = *((uint32_t*)g_timer_pulse_clock_select_reg) & CK03_OPERATION; + operating_clock_select = *g_timer_pulse_clock_select_reg & CK03_OPERATION; operating_clock_select = operating_clock_select >> 12; - timer_frequency = (uint32_t)((double)fclk_frequency/( pow((double)2,(double)(2 * operating_clock_select +8)))); /* fclk/2^8 ~ 2^14 */ + timer_frequency = fclk_frequency / (1 << (operating_clock_select * 2 + 8)); /* fclk/2^8 ~ 2^14 */ } else /* CK00, CK01 Clock Select */ { - operating_clock_select = *((uint32_t*)g_timer_pulse_clock_select_reg) & CK00_CK01_OPERATION; - timer_frequency = (uint32_t)((double)fclk_frequency/( pow((double)2,(double)operating_clock_select))); /* ckm00, ckm01 - fclk/2^0 ~ 2^15 */ + operating_clock_select = *g_timer_pulse_clock_select_reg & CK00_CK01_OPERATION; + timer_frequency = fclk_frequency / (1 << operating_clock_select) ; /* ckm00, ckm01 - fclk/2^0 ~ 2^15 */ } return timer_frequency; } diff --git a/cores/rl78g22/wiring_tone.cpp b/cores/rl78g22/wiring_tone.cpp index 2f3ef1c..855f258 100644 --- a/cores/rl78g22/wiring_tone.cpp +++ b/cores/rl78g22/wiring_tone.cpp @@ -38,7 +38,7 @@ void noTone(uint8_t pin) } else { - tone_ch[tone_channel].stop(); + tone_ch[tone_channel].stop(); } } @@ -52,13 +52,8 @@ void tone(uint8_t pin, unsigned int frequency, unsigned long duration) int8_t tone_channel = get_tone_channel(pin); uint32_t fclk_frequency = 0; uint32_t timer_frequency = 0; - uint32_t timer_clock_mode = 0; - uint32_t operating_clock_select = 0; - - if (-1 == (*(int8_t*)get_tone_channel)) - { - NOP(); - } + uint16_t timer_clock_mode = 0; + uint16_t operating_clock_select = 0; /* If it is not a tone output pin, do nothing and exit */ for(i = 0; i < TONE_CH_NUM; i ++) @@ -87,11 +82,11 @@ void tone(uint8_t pin, unsigned int frequency, unsigned long duration) fclk_frequency = R_BSP_GetFclkFreqHz(); /* Get timer frequency */ - timer_clock_mode = *((uint32_t*)g_timer_tone_mode_reg[tone_channel]) & TAU_OPERATION_CLOCK; + timer_clock_mode = *g_timer_tone_mode_reg[tone_channel] & TAU_OPERATION_CLOCK; if (timer_clock_mode == _4000_TAU_CLOCK_SELECT_CKM2) { - operating_clock_select = *((uint32_t*)g_timer_tone_clock_select_reg) & CK02_OPERATION; + operating_clock_select = *g_timer_tone_clock_select_reg & CK02_OPERATION; if(operating_clock_select == _0000_TAU_CKM2_FCLK_1) { timer_frequency = fclk_frequency/2; @@ -99,26 +94,27 @@ void tone(uint8_t pin, unsigned int frequency, unsigned long duration) else { operating_clock_select = operating_clock_select >> 8; - timer_frequency = fclk_frequency/( pow(2, 2 * operating_clock_select)); /* fclk/2^2 ~ 2^6 */ + timer_frequency = fclk_frequency / (1 << (operating_clock_select * 2)) ; /* fclk/2^2 ~ 2^6 */ } } else if (timer_clock_mode == _C000_TAU_CLOCK_SELECT_CKM3) { - operating_clock_select = *((uint32_t*)g_timer_tone_clock_select_reg) & CK03_OPERATION; + operating_clock_select = *g_timer_tone_clock_select_reg & CK03_OPERATION; operating_clock_select = operating_clock_select >> 12; - timer_frequency = fclk_frequency/( pow(2,(2 * operating_clock_select +8))); /* fclk/2^8 ~ 2^14 */ + timer_frequency = fclk_frequency / (1 << (operating_clock_select * 2 + 8)); /* fclk/2^8 ~ 2^14 */ } else /* CK00, CK01 Clock Select */ { - operating_clock_select = *((uint32_t*)g_timer_tone_clock_select_reg) & CK00_CK01_OPERATION; - timer_frequency = fclk_frequency/( pow(2,operating_clock_select)); /* ckm00, ckm01 - fclk/2^0 ~ 2^15 */ + operating_clock_select = *g_timer_tone_clock_select_reg & CK00_CK01_OPERATION; + timer_frequency = fclk_frequency / (1 << operating_clock_select) ; /* ckm00, ckm01 - fclk/2^0 ~ 2^15 */ } /* 500 Hz <= frequency <= 65535Hz */ - frequency = min(max(frequency, FREQUENCY_MIN_VAL), 65535); + frequency = max(frequency, (unsigned int)FREQUENCY_MIN_VAL); + frequency = min(frequency, (unsigned int)65535); - *((uint32_t*)g_tone_period_reg[tone_channel]) = (timer_frequency / 2 / frequency) - 1; + *g_tone_period_reg[tone_channel] = (uint16_t)((timer_frequency / 2 / frequency) - 1); tone_ch[tone_channel].start(); diff --git a/variants/g22-fpb-48p/pins_variant.h b/variants/g22-fpb-48p/pins_variant.h index 8d2b00a..e70aa96 100644 --- a/variants/g22-fpb-48p/pins_variant.h +++ b/variants/g22-fpb-48p/pins_variant.h @@ -42,7 +42,7 @@ #define UART2_CHANNEL 2 // UART2(Serial2) /* SPI(CSI) Definition */ -#define USE_CSI (1) // Set to '1' when Use SPI Hardware. +#define USE_CSI (0) // Set to '1' when Use SPI Hardware. #if defined(USE_CSI) && USE_CSI @@ -61,7 +61,17 @@ #define IIC_CHANNEL0 (0) #define IIC_CHANNEL1 (0) -#define CHECK_OUTPUT_INHIBIT_RL78(p) ((p) == 27 || (p) == 28 || (p) == 41) + +#define CHECK_PINMODE_INHIBIT_RL78(p) (\ + (p) == 27 || /* P21(AVREFM) */\ + (p) == 35 /* P20(AVREFP) */) +#define CHECK_OUTPUT_INHIBIT_RL78(p) (\ + (p) == 8 || /* P30(TSCAP) */\ + (p) == 26 || /* P22(Touch Slider) */\ + (p) == A2 || /* P26(Touch Slider) */\ + (p) == A3 || /* P25(Touch Slider) */\ + (p) == A4 || /* P24(Touch Slider) */\ + (p) == A5 /* P23(Touch Slider) */) // 2023/03/02 end of copy from Arduino.h