
本帖最后由 wjandsq 于 2018-1-10 19:44 编辑 使用STM32F407的TIM3、TIM4精确发送固定个数脉冲,PC6、PB6两路500KHz PWM,用于控制两路伺服电机。 一、本例程的主要功能: 1.USB-CDC 功能(使用USART1-PA9 USART1-PA10)。 PC机通过USB通讯发送控制命令到STM32,命令还可以通过USART1-PA9转发出去。 2.使用TIM3 CH1通道发送精确个数脉冲(使用PC6)。 发送精确个数脉冲,需要启用TIM3 的DMA通讯,在每个脉冲周期结束时, DMA自动将内存中的占空比数据传输至CCR1,DMA传输的次数到达设定值N, 则进入DMA传输完毕中断,此时已发送N-1个脉冲,因此在该中断中, 设置TIM3 为单脉冲模式,脉冲发送自动停止。 总脉冲个数 = DMA传输次数(N) * DMA通讯中断次数(M) 目前发现的bug描述: (1) 首次启动时,如果发送多个脉冲,则会出现多发1个脉冲的情况。 (2) 首次启动时,如果发送单个脉冲,再发送多个脉冲,不会出现该bug。 临时解决方案: 启动时将一个特殊标志初始化为1。 如果启动后就发送多个脉冲,则将脉冲数量减去1,然后将特殊标志清0。 如果启动后发送单个脉冲,不会出现bug,所以要将那个特殊标志清0。 3.使用TIM4 CH1通道发送精确个数脉冲(使用PB6)。 同上。 4.在RAM进行硬件仿真调试的说明 本例程成功地验证了STM32F407可以在内部RAM中进行硬件仿真调试。 注意DMA等的初始化,内存到外设的传输宽度为16位,只有设置正确, 才能进入DMA传输完毕中断。 三、本例程软件改动如下: 1.在usb_conf.h的第179行,注释掉了 VBUS_SENSING_ENABLED 宏定义。 2.stm324xg_eval.h中增加USART1相关的宏定义: #ifdef VBUS_SENSING_ENABLED #define EVAL_COM1 USART3 #define EVAL_COM1_CLK RCC_APB1Periph_USART3 #define EVAL_COM1_TX_PIN GPIO_Pin_10 #define EVAL_COM1_TX_GPIO_PORT GPIOC #define EVAL_COM1_TX_GPIO_CLK RCC_AHB1Periph_GPIOC #define EVAL_COM1_TX_SOURCE GPIO_PinSource10 #define EVAL_COM1_TX_AF GPIO_AF_USART3 #define EVAL_COM1_RX_PIN GPIO_Pin_11 #define EVAL_COM1_RX_GPIO_PORT GPIOC #define EVAL_COM1_RX_GPIO_CLK RCC_AHB1Periph_GPIOC #define EVAL_COM1_RX_SOURCE GPIO_PinSource11 #define EVAL_COM1_RX_AF GPIO_AF_USART3 #define EVAL_COM1_IRQn USART3_IRQn #else #define EVAL_COM1 USART1 #define EVAL_COM1_CLK RCC_APB2Periph_USART1 #define EVAL_COM1_TX_PIN GPIO_Pin_9 #define EVAL_COM1_TX_GPIO_PORT GPIOA #define EVAL_COM1_TX_GPIO_CLK RCC_AHB1Periph_GPIOA #define EVAL_COM1_TX_SOURCE GPIO_PinSource9 #define EVAL_COM1_TX_AF GPIO_AF_USART1 #define EVAL_COM1_RX_PIN GPIO_Pin_10 #define EVAL_COM1_RX_GPIO_PORT GPIOA #define EVAL_COM1_RX_GPIO_CLK RCC_AHB1Periph_GPIOA #define EVAL_COM1_RX_SOURCE GPIO_PinSource10 #define EVAL_COM1_RX_AF GPIO_AF_USART1 #define EVAL_COM1_IRQn USART1_IRQn #endif 3. usbd_cdc_vcp.h中,增加USART1相关的宏定义 #ifdef USE_STM3210C_EVAL #define EVAL_COM_IRQHandler USART2_IRQHandler #else #ifdef VBUS_SENSING_ENABLED #define EVAL_COM_IRQHandler USART3_IRQHandler #else #define EVAL_COM_IRQHandler USART1_IRQHandler #endif #endif /* USE_STM322xG_EVAL */ 4.USB内部或外部上拉电阻关闭与延迟打开的函数修改 void usb_start_delay(void) { uint16_t i,j; #ifdef VBUS_SENSING_ENABLED GPIOD->BSRRL = GPIO_Pin_6; /* 不启用外部USB上拉电阻 */ for(i = 0; i < 10000; ++i){ for(j = 0; j < 6000; ++j){ } } GPIOD->BSRRH = GPIO_Pin_6; /* 启用外部USB上拉电阻 */ #else GPIOD->BSRRL = GPIO_Pin_6; /* 不启用外部USB上拉电阻 */ DCD_DevDisconnect(&USB_OTG_dev); /* 不启用内部上拉电阻 */ for(i = 0; i < 10000; ++i){ for(j = 0; j < 6000; ++j){ } } DCD_DevConnect(&USB_OTG_dev); /* 启用内部上拉电阻 */ #endif } 5.USB虚拟串口的DTR RTS Break控制修改 可用DTR信号控制1路伺服电机正转还是反转。 RTS信号无效,这是由于Windows USB驱动的问题造成的,ST依靠微软的USB驱动, 所以一直没有解决这个问题。 6.精确个数脉冲发送 在TIM3-CH1上(PC6)实现精确个数脉冲发送,用于控制第一路伺服电机 在TIM4-CH1上(PB6)实现精确个数脉冲发送,用于控制第二路伺服电机 四、工程包下载 五、解压工具 下载最新的7z工具,7z938.exe,X86或X64均可。 六、调试说明 1.点击载入配置按钮,选择测试的配置文件, 多字符串发送功能区的字符串列表自动更新。 2.选择STM32的虚拟串口号,由于是USB通信, 可以不用理会波特率等参数,那是串口对外发送的 波特率,这里通过USB传给STM32,通过串口向外发送的代码可以关掉,也可以保留。 3.点击启动发送,自动循环发送1-10个脉冲, 示波器测量PC6(第一路),可以看到脉冲数量的变化。 |
USB串å£å·¥å ·åéå½ä»¤
请不要随意伸手……