小淼博客

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、安装部署STM开发环境

1. 安装 STM32CubeMX

     STM32CubeMX 作为一款图形化工具用于配置 STM32 设备,该软件非常方便地为用户生成 Cotex-M/A 系列微处理器或ARM处理器的外围设备初始化 C 代码或设备树。

STM32CubeMX is a graphical tool used to configure any STM32 device. This easy-to-use graphical user interface generates the initialization C-code for Cortex-M cores and generates the Linux Device Tree for Cortex-A cores.

2. 安装 STM32CubeIDE

     STM32CubeIDE 是一款STM32集成开发环境软件,软件基于开源的 Eclipse 框架和 GNU C/C++ 工具链,包含了编译报告功能以及高级仿真调试功能,支持了 STM32 的其他生态软件开发系统,例如从 STM32CubeMX 软件生成的硬件和软件初始化工程。

STM32CubeIDE is an Integrated Development Environment. Based on open-source solutions like Eclipse or the GNU C/C++ toolchain, this IDE includes compilation reporting features and advanced debug features. It also integrates additional features present in other tools from the ecosystem, such as the HW and SW initialization and code generation from STM32CubeMX.

3. 安装 STM32CubeProgrammer

     STM32CubeProgrammer 是一款易用且高效的STM32烧录软件,能够通过调试接口例如 (JTAG and SWD) 用于读取、写入、验证设备存储空间的软件。

STM32CubeProgrammer provides an easy-to-use and efficient environment for reading, writing and verifying device memory through both the debug interface (JTAG and SWD) and the bootloader interface (UART and USB).

二、STM32CubeMX 配置

1. 软件界面配置

配置系统硬件 + MiddleSoftware(FreeRTOS) 系统底层硬件始终配置

2. 生成的配置文件

a. Configure Table

  • ADC
  • DMA
  • FREERTOS
  • GPIO
  • IWDG
  • NVIC
  • PDM2PCM
  • RCC
  • RTC
  • SPI1
  • SPI2
  • SYS
  • TIM1
  • TIM4
  • TIM10
  • USART1
  • USART6
  • WWDG
  • X-CUBE-ALGOBUILD

b. File Content

点击查看代码
#MicroXplorer Configuration settings - do not modify
ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_0
ADC1.IPParameters=Rank-0\#ChannelRegularConversion,master,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,NbrOfConversionFlag
ADC1.NbrOfConversionFlag=1
ADC1.Rank-0\#ChannelRegularConversion=1
ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_3CYCLES
ADC1.master=1
CAD.formats=
CAD.pinconfig=
CAD.provider=
Dma.MEMTOMEM.0.Direction=DMA_MEMORY_TO_MEMORY
Dma.MEMTOMEM.0.FIFOMode=DMA_FIFOMODE_ENABLE
Dma.MEMTOMEM.0.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL
Dma.MEMTOMEM.0.Instance=DMA2_Stream0
Dma.MEMTOMEM.0.MemBurst=DMA_MBURST_SINGLE
Dma.MEMTOMEM.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.MEMTOMEM.0.MemInc=DMA_MINC_ENABLE
Dma.MEMTOMEM.0.Mode=DMA_NORMAL
Dma.MEMTOMEM.0.PeriphBurst=DMA_PBURST_SINGLE
Dma.MEMTOMEM.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.MEMTOMEM.0.PeriphInc=DMA_PINC_ENABLE
Dma.MEMTOMEM.0.Priority=DMA_PRIORITY_HIGH
Dma.MEMTOMEM.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode,FIFOThreshold,MemBurst,PeriphBurst
Dma.Request0=MEMTOMEM
Dma.RequestsNb=1
FREERTOS.BinarySemaphores01=myBinarySem01,Dynamic,NULL;myBinarySem02,Dynamic,NULL
FREERTOS.CountingSemaphores01=myCountingSem01,2,Dynamic,NULL
FREERTOS.FootprintOK=true
FREERTOS.INCLUDE_eTaskGetState=1
FREERTOS.INCLUDE_pcTaskGetTaskName=1
FREERTOS.INCLUDE_vTaskCleanUpResources=1
FREERTOS.INCLUDE_vTaskDelayUntil=1
FREERTOS.INCLUDE_xQueueGetMutexHolder=1
FREERTOS.INCLUDE_xSemaphoreGetMutexHolder=1
FREERTOS.INCLUDE_xTaskGetCurrentTaskHandle=1
FREERTOS.INCLUDE_xTaskGetHandle=1
FREERTOS.IPParameters=Tasks01,configENABLE_FPU,configUSE_COUNTING_SEMAPHORES,configGENERATE_RUN_TIME_STATS,BinarySemaphores01,CountingSemaphores01,INCLUDE_vTaskCleanUpResources,INCLUDE_xQueueGetMutexHolder,INCLUDE_xSemaphoreGetMutexHolder,INCLUDE_pcTaskGetTaskName,INCLUDE_xTaskGetCurrentTaskHandle,INCLUDE_eTaskGetState,INCLUDE_xTaskGetHandle,INCLUDE_vTaskDelayUntil,Mutexes01,Queues01,FootprintOK,configUSE_RECURSIVE_MUTEXES,RecursiveMutexes01,configRECORD_STACK_HIGH_ADDRESS,configUSE_NEWLIB_REENTRANT
FREERTOS.Mutexes01=myMutex01,Dynamic,NULL;myMutex02,Dynamic,NULL;myMutex03,Dynamic,NULL
FREERTOS.Queues01=myQueue01,16,uint16_t,0,Dynamic,NULL,NULL;myQueue02,16,uint16_t,0,Dynamic,NULL,NULL
FREERTOS.RecursiveMutexes01=myRecursiveMutex01,Dynamic,NULL
FREERTOS.Tasks01=defaultTask,0,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;myTask02,-3,128,StartTask02,Default,NULL,Dynamic,NULL,NULL;myTask03,-3,128,StartTask03,Default,NULL,Dynamic,NULL,NULL
FREERTOS.configENABLE_FPU=1
FREERTOS.configGENERATE_RUN_TIME_STATS=1
FREERTOS.configRECORD_STACK_HIGH_ADDRESS=1
FREERTOS.configUSE_COUNTING_SEMAPHORES=1
FREERTOS.configUSE_NEWLIB_REENTRANT=1
FREERTOS.configUSE_RECURSIVE_MUTEXES=1
File.Version=6
GPIO.groupedBy=Group By Peripherals
KeepUserPlacement=false
Mcu.CPN=STM32F401CCU6
Mcu.Family=STM32F4
Mcu.IP0=ADC1
Mcu.IP1=CRC
Mcu.IP10=SPI2
Mcu.IP11=SYS
Mcu.IP12=TIM1
Mcu.IP13=TIM4
Mcu.IP14=TIM10
Mcu.IP15=USART1
Mcu.IP16=USART6
Mcu.IP17=WWDG
Mcu.IP2=DMA
Mcu.IP3=FREERTOS
Mcu.IP4=IWDG
Mcu.IP5=NVIC
Mcu.IP6=PDM2PCM
Mcu.IP7=RCC
Mcu.IP8=RTC
Mcu.IP9=SPI1
Mcu.IPNb=18
Mcu.Name=STM32F401C(B-C)Ux
Mcu.Package=UFQFPN48
Mcu.Pin0=PC13-ANTI_TAMP
Mcu.Pin1=PC14-OSC32_IN
Mcu.Pin10=PA5
Mcu.Pin11=PA6
Mcu.Pin12=PA7
Mcu.Pin13=PB0
Mcu.Pin14=PB1
Mcu.Pin15=PB2
Mcu.Pin16=PB10
Mcu.Pin17=PB12
Mcu.Pin18=PB13
Mcu.Pin19=PB14
Mcu.Pin2=PC15-OSC32_OUT
Mcu.Pin20=PB15
Mcu.Pin21=PA8
Mcu.Pin22=PA9
Mcu.Pin23=PA10
Mcu.Pin24=PA11
Mcu.Pin25=PA12
Mcu.Pin26=PA13
Mcu.Pin27=PA14
Mcu.Pin28=PB3
Mcu.Pin29=PB4
Mcu.Pin3=PH0 - OSC_IN
Mcu.Pin30=PB6
Mcu.Pin31=PB7
Mcu.Pin32=PB8
Mcu.Pin33=VP_ADC1_Vref_Input
Mcu.Pin34=VP_ADC1_Vbat_Input
Mcu.Pin35=VP_CRC_VS_CRC
Mcu.Pin36=VP_FREERTOS_VS_CMSIS_V1
Mcu.Pin37=VP_IWDG_VS_IWDG
Mcu.Pin38=VP_PDM2PCM_VS_PDM2PCM
Mcu.Pin39=VP_RTC_VS_RTC_Activate
Mcu.Pin4=PH1 - OSC_OUT
Mcu.Pin40=VP_RTC_VS_RTC_WakeUp_intern
Mcu.Pin41=VP_SYS_VS_tim2
Mcu.Pin42=VP_TIM1_VS_ClockSourceINT
Mcu.Pin43=VP_TIM1_VS_ClockSourceITR
Mcu.Pin44=VP_TIM4_VS_ClockSourceITR
Mcu.Pin45=VP_TIM10_VS_ClockSourceINT
Mcu.Pin46=VP_WWDG_VS_WWDG
Mcu.Pin47=VP_STMicroelectronics.X-CUBE-ALGOBUILD_VS_MotionOoLibrariesJjLibrary_1.3.0_1.3.0
Mcu.Pin48=VP_STMicroelectronics.X-CUBE-ALGOBUILD_VS_DSPOoLibraryJjLibrary_1.3.0_1.3.0
Mcu.Pin5=PA0-WKUP
Mcu.Pin6=PA1
Mcu.Pin7=PA2
Mcu.Pin8=PA3
Mcu.Pin9=PA4
Mcu.PinsNb=49
Mcu.ThirdParty0=STMicroelectronics.X-CUBE-ALGOBUILD.1.3.0
Mcu.ThirdPartyNb=1
Mcu.UserConstants=RCC_Clock,100;RCC_Handle,$$_RCC_IP_HANDLE_$$
Mcu.UserName=STM32F401CCUx
MxCube.Version=6.9.1
MxDb.Version=DB.6.0.91
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.DMA2_Stream0_IRQn=true\:5\:0\:false\:true\:true\:3\:true\:true\:true\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.FLASH_IRQn=true\:5\:0\:false\:true\:true\:1\:true\:true\:true\:true
NVIC.FPU_IRQn=true\:5\:0\:false\:true\:true\:4\:true\:true\:false\:true
NVIC.ForceEnableDMAVector=true
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false\:false
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.RCC_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:false\:true
NVIC.SPI1_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.SPI2_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false\:false
NVIC.SavedPendsvIrqHandlerGenerated=true
NVIC.SavedSvcallIrqHandlerGenerated=true
NVIC.SavedSystickIrqHandlerGenerated=true
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:true\:false
NVIC.TIM2_IRQn=true\:15\:0\:false\:false\:true\:false\:false\:true\:true
NVIC.TIM4_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.TimeBase=TIM2_IRQn
NVIC.TimeBaseIP=TIM2
NVIC.USART1_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.USART6_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.WWDG_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
PA0-WKUP.Signal=ADCx_IN0
PA1.Signal=ADCx_IN1
PA10.Mode=Asynchronous
PA10.Signal=USART1_RX
PA11.Mode=Asynchronous
PA11.Signal=USART6_TX
PA12.Mode=Asynchronous
PA12.Signal=USART6_RX
PA13.Mode=Serial_Wire
PA13.Signal=SYS_JTMS-SWDIO
PA14.Mode=Serial_Wire
PA14.Signal=SYS_JTCK-SWCLK
PA2.Signal=ADCx_IN2
PA3.Signal=ADCx_IN3
PA4.Signal=ADCx_IN4
PA5.Signal=ADCx_IN5
PA6.Signal=ADCx_IN6
PA7.Signal=ADCx_IN7
PA8.Mode=Clock-out-1
PA8.Signal=RCC_MCO_1
PA9.Mode=Asynchronous
PA9.Signal=USART1_TX
PB0.Signal=ADCx_IN8
PB1.GPIOParameters=GPIO_Speed,PinState,GPIO_PuPd
PB1.GPIO_PuPd=GPIO_PULLUP
PB1.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PB1.Locked=true
PB1.PinState=GPIO_PIN_RESET
PB1.Signal=GPIO_Output
PB10.Mode=Full_Duplex_Master
PB10.Signal=SPI2_SCK
PB12.Mode=NSS_Signal_Hard_Output
PB12.Signal=SPI2_NSS
PB13.Locked=true
PB13.Signal=GPXTI13
PB14.Mode=Full_Duplex_Master
PB14.Signal=SPI2_MISO
PB15.Mode=Full_Duplex_Master
PB15.Signal=SPI2_MOSI
PB2.GPIOParameters=GPIO_Speed,GPIO_PuPd
PB2.GPIO_PuPd=GPIO_PULLUP
PB2.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PB2.Locked=true
PB2.Signal=GPIO_Output
PB3.Mode=RX_Only_Simplex_Unidirect_Master
PB3.Signal=SPI1_SCK
PB4.Mode=RX_Only_Simplex_Unidirect_Master
PB4.Signal=SPI1_MISO
PB6.Signal=S_TIM4_CH1
PB7.Signal=S_TIM4_CH2
PB8.Signal=S_TIM10_CH1
PC13-ANTI_TAMP.GPIOParameters=GPIO_Speed
PC13-ANTI_TAMP.GPIO_Speed=GPIO_SPEED_FREQ_LOW
PC13-ANTI_TAMP.Locked=true
PC13-ANTI_TAMP.Signal=GPIO_Output
PC14-OSC32_IN.Mode=LSE-External-Oscillator
PC14-OSC32_IN.Signal=RCC_OSC32_IN
PC15-OSC32_OUT.Mode=LSE-External-Oscillator
PC15-OSC32_OUT.Signal=RCC_OSC32_OUT
PH0\ -\ OSC_IN.Mode=HSE-External-Oscillator
PH0\ -\ OSC_IN.Signal=RCC_OSC_IN
PH1\ -\ OSC_OUT.Mode=HSE-External-Oscillator
PH1\ -\ OSC_OUT.Signal=RCC_OSC_OUT
PinOutPanel.RotationAngle=0
ProjectManager.AskForMigrate=true
ProjectManager.BackupPrevious=false
ProjectManager.CompilerOptimize=6
ProjectManager.ComputerToolchain=false
ProjectManager.CoupleFile=true
ProjectManager.CustomerFirmwarePackage=
ProjectManager.DefaultFWLocation=true
ProjectManager.DeletePrevious=true
ProjectManager.DeviceId=STM32F401CCUx
ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.27.1
ProjectManager.FreePins=false
ProjectManager.HalAssertFull=false
ProjectManager.HeapSize=0x200
ProjectManager.KeepUserCode=true
ProjectManager.LastFirmware=true
ProjectManager.LibraryCopy=1
ProjectManager.MainLocation=Core/Src
ProjectManager.MultiThreaded=true
ProjectManager.NoMain=false
ProjectManager.PreviousToolchain=STM32CubeIDE
ProjectManager.ProjectBuild=false
ProjectManager.ProjectFileName=New Folder.ioc
ProjectManager.ProjectName=New Folder
ProjectManager.ProjectStructure=
ProjectManager.RegisterCallBack=ADC,I2C,RTC,SPI,TIM,UART,USART,WWDG
ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=STM32CubeIDE
ProjectManager.ThreadSafeStrategy=Cortex-M4NS\:Default,
ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=true
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_DMA_Init-DMA-false-HAL-true,3-MX_GPIO_Init-GPIO-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_CRC_Init-CRC-false-HAL-true,6-MX_IWDG_Init-IWDG-false-HAL-true,7-MX_RTC_Init-RTC-false-HAL-true,8-MX_SPI1_Init-SPI1-false-HAL-true,9-MX_SPI2_Init-SPI2-false-HAL-true,10-MX_TIM1_Init-TIM1-false-HAL-true,11-MX_TIM4_Init-TIM4-false-HAL-true,12-MX_TIM10_Init-TIM10-false-HAL-true,13-MX_USART1_UART_Init-USART1-false-HAL-true,14-MX_USART6_UART_Init-USART6-false-HAL-true,15-MX_WWDG_Init-WWDG-false-HAL-true,16-MX_PDM2PCM_Init-PDM2PCM-false-HAL-false
RCC.48MHZClocksFreq_Value=80000000
RCC.AHBFreq_Value=80000000
RCC.APB1CLKDivider=RCC_HCLK_DIV2
RCC.APB1Freq_Value=40000000
RCC.APB1TimFreq_Value=80000000
RCC.APB2Freq_Value=80000000
RCC.APB2TimFreq_Value=80000000
RCC.CortexFreq_Value=80000000
RCC.FCLKCortexFreq_Value=80000000
RCC.HCLKFreq_Value=80000000
RCC.HSE_VALUE=25000000
RCC.HSI_VALUE=16000000
RCC.I2SClocksFreq_Value=120000000
RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,MCO1PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLP,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_MCO1Source,RCC_RTC_Clock_Source,RCC_RTC_Clock_SourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
RCC.LSI_VALUE=32000
RCC.MCO1PinFreq_Value=80000000
RCC.PLLCLKFreq_Value=80000000
RCC.PLLM=20
RCC.PLLN=256
RCC.PLLP=RCC_PLLP_DIV4
RCC.PLLQCLKFreq_Value=80000000
RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE
RCC.RCC_MCO1Source=RCC_MCO1SOURCE_PLLCLK
RCC.RCC_RTC_Clock_Source=RCC_RTCCLKSOURCE_LSE
RCC.RCC_RTC_Clock_SourceVirtual=RCC_RTCCLKSOURCE_LSE
RCC.RTCFreq_Value=32768
RCC.RTCHSEDivFreq_Value=12500000
RCC.SYSCLKFreq_VALUE=80000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
RCC.VCOI2SOutputFreq_Value=240000000
RCC.VCOInputFreq_Value=1250000
RCC.VCOOutputFreq_Value=320000000
RCC.VcooutputI2S=120000000
SH.ADCx_IN0.0=ADC1_IN0,IN0
SH.ADCx_IN0.ConfNb=1
SH.ADCx_IN1.0=ADC1_IN1,IN1
SH.ADCx_IN1.ConfNb=1
SH.ADCx_IN2.0=ADC1_IN2,IN2
SH.ADCx_IN2.ConfNb=1
SH.ADCx_IN3.0=ADC1_IN3,IN3
SH.ADCx_IN3.ConfNb=1
SH.ADCx_IN4.0=ADC1_IN4,IN4
SH.ADCx_IN4.ConfNb=1
SH.ADCx_IN5.0=ADC1_IN5,IN5
SH.ADCx_IN5.ConfNb=1
SH.ADCx_IN6.0=ADC1_IN6,IN6
SH.ADCx_IN6.ConfNb=1
SH.ADCx_IN7.0=ADC1_IN7,IN7
SH.ADCx_IN7.ConfNb=1
SH.ADCx_IN8.0=ADC1_IN8,IN8
SH.ADCx_IN8.ConfNb=1
SH.GPXTI13.0=GPIO_EXTI13
SH.GPXTI13.ConfNb=1
SH.S_TIM10_CH1.0=TIM10_CH1,PWM Generation1 CH1
SH.S_TIM10_CH1.ConfNb=1
SH.S_TIM4_CH1.0=TIM4_CH1,PWM Generation1 CH1
SH.S_TIM4_CH1.ConfNb=1
SH.S_TIM4_CH2.0=TIM4_CH2,PWM Generation2 CH2
SH.S_TIM4_CH2.ConfNb=1
SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2
SPI1.CLKPolarity=SPI_POLARITY_HIGH
SPI1.CRCCalculation=SPI_CRCCALCULATION_DISABLE
SPI1.CalculateBaudRate=40.0 MBits/s
SPI1.Direction=SPI_DIRECTION_2LINES_RXONLY
SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,CLKPolarity,CRCCalculation,BaudRatePrescaler
SPI1.Mode=SPI_MODE_MASTER
SPI1.VirtualType=VM_MASTER
SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2
SPI2.CalculateBaudRate=20.0 MBits/s
SPI2.Direction=SPI_DIRECTION_2LINES
SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,VirtualNSS,BaudRatePrescaler
SPI2.Mode=SPI_MODE_MASTER
SPI2.VirtualNSS=VM_NSSHARD
SPI2.VirtualType=VM_MASTER
STMicroelectronics.X-CUBE-ALGOBUILD.1.3.0.DSPOoLibraryJjLibrary_Checked=true
STMicroelectronics.X-CUBE-ALGOBUILD.1.3.0.IPParameters=LibraryCcMotionOoLibrariesJjMotionOoLibraries,LibraryCcDSPOoLibraryJjDSPOoLibrary
STMicroelectronics.X-CUBE-ALGOBUILD.1.3.0.LibraryCcDSPOoLibraryJjDSPOoLibrary=true
STMicroelectronics.X-CUBE-ALGOBUILD.1.3.0.LibraryCcMotionOoLibrariesJjMotionOoLibraries=true
STMicroelectronics.X-CUBE-ALGOBUILD.1.3.0.MotionOoLibrariesJjLibrary_Checked=true
STMicroelectronics.X-CUBE-ALGOBUILD.1.3.0_SwParameter=LibraryCcDSPOoLibraryJjDSPOoLibrary\:true;LibraryCcMotionOoLibrariesJjMotionOoLibraries\:true;
TIM1.ClockDivision=TIM_CLOCKDIVISION_DIV1
TIM1.IPParameters=ClockDivision
TIM10.Channel=TIM_CHANNEL_1
TIM10.ClockDivision=TIM_CLOCKDIVISION_DIV2
TIM10.IPParameters=Channel,Pulse,Period,ClockDivision
TIM10.Period=50000
TIM10.Pulse=20000
TIM4.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM4.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM4.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Pulse-PWM Generation1 CH1
TIM4.Pulse-PWM\ Generation1\ CH1=30000
USART1.IPParameters=VirtualMode
USART1.VirtualMode=VM_ASYNC
USART6.IPParameters=VirtualMode
USART6.VirtualMode=VM_ASYNC
VP_ADC1_Vbat_Input.Mode=IN-Vbat
VP_ADC1_Vbat_Input.Signal=ADC1_Vbat_Input
VP_ADC1_Vref_Input.Mode=IN-Vrefint
VP_ADC1_Vref_Input.Signal=ADC1_Vref_Input
VP_CRC_VS_CRC.Mode=CRC_Activate
VP_CRC_VS_CRC.Signal=CRC_VS_CRC
VP_FREERTOS_VS_CMSIS_V1.Mode=CMSIS_V1
VP_FREERTOS_VS_CMSIS_V1.Signal=FREERTOS_VS_CMSIS_V1
VP_IWDG_VS_IWDG.Mode=IWDG_Activate
VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG
VP_PDM2PCM_VS_PDM2PCM.Mode=PDM2PCM_Channel
VP_PDM2PCM_VS_PDM2PCM.Signal=PDM2PCM_VS_PDM2PCM
VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled
VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate
VP_RTC_VS_RTC_WakeUp_intern.Mode=WakeUp
VP_RTC_VS_RTC_WakeUp_intern.Signal=RTC_VS_RTC_WakeUp_intern
VP_STMicroelectronics.X-CUBE-ALGOBUILD_VS_DSPOoLibraryJjLibrary_1.3.0_1.3.0.Mode=DSPOoLibraryJjLibrary
VP_STMicroelectronics.X-CUBE-ALGOBUILD_VS_DSPOoLibraryJjLibrary_1.3.0_1.3.0.Signal=STMicroelectronics.X-CUBE-ALGOBUILD_VS_DSPOoLibraryJjLibrary_1.3.0_1.3.0
VP_STMicroelectronics.X-CUBE-ALGOBUILD_VS_MotionOoLibrariesJjLibrary_1.3.0_1.3.0.Mode=MotionOoLibrariesJjLibrary
VP_STMicroelectronics.X-CUBE-ALGOBUILD_VS_MotionOoLibrariesJjLibrary_1.3.0_1.3.0.Signal=STMicroelectronics.X-CUBE-ALGOBUILD_VS_MotionOoLibrariesJjLibrary_1.3.0_1.3.0
VP_SYS_VS_tim2.Mode=TIM2
VP_SYS_VS_tim2.Signal=SYS_VS_tim2
VP_TIM10_VS_ClockSourceINT.Mode=Enable_Timer
VP_TIM10_VS_ClockSourceINT.Signal=TIM10_VS_ClockSourceINT
VP_TIM1_VS_ClockSourceINT.Mode=Internal
VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT
VP_TIM1_VS_ClockSourceITR.Mode=TriggerSource_ITR0
VP_TIM1_VS_ClockSourceITR.Signal=TIM1_VS_ClockSourceITR
VP_TIM4_VS_ClockSourceITR.Mode=TriggerSource_ITR1
VP_TIM4_VS_ClockSourceITR.Signal=TIM4_VS_ClockSourceITR
VP_WWDG_VS_WWDG.Mode=WWDG_Activate
VP_WWDG_VS_WWDG.Signal=WWDG_VS_WWDG
board=custom
rtos.0.ip=FREERTOS

🌻 工程文件下载: STM32CubeMXConfigFile.ico

三、STM32CubeIDE 工程导入

1. main.c

int main(void)
{
  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init(); // STM32 HAL系统硬件库初始化

  /* Configure the system clock */
  SystemClock_Config(); // 根据 STM32CubeMX 中配置的时钟信号频率进行硬件PLL 分频器配置

  /* Initialize all configured peripherals */
  MX_DMA_Init(); // 配置初始化 DMA 通道
  MX_GPIO_Init(); // GPIO 模块初始化
  MX_ADC1_Init(); // ADC 模数转换器件初始化
  MX_CRC_Init(); // CRC 冗余校验初始化
  // MX_IWDG_Init(); // 开启就要喂狗
  MX_RTC_Init(); // 初始化 RTC 时钟
  MX_SPI1_Init(); // 初始化 SPI1 通信模块
  MX_SPI2_Init(); // 初始化 SPI2 通信模块
  MX_TIM1_Init(); // 初始化 TIM1 定时器模块
  MX_TIM4_Init(); // 初始化 TIM4 定时器模块
  MX_TIM10_Init(); // 初始化 TIM10 定时器模块
  MX_USART1_UART_Init(); // 初始化 USART1 串口模块
  MX_USART6_UART_Init(); // 初始化 USART6 串口模块
  // MX_WWDG_Init(); // 初始化之后就要保证喂狗执行,否则将会一直复位
  MX_PDM2PCM_Init(); // 初始化音频编码模块

  /* Initialize interrupts */
  MX_NVIC_Init(); // 中断初始化

  /* Call init function for freertos objects (in freertos.c) */
  MX_FREERTOS_Init(); // 初始化 FREERTOS 系统,其中初始化了 STM32CubeMX 中配置的 信号量、锁、任务等

  osThreadDef(BissTask, Task_SPI_Reader, osPriorityNormal, 0, blckqSTACK_SIZE); // 定义一个新的任务 名字为 BissTask 任务函数入口 Task_SPI_Reader 任务优先级 osPriorityNormal 任务堆栈区大小 blckqSTACK_SIZE
  osThreadCreate(osThread(BissTask), NULL); // 创建对应参数的任务

  /* Start scheduler */
  osKernelStart(); // 启动 FREERTOS 软件核

  /* We should never get here as control is now taken by the scheduler */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1) // 程序跑飞将会运行到这里来,确保程序不死机,正常情况下不会运行到这里
  {
    /* USER CODE END WHILE */
	  osDelay(100);
	  HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

2. void MX_FREERTOS_Init(void)

void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */

  /* USER CODE END Init */
  /* Create the mutex(es) */
  /* definition and creation of myMutex01 */
  osMutexDef(myMutex01); // 创建任务锁
  myMutex01Handle = osMutexCreate(osMutex(myMutex01));

  /* definition and creation of myMutex02 */
  osMutexDef(myMutex02); // 创建任务锁
  myMutex02Handle = osMutexCreate(osMutex(myMutex02));

  /* definition and creation of myMutex03 */
  osMutexDef(myMutex03); // 创建任务锁
  myMutex03Handle = osMutexCreate(osMutex(myMutex03));

  /* Create the recursive mutex(es) */
  /* definition and creation of myRecursiveMutex01 */
  osMutexDef(myRecursiveMutex01); // 创建任务锁
  myRecursiveMutex01Handle = osRecursiveMutexCreate(osMutex(myRecursiveMutex01));

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* Create the semaphores(s) */
  /* definition and creation of myBinarySem01 */
  osSemaphoreDef(myBinarySem01); // 创建信号量
  myBinarySem01Handle = osSemaphoreCreate(osSemaphore(myBinarySem01), 1);

  /* definition and creation of myBinarySem02 */
  osSemaphoreDef(myBinarySem02); // 创建信号量
  myBinarySem02Handle = osSemaphoreCreate(osSemaphore(myBinarySem02), 1);

  /* definition and creation of myCountingSem01 */
  osSemaphoreDef(myCountingSem01); // 创建信号量
  myCountingSem01Handle = osSemaphoreCreate(osSemaphore(myCountingSem01), 2);

  /* Create the queue(s) */
  /* definition and creation of myQueue01 */
  osMessageQDef(myQueue01, 16, uint16_t); // 创建消息队列
  myQueue01Handle = osMessageCreate(osMessageQ(myQueue01), NULL);

  /* definition and creation of myQueue02 */
  osMessageQDef(myQueue02, 16, uint16_t); // 创建消息队列
  myQueue02Handle = osMessageCreate(osMessageQ(myQueue02), NULL);

  /* Create the thread(s) */
  /* definition and creation of defaultTask */
  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); // 创建新的默认任务
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  /* definition and creation of myTask02 */
  osThreadDef(myTask02, StartTask02, osPriorityIdle, 0, 128); // 创建新的任务
  myTask02Handle = osThreadCreate(osThread(myTask02), NULL);

  /* definition and creation of myTask03 */
  osThreadDef(myTask03, StartTask03, osPriorityIdle, 0, 128); // 创建新的任务
  myTask03Handle = osThreadCreate(osThread(myTask03), NULL);
}

3. 手动创建 BissTask Task 任务

#define blckqSTACK_SIZE   configMINIMAL_STACK_SIZE // 定义单个任务占用的堆栈的大小

// typedef void (*os_pthread) (void const *argument);
void Task_SPI_Reader(void const *input) // 定义任务入口函数
{
	MX_SPI1_Init(); //  初始化硬件 SPI

	uint8_t BiSS_Data[6]; // 定义接收 BiSS-C 协议的数据段
	osDelay(10); // 等待初始化 10ms 再启动任务
	while(1)
	{
		// SPI_HandleTypeDef hspi1; HAL_StatusTypeDef
		HAL_SPI_Receive(&hspi1, BiSS_Data, 1, 10);   // Readout the 1 data from BiSS-C Protocal
		HAL_SPI_Receive(&hspi1, BiSS_Data+1, 1, 10); // Readout the 2 data from BiSS-C Protocal
		HAL_SPI_Receive(&hspi1, BiSS_Data+2, 1, 10); // Readout the 3 data from BiSS-C Protocal
		HAL_SPI_Receive(&hspi1, BiSS_Data+3, 1, 10); // Readout the 4 data from BiSS-C Protocal
		HAL_SPI_Receive(&hspi1, BiSS_Data+4, 1, 10); // Readout the 5 data from BiSS-C Protocal
		HAL_SPI_Receive(&hspi1, BiSS_Data+5, 1, 10); // Readout the 6 data from BiSS-C Protocal

		osDelay(500); // 延时1ms

		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 读取一帧数据就翻转一次 LED 灯珠的状态

		// Write Data to the TMC4671
	}
}
osThreadDef(BissTask, Task_SPI_Reader, osPriorityNormal, 0, blckqSTACK_SIZE); // 定义任务基本参数
osThreadCreate(osThread(BissTask), NULL); // 根据参数创建任务

四、烧录可执行文件

1. 烧录文件加载配置

🚀 使用DFU模式烧录文件: 烧录文件前需要确保 STM32 硬件板卡进入到 DFU模式,DFU模式是一种可以直接通过 USB 烧录的方式完成程序下载的过程,其硬件电路原理是通过在设备断电或复位过程下,通过控制单片机某一引脚的电平状态拉低,然后重新上电即可进入 DFU 模式,在ST-Programmer中即可通过USB方式下载程序。

2. STM32F401CUx硬件

🌻 Notice: 按住reset复位键,改变拨码开关的状态,即进入 DFU 模式开始烧录程序。

可以看到LED灯珠开始闪烁~

Reference

  1. STM32F401CCUx-Project
  2. STM32软件环境搭建官网
posted on 2023-09-18 18:43  小淼博客  阅读(738)  评论(0)    收藏  举报

大家转载请注明出处!谢谢! 在这里要感谢GISPALAB实验室的各位老师和学长学姐的帮助!谢谢~