
以下为源代码,CC1进行比较输出,模式为翻转电平." y2 k: ?- b/ ~# P6 B# M 程序运行后,CC中断可以进去,PA.11的指示灯能闪,但PA.08的指示一直为低电平,请教一下程序哪里错了???8 Z: ?0 U& \* J0 r! D void TIM1_CC_Init(void)+ }5 \$ U# t% {" D9 Y { + C8 ]& G0 [3 X! b# L NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; 7 k$ d' T; Z% Z4 z' I /* 使能定时器 TIM1_CC 中断 */ NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;( W4 e6 v- S/ h2 K) ~' T1 W3 N0 x NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); 2 ?+ p6 u6 w+ Y; `* n /* 配置 PA.11 为推挽输出 */, P/ i: R7 f3 M GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;; l# }: X, C: |2 M! l GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; * ^$ a2 O$ a& ` GPIO_Init(GPIOA, &GPIO_InitStructure); % }' y/ T. P" b; K, M GPIOA->BSRR = GPIO_Pin_11; // 将PA.08配置为高电平 /* 配置 PA.08 为复用推挽输出 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; m8 [& w3 ?* f+ J# v GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;# F5 `% M1 X* f- M) X7 [0 r9 q# e GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 8 F$ B$ }1 E# Q: d0 Y GPIO_Init(GPIOA, &GPIO_InitStructure); % W, R$ Z' ^ x /* 预分频自动重载寄存器 */ TIM1->ARR = 0x2FFF; % _ q* {. k: c, }2 R /* PSC 预分频器:计数频率 = CK_PSC /(PSC + 1) */ TIM1->PSC = 0xFF; 1 l$ M! a' n1 Q( x4 v9 c /* CCR1 捕获比较值寄存器 */ N' C& d9 c! x0 h E# o TIM1->CCR1 = 0xFFF; /* 循环计数器的寄存器(控制更新事件) */ TIM1->RCR = 0x00; // 每次更新 9 w" e9 y q% g: K' a' @9 X( U /* 捕获/比较模式寄存器 */ TIM1->CCMR1 = 0x30; // CC1为输出,CCR1立即生效,输出翻转. /* 捕获/比较使能寄存器 */ TIM1->CCER = 0x03; // 开启CC1输出,反向输出 /* 中断使能寄存器 */ TIM1->DIER = 0x02; // 使能 CC1 中断 /* 控制寄存器1 */ TIM1->CR1 = 0x01; // 使能计数器(向上计数)! J4 Y, Z+ _2 Z3 }" |8 M' ? } /*************************************************************************************** ** 函数名称: TIM1_CC_IRQHandler( G+ G. G! E* e4 d# w: E- M ** 功能描述: CC 中断 ** 参 数: None ** 返 回 值: None ( k7 s+ o8 P5 W' N ****************************************************************************************/: K4 r9 E/ D, S: f) i+ B2 C void TIM1_CC_IRQHandler(void) {0 W! X# y1 S7 x* |' O9 Z/ m static uint32 counter = 0; TIM1->SR &= ~2; // 清除中断标志(不做判断提高效率)* i6 G$ c& j. h2 W& y 7 ?6 r( y2 Z! Y- ?" w$ P if(counter)' v% F' p& \' k. s1 r! x& w {4 f- p. X7 n$ y0 @8 @, _6 X9 q% ? counter = 0; : K0 L1 _# F! N$ j/ ~ GPIOA->BSRR = GPIO_Pin_11;( ~$ W/ y n- u" v. b5 O8 e# u; o# M } else { counter = 1;4 m% U/ h. Z2 `" W3 R; u: K8 \ GPIOA->BRR = GPIO_Pin_11; }& k' t: Q1 j: v } |
RE:STM32基于TIM1的比较输出
找到问题,没有打开主输出...
/* 打断和死区控制器 */
TIM1->BDTR = 0x8000; // 主输出使能(MOE) + N, Y b! E k1 x/ |1 Y
加这句就可以了.
RE:STM32基于TIM1的比较输出
RE:STM32基于TIM1的比较输出
我刚接触到STM32F103这款芯片,同时也要使用TIM1高级时钟这个模块,主要是用来控制电机,但发现互初输出的PWM信号的占空比不正确,譬如:软件中设置的占人比为20%,但实际输出才有16%,其它的占空比都是一样,存在误差!3 w2 Q) z: R- I/ E8 V7 J
ps:我的PWM信号频率为20KHZ,死区时间:2us,中心对齐,下溢中断
谢谢