|
本帖最后由 wjandsq 于 2018-1-10 19:44 编辑 # l2 \' }" k& C" _5 ~& \) N 使用STM32F407的TIM3、TIM4精确发送固定个数脉冲,PC6、PB6两路500KHz PWM,用于控制两路伺服电机。 ; |" t; w2 j5 L/ h. N5 h 一、本例程的主要功能:/ E+ n9 u- d; V$ w. ~0 G' B 1.USB-CDC 功能(使用USART1-PA9 USART1-PA10)。. [2 h% b2 k5 x PC机通过USB通讯发送控制命令到STM32,命令还可以通过USART1-PA9转发出去。$ u: ~4 `" s O. K 0 L8 u3 V+ u* j7 h% |1 f/ E. C$ ^ 2.使用TIM3 CH1通道发送精确个数脉冲(使用PC6)。. i. j8 S( z% k6 q7 ^ 发送精确个数脉冲,需要启用TIM3 的DMA通讯,在每个脉冲周期结束时, DMA自动将内存中的占空比数据传输至CCR1,DMA传输的次数到达设定值N,* `7 t6 w4 ~* `9 k0 h; _ 则进入DMA传输完毕中断,此时已发送N-1个脉冲,因此在该中断中,9 J5 u/ x' Q7 Z: f 设置TIM3 为单脉冲模式,脉冲发送自动停止。 总脉冲个数 = DMA传输次数(N) * DMA通讯中断次数(M) 目前发现的bug描述: 0 E3 n. u+ J R( n* Q) ~5 q; I% G (1) 首次启动时,如果发送多个脉冲,则会出现多发1个脉冲的情况。 (2) 首次启动时,如果发送单个脉冲,再发送多个脉冲,不会出现该bug。 9 b& P; I8 K* j) } 临时解决方案: 启动时将一个特殊标志初始化为1。 如果启动后就发送多个脉冲,则将脉冲数量减去1,然后将特殊标志清0。 如果启动后发送单个脉冲,不会出现bug,所以要将那个特殊标志清0。 & T/ L. m6 c Q' j 3.使用TIM4 CH1通道发送精确个数脉冲(使用PB6)。3 U5 y( f& }+ }! V0 g6 q# u0 @ 同上。' P K7 f9 X {( v6 ]2 | $ ?* @/ ~9 h+ }, D4 {9 I, U 4.在RAM进行硬件仿真调试的说明 本例程成功地验证了STM32F407可以在内部RAM中进行硬件仿真调试。3 v3 A0 y1 Q# x9 X$ y m2 i" d" P 注意DMA等的初始化,内存到外设的传输宽度为16位,只有设置正确, 才能进入DMA传输完毕中断。: W2 a2 c, l1 ~0 C; T9 F# B# f ' Z8 S' ^* k, Q8 l 三、本例程软件改动如下: 1.在usb_conf.h的第179行,注释掉了 VBUS_SENSING_ENABLED 宏定义。6 b7 l9 T* M! n. t! D: F: [ 2.stm324xg_eval.h中增加USART1相关的宏定义: #ifdef VBUS_SENSING_ENABLED% P: b+ K( R# H4 m; |: V #define EVAL_COM1 USART3 #define EVAL_COM1_CLK RCC_APB1Periph_USART3+ A" N$ q/ P, l$ ?: W! [ K #define EVAL_COM1_TX_PIN GPIO_Pin_10! \+ p: Z4 ] K5 |( J #define EVAL_COM1_TX_GPIO_PORT GPIOC' M4 _5 l0 w. }- b0 d #define EVAL_COM1_TX_GPIO_CLK RCC_AHB1Periph_GPIOC. F m! I7 q& f) N! c4 p0 b #define EVAL_COM1_TX_SOURCE GPIO_PinSource10 #define EVAL_COM1_TX_AF GPIO_AF_USART3/ J- B* k/ h( W# A6 U* H #define EVAL_COM1_RX_PIN GPIO_Pin_11 #define EVAL_COM1_RX_GPIO_PORT GPIOC #define EVAL_COM1_RX_GPIO_CLK RCC_AHB1Periph_GPIOC4 `! d9 X8 j1 g0 |; Q #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_97 b! o1 }4 e* m5 K' J* q& d9 q #define EVAL_COM1_TX_GPIO_PORT GPIOA8 N9 e- L" r6 ?3 u. M! s4 h* Q #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: r: J" S+ [; e( r0 c4 i: r #define EVAL_COM1_RX_GPIO_PORT GPIOA #define EVAL_COM1_RX_GPIO_CLK RCC_AHB1Periph_GPIOA) h h( _; _* N2 ~0 ^ #define EVAL_COM1_RX_SOURCE GPIO_PinSource10 #define EVAL_COM1_RX_AF GPIO_AF_USART1 #define EVAL_COM1_IRQn USART1_IRQn #endif ; G1 W M* d% A$ ` 3. usbd_cdc_vcp.h中,增加USART1相关的宏定义: E" \1 ~6 O9 ] #ifdef USE_STM3210C_EVAL #define EVAL_COM_IRQHandler USART2_IRQHandler3 b" g* ^: Q$ M1 ?' K% ^ #else #ifdef VBUS_SENSING_ENABLED #define EVAL_COM_IRQHandler USART3_IRQHandler #else #define EVAL_COM_IRQHandler USART1_IRQHandler5 t6 _: F3 N* n2 a' b3 ]% |( J #endif #endif /* USE_STM322xG_EVAL */ % w6 b% ^. L( v8 i5 Z" } 4.USB内部或外部上拉电阻关闭与延迟打开的函数修改 void usb_start_delay(void)& Y/ k! M* H1 E: p1 R" N { uint16_t i,j;. ?) `) ], G& O1 T #ifdef VBUS_SENSING_ENABLED) Q' P% m" B3 T! U& u GPIOD->BSRRL = GPIO_Pin_6; /* 不启用外部USB上拉电阻 */' v) o# j& w" B$ [4 l/ p+ R for(i = 0; i < 10000; ++i){: f5 I/ p5 Z5 I( m. z% G for(j = 0; j < 6000; ++j){ 8 M |6 a2 K! `+ ?8 R; U8 _- C } }& D" t5 p" V3 H! q+ w% ~/ f0 e* }2 p GPIOD->BSRRH = GPIO_Pin_6; /* 启用外部USB上拉电阻 */ #else GPIOD->BSRRL = GPIO_Pin_6; /* 不启用外部USB上拉电阻 */ DCD_DevDisconnect(&USB_OTG_dev); /* 不启用内部上拉电阻 */ for(i = 0; i < 10000; ++i){ Z3 |- E' V: n9 A3 @" W1 K ~1 h for(j = 0; j < 6000; ++j){; q# s7 h9 G3 Z& L& l7 W } } DCD_DevConnect(&USB_OTG_dev); /* 启用内部上拉电阻 */8 p; {9 k* b0 u$ [; w #endif/ q2 i1 Y, z, [ K" u, B2 | ! t$ i6 [' c* ]. u4 \ U }/ J' h# U0 N8 t: ]- j+ r# v7 y. x 5.USB虚拟串口的DTR RTS Break控制修改 可用DTR信号控制1路伺服电机正转还是反转。, M6 q4 [8 K4 B+ @$ q RTS信号无效,这是由于Windows USB驱动的问题造成的,ST依靠微软的USB驱动, 所以一直没有解决这个问题。" P0 Q# l7 ~ b 6.精确个数脉冲发送5 A7 n( V5 ^! q: [$ ~2 u# P. Q S 在TIM3-CH1上(PC6)实现精确个数脉冲发送,用于控制第一路伺服电机" v; q2 T1 o0 Y& s" t, C 在TIM4-CH1上(PB6)实现精确个数脉冲发送,用于控制第二路伺服电机) d" c( L$ o, [; i. _ & N/ l4 I- P/ f, e- A X/ v6 K 四、工程包下载 % D3 g0 ?: |7 N' v* `5 h( J% c 五、解压工具1 U4 `% \: R' _$ s- H# ~ 下载最新的7z工具,7z938.exe,X86或X64均可。& e6 N# y, J0 \* I * B. O+ O+ Y9 h3 z' P 六、调试说明 1.点击载入配置按钮,选择测试的配置文件, 多字符串发送功能区的字符串列表自动更新。 3 r+ v8 l) T" A+ Y4 R5 B 2.选择STM32的虚拟串口号,由于是USB通信, 可以不用理会波特率等参数,那是串口对外发送的 波特率,这里通过USB传给STM32,通过串口向外发送的代码可以关掉,也可以保留。 + g% K/ u& o6 e 3.点击启动发送,自动循环发送1-10个脉冲, 示波器测量PC6(第一路),可以看到脉冲数量的变化。, C: t. ^2 g0 n, R9 z $ ?8 a) \% d6 s! U. k; y) L: N0 S 1 r1 L5 ?0 g5 l/ K2 ~0 R. } |
USB串å£å·¥å ·åéå½ä»¤
【福利三:雨露均沾·逢7狂欢】之四:用一个定时器同步另外两个定时器输出PWM
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
【逢7发帖赢大礼】全网最简单的Arduino_STM32开发环境搭建教程!
STM32F4中文用户手册
STM32F400、STM32F402 Cortex-M4超值单片机
SPI 高温读错最后一位?STM32F42xx 官方根治方案
微信公众号
手机版
请不要随意伸手……