想问一下怎么把语音模块通过stm32F4控制电机的转动

想问一下怎么把语音模块通过stm32F4控制电机的转动,我只知道用串口中断去控制,但是具体怎么操作不懂,急需

通过串口通信控制

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7425642
  • 你也可以参考下这篇文章:STM32F4调试编码器遇到的问题及解决(一)
  • 除此之外, 这篇博客: 单片机的启动中的 STM32F4上电 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    https://mp.weixin.qq.com/s/a7wV78NZLS81TCKpMQiQiw

    对于熟悉电脑的伙伴们来说,BIOS(那个蓝色的界面)可能不会太陌生吧,这货就是电脑的启动代码。没有BIOS的电脑,那注定是一块板砖!BIOS主要是做一些开机前的准备工作,例如系统时间设定、启动顺序。。。扯远了!

    其实电脑本身就是从单片机而来,那么单片机也是有启动代码的,只是我们绝大部分情况不去关心它。

    启动代码究竟都干了些什么工作,为何需要它?想想你在c语言中用到了什么东西,而这些东西却是拿来就可以用的?堆、栈!没错,就是他们。我们知道堆和栈是内存中划分出的一块区域,那为什么我们没有亲自划分呢,因为启动代码帮了你的忙!!!再想想单片机工作的时候,有哪些配置被我们忽略了,而它却可以用?时钟,就是这货,我们可以不配置时钟,而你发现它竟然有默认值!还是启动代码帮了你!

    接下来仔细研究一下STM32的启动代码,首先要知道启动代码藏在哪里:一个叫做startup的汇编文件。启动代码是对硬件的一个最初级的配置,它必须用汇编语言来实现,汇编是真正的硬件编程语言。

    从上到下解读启动代码:

    startup_stm32f103xe.s

    1、定义栈大小

    ; Amount of memory (in bytes) allocated for Stack
    ; Tailor this value to your application needs
    ; <h> Stack Configuration
    ;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
    ; </h>
    
    Stack_Size      EQU     0x00000400
    
                    AREA    STACK, NOINIT, READWRITE, ALIGN=3
    Stack_Mem       SPACE   Stack_Size
    __initial_sp
    

    2、定义堆大小

    ; <h> Heap Configuration
    ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
    ; </h>
    
    Heap_Size       EQU     0x00000200
    
                    AREA    HEAP, NOINIT, READWRITE, ALIGN=3
    __heap_base
    Heap_Mem        SPACE   Heap_Size
    __heap_limit
    

    3、中断向量地址

    ; Vector Table Mapped to Address 0 at Reset
                    AREA    RESET, DATA, READONLY
                    EXPORT  __Vectors
                    EXPORT  __Vectors_End
                    EXPORT  __Vectors_Size
    
    __Vectors       DCD     __initial_sp               ; Top of Stack
                    DCD     Reset_Handler              ; Reset Handler
                    DCD     NMI_Handler                ; NMI Handler
                    DCD     HardFault_Handler          ; Hard Fault Handler
                    DCD     MemManage_Handler          ; MPU Fault Handler
                    DCD     BusFault_Handler           ; Bus Fault Handler
                    DCD     UsageFault_Handler         ; Usage Fault Handler
                    DCD     0                          ; Reserved
                    DCD     0                          ; Reserved
                    DCD     0                          ; Reserved
                    DCD     0                          ; Reserved
                    DCD     SVC_Handler                ; SVCall Handler
                    DCD     DebugMon_Handler           ; Debug Monitor Handler
                    DCD     0                          ; Reserved
                    DCD     PendSV_Handler             ; PendSV Handler
                    DCD     SysTick_Handler            ; SysTick Handler
    

    ps:Cortex-M4内核要求内存的第一个地址是栈指针,第二个地址开始为中断向量。而中断向量的第一个必须是复位,因为代码是从上到下执行,开机首先遇到的就是复位。

    4、复位中断处理函数

    ; Reset handler
    Reset_Handler    PROC
                     EXPORT  Reset_Handler             [WEAK]
            IMPORT  SystemInit
            IMPORT  __main
    
                     LDR     R0, =SystemInit
                     BLX     R0
                     LDR     R0, =__main
                     BX      R0
                     ENDP
    

    ps1:仔细那看有两个东西需要注意:“SystemInit”这个是时钟初始,“__main”这一句代表跳转到“main”函数。正因为复位这样的写法,所以程序都是从main函数开始执行的。

    ps2:“SystemInit”具体实现过程在stm32fxxx.c,“__main”也是在某个地方与真正的main关联起来。

    5、其他中断处理函数

    Default_Handler PROC
    
                    EXPORT  WWDG_IRQHandler                   [WEAK]                                        
                    EXPORT  PVD_IRQHandler                    [WEAK]                      
                    EXPORT  TAMP_STAMP_IRQHandler             [WEAK]         
                    EXPORT  RTC_WKUP_IRQHandler               [WEAK]                     
                    EXPORT  FLASH_IRQHandler                  [WEAK]                                         
                    EXPORT  RCC_IRQHandler                    [WEAK]                                            
                    EXPORT  EXTI0_IRQHandler                  [WEAK]                                            
                    EXPORT  EXTI1_IRQHandler                  [WEAK]                                             
                    EXPORT  EXTI2_IRQHandler                  [WEAK]                                            
                    EXPORT  EXTI3_IRQHandler                  [WEAK]                                           
                    EXPORT  EXTI4_IRQHandler                  [WEAK]                                            
                    EXPORT  DMA1_Stream0_IRQHandler           [WEAK]                                
                    EXPORT  DMA1_Stream1_IRQHandler           [WEAK]                                   
                    EXPORT  DMA1_Stream2_IRQHandler           [WEAK]                                   
                    EXPORT  DMA1_Stream3_IRQHandler           [WEAK]                                   
                    EXPORT  DMA1_Stream4_IRQHandler           [WEAK]                                   
                    EXPORT  DMA1_Stream5_IRQHandler           [WEAK]                                   
                    EXPORT  DMA1_Stream6_IRQHandler           [WEAK]                                   
                    EXPORT  ADC_IRQHandler                    [WEAK]                         
                    EXPORT  CAN1_TX_IRQHandler                [WEAK]                                                
                    EXPORT  CAN1_RX0_IRQHandler               [WEAK]                                               
                    EXPORT  CAN1_RX1_IRQHandler               [WEAK]  
    

    ps1:绝大部分中断的实现系统没有给出,等待程序员去写。但是中断的名字我们都可以看到的,每一个名字都和上面向量表中对应着。我们知道函数名其实就是一个地址,而中断的入口地址是固定的,只要找对名字,那地址也就找对了。

    ps2:中断的入口地址由内核和芯片决定,无法更改。因此不要改启动代码中的中断向量表

    6、初始化堆、栈

    ;*******************************************************************************
    ; User Stack and Heap initialization
    ;*******************************************************************************
                     IF      :DEF:__MICROLIB
                    
                     EXPORT  __initial_sp
                     EXPORT  __heap_base
                     EXPORT  __heap_limit
                    
                     ELSE
                    
                     IMPORT  __use_two_region_memory
                     EXPORT  __user_initial_stackheap
                     
    __user_initial_stackheap
    
                     LDR     R0, =  Heap_Mem
                     LDR     R1, =(Stack_Mem + Stack_Size)
                     LDR     R2, = (Heap_Mem +  Heap_Size)
                     LDR     R3, = Stack_Mem
                     BX      LR
    
                     ALIGN
    
                     ENDIF
    
                     END
    

    ps:正因为堆和栈已经被初始化,所以你的C语言才可以顺利的执行。

    启动代码是非常关键的,所有的CPU都有启动代码。这里完成了最基本的初始化功能,尤其是中断向量表,程序员每一个中断函数的名字都要与启动代码中的向量表对应,否则中断是无法进入的。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^