From a0ed0340bc669626af5b8aced229a7fbbf0e94fc Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 26 Jun 2023 17:22:34 +0800 Subject: [PATCH] update --- app/Core/Inc/stm32f1xx_it.h | 2 ++ app/Core/Src/dma.c | 6 +++++ app/Core/Src/main.c | 2 +- app/Core/Src/spi.c | 49 ++++++++++++++++++++++++++++++++++----- app/Core/Src/stm32f1xx_it.c | 30 ++++++++++++++++++++++++ app/MDK-ARM/startup_stm32f103xb.s | 4 ++-- app/app.ioc | 40 ++++++++++++++++++++++++-------- src/board/project_board.hpp | 1 + src/umain.cpp | 43 ++++++++++++++++++++++++++++------ src/umain.hpp | 5 +++- 10 files changed, 155 insertions(+), 27 deletions(-) diff --git a/app/Core/Inc/stm32f1xx_it.h b/app/Core/Inc/stm32f1xx_it.h index eb58f6a..8789548 100644 --- a/app/Core/Inc/stm32f1xx_it.h +++ b/app/Core/Inc/stm32f1xx_it.h @@ -55,6 +55,8 @@ void SVC_Handler(void); void DebugMon_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); +void DMA1_Channel2_IRQHandler(void); +void DMA1_Channel3_IRQHandler(void); void DMA1_Channel4_IRQHandler(void); void DMA1_Channel5_IRQHandler(void); void USB_HP_CAN1_TX_IRQHandler(void); diff --git a/app/Core/Src/dma.c b/app/Core/Src/dma.c index 33d197d..760790b 100644 --- a/app/Core/Src/dma.c +++ b/app/Core/Src/dma.c @@ -43,6 +43,12 @@ void MX_DMA_Init(void) __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ + /* DMA1_Channel2_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); + /* DMA1_Channel3_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn); /* DMA1_Channel4_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn); diff --git a/app/Core/Src/main.c b/app/Core/Src/main.c index 6935092..4c21d05 100644 --- a/app/Core/Src/main.c +++ b/app/Core/Src/main.c @@ -91,7 +91,7 @@ int main(void) /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); - // MX_IWDG_Init(); + MX_IWDG_Init(); MX_USART2_UART_Init(); MX_TIM4_Init(); MX_CAN_Init(); diff --git a/app/Core/Src/spi.c b/app/Core/Src/spi.c index 9b28fd3..b9bc239 100644 --- a/app/Core/Src/spi.c +++ b/app/Core/Src/spi.c @@ -26,6 +26,8 @@ SPI_HandleTypeDef hspi1; SPI_HandleTypeDef hspi2; +DMA_HandleTypeDef hdma_spi1_rx; +DMA_HandleTypeDef hdma_spi1_tx; DMA_HandleTypeDef hdma_spi2_tx; DMA_HandleTypeDef hdma_spi2_rx; @@ -41,13 +43,12 @@ void MX_SPI1_Init(void) /* USER CODE END SPI1_Init 1 */ hspi1.Instance = SPI1; - hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Mode = SPI_MODE_SLAVE; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; @@ -113,15 +114,48 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) PA7 ------> SPI1_MOSI */ GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_6; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + /* SPI1 DMA Init */ + /* SPI1_RX Init */ + hdma_spi1_rx.Instance = DMA1_Channel2; + hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE; + hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_spi1_rx.Init.Mode = DMA_NORMAL; + hdma_spi1_rx.Init.Priority = DMA_PRIORITY_LOW; + if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(spiHandle,hdmarx,hdma_spi1_rx); + + /* SPI1_TX Init */ + hdma_spi1_tx.Instance = DMA1_Channel3; + hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE; + hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_spi1_tx.Init.Mode = DMA_NORMAL; + hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW; + if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(spiHandle,hdmatx,hdma_spi1_tx); + /* USER CODE BEGIN SPI1_MspInit 1 */ /* USER CODE END SPI1_MspInit 1 */ @@ -207,6 +241,9 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); + /* SPI1 DMA DeInit */ + HAL_DMA_DeInit(spiHandle->hdmarx); + HAL_DMA_DeInit(spiHandle->hdmatx); /* USER CODE BEGIN SPI1_MspDeInit 1 */ /* USER CODE END SPI1_MspDeInit 1 */ diff --git a/app/Core/Src/stm32f1xx_it.c b/app/Core/Src/stm32f1xx_it.c index ddf0499..63cc005 100644 --- a/app/Core/Src/stm32f1xx_it.c +++ b/app/Core/Src/stm32f1xx_it.c @@ -56,6 +56,8 @@ /* External variables --------------------------------------------------------*/ extern CAN_HandleTypeDef hcan; +extern DMA_HandleTypeDef hdma_spi1_rx; +extern DMA_HandleTypeDef hdma_spi1_tx; extern DMA_HandleTypeDef hdma_spi2_tx; extern DMA_HandleTypeDef hdma_spi2_rx; extern TIM_HandleTypeDef htim2; @@ -202,6 +204,34 @@ void SysTick_Handler(void) /******************************************************************************/ /** + * @brief This function handles DMA1 channel2 global interrupt. + */ +void DMA1_Channel2_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */ + + /* USER CODE END DMA1_Channel2_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_spi1_rx); + /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */ + + /* USER CODE END DMA1_Channel2_IRQn 1 */ +} + +/** + * @brief This function handles DMA1 channel3 global interrupt. + */ +void DMA1_Channel3_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Channel3_IRQn 0 */ + + /* USER CODE END DMA1_Channel3_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_spi1_tx); + /* USER CODE BEGIN DMA1_Channel3_IRQn 1 */ + + /* USER CODE END DMA1_Channel3_IRQn 1 */ +} + +/** * @brief This function handles DMA1 channel4 global interrupt. */ void DMA1_Channel4_IRQHandler(void) diff --git a/app/MDK-ARM/startup_stm32f103xb.s b/app/MDK-ARM/startup_stm32f103xb.s index f13f993..fd82d4f 100644 --- a/app/MDK-ARM/startup_stm32f103xb.s +++ b/app/MDK-ARM/startup_stm32f103xb.s @@ -29,7 +29,7 @@ ; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; -Stack_Size EQU 0x1000 +Stack_Size EQU 0x400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size @@ -40,7 +40,7 @@ __initial_sp ; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; -Heap_Size EQU 0x2000 +Heap_Size EQU 0x200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base diff --git a/app/app.ioc b/app/app.ioc index 11a4e3f..38c5944 100644 --- a/app/app.ioc +++ b/app/app.ioc @@ -16,7 +16,27 @@ CAN.SJW=CAN_SJW_3TQ CAN.TTCM=ENABLE Dma.Request0=SPI2_TX Dma.Request1=SPI2_RX -Dma.RequestsNb=2 +Dma.Request2=SPI1_RX +Dma.Request3=SPI1_TX +Dma.RequestsNb=4 +Dma.SPI1_RX.2.Direction=DMA_PERIPH_TO_MEMORY +Dma.SPI1_RX.2.Instance=DMA1_Channel2 +Dma.SPI1_RX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.SPI1_RX.2.MemInc=DMA_MINC_ENABLE +Dma.SPI1_RX.2.Mode=DMA_NORMAL +Dma.SPI1_RX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.SPI1_RX.2.PeriphInc=DMA_PINC_DISABLE +Dma.SPI1_RX.2.Priority=DMA_PRIORITY_LOW +Dma.SPI1_RX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority +Dma.SPI1_TX.3.Direction=DMA_MEMORY_TO_PERIPH +Dma.SPI1_TX.3.Instance=DMA1_Channel3 +Dma.SPI1_TX.3.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.SPI1_TX.3.MemInc=DMA_MINC_ENABLE +Dma.SPI1_TX.3.Mode=DMA_NORMAL +Dma.SPI1_TX.3.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.SPI1_TX.3.PeriphInc=DMA_PINC_DISABLE +Dma.SPI1_TX.3.Priority=DMA_PRIORITY_LOW +Dma.SPI1_TX.3.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority Dma.SPI2_RX.1.Direction=DMA_PERIPH_TO_MEMORY Dma.SPI2_RX.1.Instance=DMA1_Channel4 Dma.SPI2_RX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE @@ -91,6 +111,8 @@ MxDb.Version=DB.6.0.70 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.CAN1_RX1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.CAN1_SCE_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.DMA1_Channel2_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true +NVIC.DMA1_Channel3_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true NVIC.DMA1_Channel4_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true NVIC.DMA1_Channel5_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false @@ -118,11 +140,11 @@ PA2.Mode=Asynchronous PA2.Signal=USART2_TX PA3.Mode=Asynchronous PA3.Signal=USART2_RX -PA5.Mode=Full_Duplex_Master +PA5.Mode=Full_Duplex_Slave PA5.Signal=SPI1_SCK -PA6.Mode=Full_Duplex_Master +PA6.Mode=Full_Duplex_Slave PA6.Signal=SPI1_MISO -PA7.Mode=Full_Duplex_Master +PA7.Mode=Full_Duplex_Slave PA7.Signal=SPI1_MOSI PB10.Mode=Asynchronous PB10.Signal=USART3_TX @@ -176,7 +198,7 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=MDK-ARM V5.32 ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_IWDG_Init-IWDG-false-HAL-true,5-MX_USART2_UART_Init-USART2-false-HAL-true,6-MX_TIM4_Init-TIM4-false-HAL-true,7-MX_CAN_Init-CAN-false-HAL-true,8-MX_SPI1_Init-SPI1-false-HAL-true,9-MX_USART1_UART_Init-USART1-false-HAL-true,10-MX_USART3_UART_Init-USART3-false-HAL-true,11-MX_SPI2_Init-SPI2-false-HAL-true +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_IWDG_Init-IWDG-false-HAL-true,5-MX_USART2_UART_Init-USART2-false-HAL-true,6-MX_TIM4_Init-TIM4-false-HAL-true,7-MX_CAN_Init-CAN-false-HAL-true,8-MX_SPI1_Init-SPI1-false-HAL-true,9-MX_USART1_UART_Init-USART1-false-HAL-true,10-MX_USART3_UART_Init-USART3-false-HAL-true,11-MX_SPI2_Init-SPI2-false-HAL-true,12-MX_TIM2_Init-TIM2-false-HAL-true RCC.ADCFreqValue=36000000 RCC.AHBFreq_Value=72000000 RCC.APB1CLKDivider=RCC_HCLK_DIV2 @@ -198,14 +220,12 @@ RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK RCC.TimSysFreq_Value=72000000 RCC.USBFreq_Value=72000000 RCC.VCOOutput2Freq_Value=8000000 -SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_32 SPI1.CLKPhase=SPI_PHASE_2EDGE SPI1.CLKPolarity=SPI_POLARITY_HIGH -SPI1.CalculateBaudRate=2.25 MBits/s SPI1.Direction=SPI_DIRECTION_2LINES -SPI1.IPParameters=VirtualType,Mode,Direction,BaudRatePrescaler,CalculateBaudRate,CLKPolarity,CLKPhase -SPI1.Mode=SPI_MODE_MASTER -SPI1.VirtualType=VM_MASTER +SPI1.IPParameters=VirtualType,Mode,Direction,CLKPolarity,CLKPhase +SPI1.Mode=SPI_MODE_SLAVE +SPI1.VirtualType=VM_SLAVE SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16 SPI2.CLKPhase=SPI_PHASE_2EDGE SPI2.CLKPolarity=SPI_POLARITY_HIGH diff --git a/src/board/project_board.hpp b/src/board/project_board.hpp index aa5b030..f2b824e 100644 --- a/src/board/project_board.hpp +++ b/src/board/project_board.hpp @@ -13,3 +13,4 @@ +#define SLAVE_SPI hspi1 \ No newline at end of file diff --git a/src/umain.cpp b/src/umain.cpp index e23bfff..4008927 100644 --- a/src/umain.cpp +++ b/src/umain.cpp @@ -8,6 +8,8 @@ using namespace iflytop; using namespace std; +#define SPI_SLAVE_GPIO PA4 + /******************************************************************************* * CODE BEGIN * *******************************************************************************/ @@ -65,6 +67,27 @@ void Main::onTimerCallbackIRQ(STM32_TIM *tim) { m_voiceCacheQueue.push(&voice); } +void Main::STM32_GPIO_onIRQ(STM32_GPIO *GPIO_Pin, STM32_GPIO::IrqTypeEvent_t irqevent) { + if (GPIO_Pin == &SPI_SLAVE_GPIO) { + // SPI SLAVE 片选信号触发 + static int32_t voicebuf[100 + 1]; + HAL_SPI_DMAStop(&SLAVE_SPI); + memset(voicebuf, 0, sizeof(voicebuf)); + if (m_voiceCacheQueue.numElements() < 100) { + /** + * @brief 语音还不足一包 + */ + HAL_SPI_Transmit_DMA(&SLAVE_SPI, (uint8_t *)voicebuf, 101 * sizeof(int32_t)); + } else { + voicebuf[0] = 100; + for (int i = 0; i < 100; i++) { + m_voiceCacheQueue.pop(&voicebuf[i + 1]); + } + HAL_SPI_Transmit_DMA(&SLAVE_SPI, (uint8_t *)voicebuf, 101 * sizeof(int32_t)); + } + } +} + void Main::main(int argc, char const *argv[]) { sys_loggger_enable(true); ZLOGI(TAG, "setup") @@ -89,15 +112,21 @@ void Main::main(int argc, char const *argv[]) { STM32_TIM2.startTimerByFreq(16000); } - static int32_t voicebuf[800]; - while (m_voiceCacheQueue.numElements() < 800) { - } - // - m_voiceCacheQueue.popMuti(voicebuf, 800); - for (size_t i = 0; i < 800; i++) { - printf("{plotter}%d\n", voicebuf[i]); + { + // 语音上传接口初始化 + SPI_SLAVE_GPIO.initAsInput(STM32_GPIO::kInput_fallingIrq, false); + SPI_SLAVE_GPIO.regListener(this); } + // static int32_t voicebuf[800]; + // while (m_voiceCacheQueue.numElements() < 800) { + // } + // // + // m_voiceCacheQueue.popMuti(voicebuf, 800); + // for (size_t i = 0; i < 800; i++) { + // printf("{plotter}%d\n", voicebuf[i]); + // } + #if 0 double voltage; diff --git a/src/umain.hpp b/src/umain.hpp index 49d07e8..3906d2b 100644 --- a/src/umain.hpp +++ b/src/umain.hpp @@ -27,7 +27,9 @@ namespace iflytop { class __class {}; -class Main : public __class, public STM32_TIM_LISTENER { +class Main : public __class, // + public STM32_TIM_LISTENER, // + public STM32_GPIO_LISTENER { public: Hardware m_hardware; @@ -44,6 +46,7 @@ class Main : public __class, public STM32_TIM_LISTENER { * OVERRIDE STM32_TIM_LISTENER * *******************************************************************************/ virtual void onTimerCallbackIRQ(STM32_TIM *tim); + virtual void STM32_GPIO_onIRQ(STM32_GPIO *GPIO_Pin, STM32_GPIO::IrqTypeEvent_t irqevent); private: void generateScheduleTicket();