Merge branch 'master' of https://github.com/danieleff/STM32GENERIC
This commit is contained in:
commit
2201c0e0f9
|
@ -0,0 +1,99 @@
|
||||||
|
/**
|
||||||
|
* FSMC on the J1 Header on Black F407VE board
|
||||||
|
* LCD-style, D0..D15 + A18
|
||||||
|
* http://wiki.stm32duino.com/images/5/5c/STM32_F4VE_SCHEMATIC.PDF
|
||||||
|
*
|
||||||
|
* Connect a logic analizer to the J1 header pins (check above schematic)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
GPIO_InitTypeDef GPIO_InitStruct;
|
||||||
|
|
||||||
|
__HAL_RCC_FSMC_CLK_ENABLE();
|
||||||
|
|
||||||
|
__HAL_RCC_GPIOE_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOD_CLK_ENABLE();
|
||||||
|
|
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
|
||||||
|
|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
|
||||||
|
|GPIO_PIN_15;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||||
|
GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
|
||||||
|
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_13
|
||||||
|
|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1
|
||||||
|
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||||
|
GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
|
||||||
|
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
|
||||||
|
FSMC_NORSRAM_TimingTypeDef Timing;
|
||||||
|
|
||||||
|
/** Perform the SRAM1 memory initialization sequence
|
||||||
|
*/
|
||||||
|
SRAM_HandleTypeDef hsram1;
|
||||||
|
hsram1.Instance = FSMC_NORSRAM_DEVICE;
|
||||||
|
hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
|
||||||
|
/* hsram1.Init */
|
||||||
|
hsram1.Init.NSBank = FSMC_NORSRAM_BANK1;
|
||||||
|
hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
|
||||||
|
hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
|
||||||
|
hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
|
||||||
|
hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
|
||||||
|
hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
|
||||||
|
hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
|
||||||
|
hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
|
||||||
|
hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
|
||||||
|
hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
|
||||||
|
hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
|
||||||
|
hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
|
||||||
|
hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
|
||||||
|
hsram1.Init.PageSize = FSMC_PAGE_SIZE_NONE;
|
||||||
|
|
||||||
|
/* Timing */
|
||||||
|
Timing.AddressSetupTime = 0;
|
||||||
|
Timing.AddressHoldTime = 1;
|
||||||
|
Timing.DataSetupTime = 1;
|
||||||
|
Timing.BusTurnAroundDuration = 15;
|
||||||
|
Timing.CLKDivision = 16;
|
||||||
|
Timing.DataLatency = 17;
|
||||||
|
Timing.AccessMode = FSMC_ACCESS_MODE_A;
|
||||||
|
|
||||||
|
if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK) {
|
||||||
|
while(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
pinMode(LED_BUILTIN, OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LCD_REG (*((volatile unsigned short *) 0x60000000))
|
||||||
|
|
||||||
|
#define LCD_RAM (*((volatile unsigned short *) 0x60000000 + (1 << 18)))
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
digitalWrite(LED_BUILTIN, LOW);
|
||||||
|
for(int32_t i=0; i<=UINT16_MAX; i++) {
|
||||||
|
LCD_REG = i;
|
||||||
|
}
|
||||||
|
digitalWrite(LED_BUILTIN, HIGH);
|
||||||
|
|
||||||
|
|
||||||
|
delay(200);
|
||||||
|
|
||||||
|
|
||||||
|
digitalWrite(LED_BUILTIN, LOW);
|
||||||
|
for(int32_t i=0; i<=UINT16_MAX; i++) {
|
||||||
|
LCD_RAM = i;
|
||||||
|
}
|
||||||
|
digitalWrite(LED_BUILTIN, HIGH);
|
||||||
|
|
||||||
|
|
||||||
|
delay(200);
|
||||||
|
}
|
|
@ -14,11 +14,6 @@ static uint8_t spi_ff_buffer = 0XFF;
|
||||||
|
|
||||||
void SPIClass::begin() {
|
void SPIClass::begin() {
|
||||||
|
|
||||||
_DMA_Instance_Type *_StreamTX;
|
|
||||||
_DMA_Instance_Type *_StreamRX;
|
|
||||||
uint32_t _ChannelTX;
|
|
||||||
uint32_t _ChannelRX;
|
|
||||||
|
|
||||||
apb_freq = stm32GetClockFrequency((void*)spiHandle.Instance);
|
apb_freq = stm32GetClockFrequency((void*)spiHandle.Instance);
|
||||||
|
|
||||||
spiHandle.Init.Mode = SPI_MODE_MASTER;
|
spiHandle.Init.Mode = SPI_MODE_MASTER;
|
||||||
|
@ -34,9 +29,49 @@ void SPIClass::begin() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef SPI1
|
#ifdef SPI1
|
||||||
if (spiHandle.Instance== SPI1) {
|
if (spiHandle.Instance== SPI1) {
|
||||||
__HAL_RCC_SPI1_CLK_ENABLE();
|
__HAL_RCC_SPI1_CLK_ENABLE();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef SPI2
|
||||||
|
else if (spiHandle.Instance == SPI2) {
|
||||||
|
__HAL_RCC_SPI2_CLK_ENABLE();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef SPI3
|
||||||
|
else if (spiHandle.Instance == SPI3) {
|
||||||
|
__HAL_RCC_SPI3_CLK_ENABLE();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef SPI4
|
||||||
|
else if (spiHandle.Instance == SPI4) {
|
||||||
|
__HAL_RCC_SPI4_CLK_ENABLE();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef SPI5
|
||||||
|
else if (spiHandle.Instance == SPI5) {
|
||||||
|
__HAL_RCC_SPI5_CLK_ENABLE();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef SPI6
|
||||||
|
else if (spiHandle.Instance == SPI6) {
|
||||||
|
__HAL_RCC_SPI6_CLK_ENABLE();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//////////////// DMA
|
||||||
|
|
||||||
|
#if defined(STM32F1) || defined(STM32F4)
|
||||||
|
|
||||||
|
_DMA_Instance_Type *_StreamTX;
|
||||||
|
_DMA_Instance_Type *_StreamRX;
|
||||||
|
uint32_t _ChannelTX;
|
||||||
|
uint32_t _ChannelRX;
|
||||||
|
|
||||||
|
#ifdef SPI1
|
||||||
|
if (spiHandle.Instance== SPI1) {
|
||||||
_StreamTX = SPIx_DMA(SPI1_StreamTX);
|
_StreamTX = SPIx_DMA(SPI1_StreamTX);
|
||||||
_StreamRX = SPIx_DMA(SPI1_StreamRX);
|
_StreamRX = SPIx_DMA(SPI1_StreamRX);
|
||||||
_ChannelTX = SPI1_ChannelTX;
|
_ChannelTX = SPI1_ChannelTX;
|
||||||
|
@ -49,7 +84,6 @@ void SPIClass::begin() {
|
||||||
#endif
|
#endif
|
||||||
#ifdef SPI2
|
#ifdef SPI2
|
||||||
else if (spiHandle.Instance == SPI2) {
|
else if (spiHandle.Instance == SPI2) {
|
||||||
__HAL_RCC_SPI2_CLK_ENABLE();
|
|
||||||
_StreamTX = SPIx_DMA(SPI2_StreamTX);
|
_StreamTX = SPIx_DMA(SPI2_StreamTX);
|
||||||
_StreamRX = SPIx_DMA(SPI2_StreamRX);
|
_StreamRX = SPIx_DMA(SPI2_StreamRX);
|
||||||
_ChannelTX = SPI2_ChannelTX;
|
_ChannelTX = SPI2_ChannelTX;
|
||||||
|
@ -62,7 +96,6 @@ void SPIClass::begin() {
|
||||||
#endif
|
#endif
|
||||||
#ifdef SPI3
|
#ifdef SPI3
|
||||||
else if (spiHandle.Instance == SPI3) {
|
else if (spiHandle.Instance == SPI3) {
|
||||||
__HAL_RCC_SPI3_CLK_ENABLE();
|
|
||||||
_StreamTX = SPIx_DMA(SPI3_StreamTX);
|
_StreamTX = SPIx_DMA(SPI3_StreamTX);
|
||||||
_StreamRX = SPIx_DMA(SPI3_StreamRX);
|
_StreamRX = SPIx_DMA(SPI3_StreamRX);
|
||||||
_ChannelTX = SPI3_ChannelTX;
|
_ChannelTX = SPI3_ChannelTX;
|
||||||
|
@ -73,46 +106,7 @@ void SPIClass::begin() {
|
||||||
//_SPISetDmaIRQ(SPI3);
|
//_SPISetDmaIRQ(SPI3);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef SPI4
|
// TODO SPI4/5/6
|
||||||
else if (spiHandle.Instance == SPI4) {
|
|
||||||
__HAL_RCC_SPI4_CLK_ENABLE();
|
|
||||||
_StreamTX = SPIx_DMA(SPI4_StreamTX);
|
|
||||||
_StreamRX = SPIx_DMA(SPI4_StreamRX);
|
|
||||||
_ChannelTX = SPI4_ChannelTX;
|
|
||||||
_ChannelRX = SPI4_ChannelRX;
|
|
||||||
/*
|
|
||||||
* Not used yet, still just polling
|
|
||||||
*/
|
|
||||||
//_SPISetDmaIRQ(SPI4);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef SPI5
|
|
||||||
else if (spiHandle.Instance == SPI5) {
|
|
||||||
__HAL_RCC_SPI5_CLK_ENABLE();
|
|
||||||
_StreamTX = SPIx_DMA(SPI5_StreamTX);
|
|
||||||
_StreamRX = SPIx_DMA(SPI5_StreamRX);
|
|
||||||
_ChannelTX = SPI5_ChannelTX;
|
|
||||||
_ChannelRX = SPI5_ChannelRX;
|
|
||||||
/*
|
|
||||||
* Not used yet, still just polling
|
|
||||||
*/
|
|
||||||
//_SPISetDmaIRQ(SPI5);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef SPI6
|
|
||||||
else if (spiHandle.Instance == SPI6) {
|
|
||||||
__HAL_RCC_SPI6_CLK_ENABLE();
|
|
||||||
_StreamTX = SPIx_DMA(SPI6_StreamTX);
|
|
||||||
_StreamRX = SPIx_DMA(SPI6_StreamRX);
|
|
||||||
_ChannelTX = SPI6_ChannelTX;
|
|
||||||
_ChannelRX = SPI6_ChannelRX;
|
|
||||||
/*
|
|
||||||
* Not used yet, still just polling
|
|
||||||
*/
|
|
||||||
//_SPISetDmaIRQ(SPI6);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
hdma_spi_tx.Instance = _StreamTX;
|
hdma_spi_tx.Instance = _StreamTX;
|
||||||
hdma_spi_tx.Parent = &spiHandle;
|
hdma_spi_tx.Parent = &spiHandle;
|
||||||
|
@ -154,6 +148,8 @@ void SPIClass::begin() {
|
||||||
hdma_spi_rx.Init.PeriphBurst = DMA_PBURST_SINGLE;
|
hdma_spi_rx.Init.PeriphBurst = DMA_PBURST_SINGLE;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
stm32AfSPIInit(spiHandle.Instance, mosiPort, mosiPin, misoPort, misoPin, sckPort, sckPin);
|
stm32AfSPIInit(spiHandle.Instance, mosiPort, mosiPin, misoPort, misoPin, sckPort, sckPin);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -243,6 +239,9 @@ void SPIClass::stm32SetSCK(uint8_t sck) {
|
||||||
void SPIClass::stm32SetInstance(SPI_TypeDef *instance) {
|
void SPIClass::stm32SetInstance(SPI_TypeDef *instance) {
|
||||||
spiHandle.Instance = instance;
|
spiHandle.Instance = instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(STM32F1) || defined(STM32F4)
|
||||||
|
|
||||||
uint8_t SPIClass::dmaTransfer(uint8_t *transmitBuf, uint8_t *receiveBuf, uint16_t length) {
|
uint8_t SPIClass::dmaTransfer(uint8_t *transmitBuf, uint8_t *receiveBuf, uint16_t length) {
|
||||||
//HAL_SPI_TransmitReceive(&spiHandle, transmitBuf, receiveBuf, length, 1000);
|
//HAL_SPI_TransmitReceive(&spiHandle, transmitBuf, receiveBuf, length, 1000);
|
||||||
// DMA handles configured in Begin.
|
// DMA handles configured in Begin.
|
||||||
|
@ -287,3 +286,5 @@ uint8_t SPIClass::dmaSend(uint8_t *transmitBuf, uint16_t length, bool minc) {
|
||||||
spiHandle.State = HAL_SPI_STATE_READY;
|
spiHandle.State = HAL_SPI_STATE_READY;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue