diff --git a/README.md b/README.md index 099bd74..a48a4b7 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ After CS is enabled, slave awaits 8 bit command from master, slave then transfer | | | | --- | --- | | Chip select pin | D22 (PA0) | -| CPOL | 0 | -| CPHA | 0 | +| CPOL | 1 | +| CPHA | 1 | | Master | Arduino Mega | | Slave | STM32 | | Format | 8 bit command byte + (optional data from slave) (MSB first) | diff --git a/target-code/EncoderTracker/BSP/STM32F3xxxx/LinkerScripts/STM32F303CB_flash.lds b/target-code/EncoderTracker/BSP/STM32F3xxxx/LinkerScripts/STM32F303CB_flash.lds index 11c5b0d..37677fe 100644 --- a/target-code/EncoderTracker/BSP/STM32F3xxxx/LinkerScripts/STM32F303CB_flash.lds +++ b/target-code/EncoderTracker/BSP/STM32F3xxxx/LinkerScripts/STM32F303CB_flash.lds @@ -14,6 +14,8 @@ MEMORY _estack = 0x20008000; +_siccmram = LOADADDR(.ccmram); + SECTIONS { .isr_vector : @@ -40,6 +42,17 @@ SECTIONS _etext = .; } > FLASH + + .ccmram : + { + . = ALIGN(4); + _sccmram = .; + *(.ccmram) + *(.ccmram*) + + . = ALIGN(4); + _eccmram = .; + } > CCMRAM AT > FLASH .ARM.extab : { diff --git a/target-code/EncoderTracker/BSP/STM32F3xxxx/StartupFiles/startup_stm32f303xc.c b/target-code/EncoderTracker/BSP/STM32F3xxxx/StartupFiles/startup_stm32f303xc.c index 8f5a5ae..dc8a9f0 100644 --- a/target-code/EncoderTracker/BSP/STM32F3xxxx/StartupFiles/startup_stm32f303xc.c +++ b/target-code/EncoderTracker/BSP/STM32F3xxxx/StartupFiles/startup_stm32f303xc.c @@ -795,6 +795,7 @@ void SystemInit(); void __libc_init_array(); int main(); +extern void *_siccmram, *_sccmram, *_eccmram; extern void *_sidata, *_sdata, *_edata; extern void *_sbss, *_ebss; @@ -810,6 +811,9 @@ void __attribute__((naked, noreturn)) Reset_Handler() for (pSource = &_sidata, pDest = &_sdata; pDest != &_edata; pSource++, pDest++) *pDest = *pSource; + for (pSource = &_siccmram, pDest = &_sccmram; pDest != &_eccmram; pSource++, pDest++) + *pDest = *pSource; + for (pDest = &_sbss; pDest != &_ebss; pDest++) *pDest = 0; diff --git a/target-code/EncoderTracker/app_code/app/src/App.cpp b/target-code/EncoderTracker/app_code/app/src/App.cpp index 3a749e8..8e26506 100644 --- a/target-code/EncoderTracker/app_code/app/src/App.cpp +++ b/target-code/EncoderTracker/app_code/app/src/App.cpp @@ -100,7 +100,7 @@ void App::ConfigSpi() spi.Initialize(SpiSlave::_Spi1); spi.ConfigPins(spiPinConfig); - spi.ConfigMode(SpiSlave::_Cpol0Cpha0); + spi.ConfigMode(SpiSlave::_Cpol1Cpha1); spi.ConfigFrame(SpiSlave::_MsbFirst, SpiSlave::_8Bit); spi.ConfigFifoRecThreshold(SpiSlave::_1Byte); spi.ConfigBaudRatePrescaler(SpiSlave::_Fpclk8); @@ -129,7 +129,7 @@ void App::ConfigExtInt() ///Reads the encoder counts from the Timer modules and converts them into 32bit signed values ///This function should be called in the main loop -void App::Execute() +__ccm void App::Execute() { uint16_t encCount = 0; int32_t encoderDataTemp = 0; @@ -153,7 +153,7 @@ void App::Execute() ///Interprets and executes command from the SPI master -void App::ServeSpi() +__ccm void App::ServeSpi() { spi.Enable(); uint8_t header = 0; @@ -175,7 +175,7 @@ void App::ServeSpi() ///Transmits selected encoder values to the SPI master -void App::SendEncoderVals(uint8_t header) +__ccm void App::SendEncoderVals(uint8_t header) { uint8_t encSelector = header >> enc_offset; uint16_t numTxEncoders = 0; @@ -195,7 +195,7 @@ void App::SendEncoderVals(uint8_t header) ///Resets selected encoder values to 0 -void App::ClearEncoderVals(uint8_t header) +__ccm void App::ClearEncoderVals(uint8_t header) { uint8_t encSelector = header >> enc_offset; @@ -212,7 +212,7 @@ void App::ClearEncoderVals(uint8_t header) ///Reverses byte endianness of data -void App::ReverseEndian(int32_t* num) +__ccm void App::ReverseEndian(int32_t* num) { uint8_t* temp1 = (uint8_t*)num; uint8_t ch = 0; diff --git a/target-code/EncoderTracker/app_code/app/src/main.cpp b/target-code/EncoderTracker/app_code/app/src/main.cpp index 7b89225..d1bb34c 100644 --- a/target-code/EncoderTracker/app_code/app/src/main.cpp +++ b/target-code/EncoderTracker/app_code/app/src/main.cpp @@ -22,7 +22,7 @@ int main(void) extern "C" { - void EXTI4_IRQHandler() + __attribute__((section(".ccmram"))) void EXTI4_IRQHandler() { app.ServeSpi(); app.ExtIntClear(); diff --git a/target-code/EncoderTracker/app_code/hal/inc/HalHeaders.h b/target-code/EncoderTracker/app_code/hal/inc/HalHeaders.h index 6493801..c7c7889 100644 --- a/target-code/EncoderTracker/app_code/hal/inc/HalHeaders.h +++ b/target-code/EncoderTracker/app_code/hal/inc/HalHeaders.h @@ -10,4 +10,6 @@ #include #include "stm32f3xx.h" +#define __ccm __attribute__((section(".ccmram"))) + #endif \ No newline at end of file diff --git a/target-code/EncoderTracker/app_code/hal/src/SpiSlave.cpp b/target-code/EncoderTracker/app_code/hal/src/SpiSlave.cpp index 7f0bfb1..c9f388d 100644 --- a/target-code/EncoderTracker/app_code/hal/src/SpiSlave.cpp +++ b/target-code/EncoderTracker/app_code/hal/src/SpiSlave.cpp @@ -121,7 +121,7 @@ void SpiSlave::ConfigDma(bool isEnableTxDma, bool isEnableRxDma) -uint8_t SpiSlave::ReadWriteByte(uint8_t txData) +__ccm uint8_t SpiSlave::ReadWriteByte(uint8_t txData) { while (!base->SR & SPI_SR_TXE && IsSelected()); base->DR = txData; @@ -130,7 +130,7 @@ uint8_t SpiSlave::ReadWriteByte(uint8_t txData) } ///Receive data from SPI port -void SpiSlave::Read(uint8_t* rxData, uint16_t rxSize) + __ccm void SpiSlave::Read(uint8_t* rxData, uint16_t rxSize) { while (0 < rxSize && IsSelected() ) { @@ -155,7 +155,7 @@ void SpiSlave::Read(uint8_t* rxData, uint16_t rxSize) ///Send data to SPI port -void SpiSlave::Write(const uint8_t* txData, uint16_t txSize) +__ccm void SpiSlave::Write(const uint8_t* txData, uint16_t txSize) { while (0 < txSize && IsSelected() ) { @@ -185,7 +185,7 @@ void SpiSlave::Write(const uint8_t* txData, uint16_t txSize) ///Simultaneously send data and receive data -void SpiSlave::ReadAndWrite(uint8_t * rxData, const uint8_t * txData, uint16_t size) +__ccm void SpiSlave::ReadAndWrite(uint8_t * rxData, const uint8_t * txData, uint16_t size) { if (__null == rxData || __null == txData) return; diff --git a/target-code/EncoderTracker/support/cmsis-core/src/startup_stm32f303xc.c b/target-code/EncoderTracker/support/cmsis-core/src/startup_stm32f303xc.c index bcb39ea..83e5015 100644 --- a/target-code/EncoderTracker/support/cmsis-core/src/startup_stm32f303xc.c +++ b/target-code/EncoderTracker/support/cmsis-core/src/startup_stm32f303xc.c @@ -796,6 +796,7 @@ void SystemInit(); void __libc_init_array(); int main(); +extern void *_siccmram, *_sccmram, *_eccmram; extern void *_sidata, *_sdata, *_edata; extern void *_sbss, *_ebss; @@ -811,6 +812,9 @@ void __attribute__((naked, noreturn)) Reset_Handler() for (pSource = &_sidata, pDest = &_sdata; pDest != &_edata; pSource++, pDest++) *pDest = *pSource; + for (pSource = &_siccmram, pDest = &_sccmram; pDest != &_eccmram; pSource++, pDest++) + *pDest = *pSource; + for (pDest = &_sbss; pDest != &_ebss; pDest++) *pDest = 0;