
以下为源代码,CC1进行比较输出,模式为翻转电平.4 k# p+ f4 H* F. |: c8 y. l' w) {6 ~. i 程序运行后,CC中断可以进去,PA.11的指示灯能闪,但PA.08的指示一直为低电平,请教一下程序哪里错了???2 a6 C' n, p" w( N k/ }/ p3 k void TIM1_CC_Init(void)# z$ u0 U& Z5 i# T { NVIC_InitTypeDef NVIC_InitStructure; - a( j; h6 z c GPIO_InitTypeDef GPIO_InitStructure; 3 d9 K$ z7 U0 K) F9 q1 u /* 使能定时器 TIM1_CC 中断 */ U) S% C& I: _5 @# [) C NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQChannel;; B' p6 } M9 u$ E B8 R! [6 H5 V NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;( r3 k, h% ]$ N" W6 K NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* 配置 PA.11 为推挽输出 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; 6 ^# w5 u' J2 Y$ @7 u0 F GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;* y% f, J: F; f GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 5 \2 w, x" n% o6 |4 F GPIO_Init(GPIOA, &GPIO_InitStructure);4 V6 H1 u5 T: G4 z( v$ m ( }" w) |9 ^5 z# _ GPIOA->BSRR = GPIO_Pin_11; // 将PA.08配置为高电平 9 E3 |/ @, _9 M) p+ U. K- u /* 配置 PA.08 为复用推挽输出 */* h5 p3 d' r: `! T. i5 u$ X GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; ( ~5 ?$ r& @& o GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;* p/ _$ l! A, n GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; `/ z% P+ H/ D GPIO_Init(GPIOA, &GPIO_InitStructure);3 [, A1 v' z* v1 z, i+ N8 S v /* 预分频自动重载寄存器 */: Z* ~. o# A+ ^& q- {3 d" q TIM1->ARR = 0x2FFF; /* PSC 预分频器:计数频率 = CK_PSC /(PSC + 1) */% C- ?1 f" _+ R+ F7 v TIM1->PSC = 0xFF; ! e" T, m- c1 t6 M4 X* |# o9 ^ /* CCR1 捕获比较值寄存器 */ 2 I1 ^/ a- `% j- d9 w TIM1->CCR1 = 0xFFF; 1 k2 @9 G" x4 w, T l /* 循环计数器的寄存器(控制更新事件) */. z: F# M6 Y; o! N+ ?8 i TIM1->RCR = 0x00; // 每次更新 / T4 t3 }' I \ /* 捕获/比较模式寄存器 */ TIM1->CCMR1 = 0x30; // CC1为输出,CCR1立即生效,输出翻转. /* 捕获/比较使能寄存器 */ + h( i- P1 X, o TIM1->CCER = 0x03; // 开启CC1输出,反向输出 /* 中断使能寄存器 */! @! b% \8 I! m0 O% f9 J( L( v TIM1->DIER = 0x02; // 使能 CC1 中断 # k( ?4 i& l" P# a$ w- v /* 控制寄存器1 */' A$ ?7 v+ e0 y/ s9 |3 c TIM1->CR1 = 0x01; // 使能计数器(向上计数) } /***************************************************************************************& h Q) l! w2 c1 O0 D ** 函数名称: TIM1_CC_IRQHandler ** 功能描述: CC 中断 ** 参 数: None ** 返 回 值: None + w( M2 i. C4 W4 J! J0 K5 n, M ****************************************************************************************// K9 u+ }1 w! B! Q* F0 e void TIM1_CC_IRQHandler(void) ; u) B) P& ]+ }. z {! J2 m! a' W5 Z static uint32 counter = 0; % v g7 V8 t x0 l" \0 v TIM1->SR &= ~2; // 清除中断标志(不做判断提高效率)- H# ?+ I; m! Y5 [/ o) N4 S / j7 n1 ^; P1 s2 i; B8 { if(counter)- ^- b& E/ k2 \3 e' e# [" N { counter = 0; . J$ k3 W5 U5 k5 u6 j; e GPIOA->BSRR = GPIO_Pin_11; } else4 ?5 Z! T0 ~: }, Y+ i/ H! a( }3 m { % }! E/ o% |4 b! o, m) ~5 U counter = 1; GPIOA->BRR = GPIO_Pin_11; }9 f/ i9 L- |3 R- E( h } |
RE:STM32基于TIM1的比较输出
找到问题,没有打开主输出...
/* 打断和死区控制器 */* x# }% M: U8 H1 U: a# |! D
TIM1->BDTR = 0x8000; // 主输出使能(MOE)
加这句就可以了.
RE:STM32基于TIM1的比较输出
RE:STM32基于TIM1的比较输出
我刚接触到STM32F103这款芯片,同时也要使用TIM1高级时钟这个模块,主要是用来控制电机,但发现互初输出的PWM信号的占空比不正确,譬如:软件中设置的占人比为20%,但实际输出才有16%,其它的占空比都是一样,存在误差!
ps:我的PWM信号频率为20KHZ,死区时间:2us,中心对齐,下溢中断9 ]/ B0 @% \2 y+ u- x6 u5 H( T
谢谢