Timer STM32F030 PWM设置问题
我试图让PWM在我的STM32030R8T6的两个引脚上工作,它在一个核子开发板上,我使用Keil。为了学习,我一直在关注网站上的内容,但由于该网站使用了不同的MCU,因此进行了调整。设置PWM真的没什么大不了的,所以我不太确定我做错了什么,我知道计时器正在工作,因为车载LED每秒闪烁1.5次,但当我用示波器监测Ch1和Ch2输出引脚时,我什么也看不到。我非常确定引脚在交替功能推挽中设置正确,因为它们与MCO引脚设置相同,MCO引脚正在工作并显示24 MHz(尽管我的廉价示波器在确定这一点时有一些问题…)。我已经附上了我所有相关的,甚至可能是远程相关的代码。为方便起见: 我也会发布到Nucleo用户手册和设备数据表的链接,但我不能发布超过两个链接,因为这是我的第一个问题,我的声誉不到十 任何关于我可能做错的事情的帮助都是感激的,我相信这是愚蠢的Timer STM32F030 PWM设置问题,timer,embedded,stm32,pwm,Timer,Embedded,Stm32,Pwm,我试图让PWM在我的STM32030R8T6的两个引脚上工作,它在一个核子开发板上,我使用Keil。为了学习,我一直在关注网站上的内容,但由于该网站使用了不同的MCU,因此进行了调整。设置PWM真的没什么大不了的,所以我不太确定我做错了什么,我知道计时器正在工作,因为车载LED每秒闪烁1.5次,但当我用示波器监测Ch1和Ch2输出引脚时,我什么也看不到。我非常确定引脚在交替功能推挽中设置正确,因为它们与MCO引脚设置相同,MCO引脚正在工作并显示24 MHz(尽管我的廉价示波器在确定这一点时有一
#include "stm32f0xx.h"
void Initializations(void);
int main(void)
{
Initializations();
while(1)
{
/* Toggle onboard LED whenever timer overflows */
if((TIM3->SR & TIM_SR_UIF))
{
TIM3->SR &= ~TIM_SR_UIF;
GPIOA->ODR ^= GPIO_ODR_5;
}
}
}
void Initializations(void)
{
/* CLK CONFIG */
RCC->CFGR |= RCC_CFGR_HPRE_DIV2 |
RCC_CFGR_PPRE_DIV16 |
RCC_CFGR_MCO_SYSCLK |
RCC_CFGR_PLLMUL6;
/* Activate PLL, wait */
RCC->CR |= RCC_CR_PLLON;
while(!(RCC->CR & RCC_CR_PLLRDY));
RCC->CFGR |= RCC_CFGR_SW_PLL;
/* Enable IO CLKs */
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
RCC->AHBENR |= RCC_AHBENR_GPIOCEN;
/* Enable peripheral CLKs */
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
/* PIN INITIALIZATIONS */
GPIOA->MODER |= GPIO_MODER_MODER5_0 | // Onboard LED (General output)
GPIO_MODER_MODER2_1 | // USART2 TX (Alternate function)
GPIO_MODER_MODER3_1 | // USART2 RX (Alternate function)
GPIO_MODER_MODER6_1 | // TIM3 CH1 (Alternate function)
GPIO_MODER_MODER7_1 | // TIM3 CH2 (Alternate function)
GPIO_MODER_MODER8_1 | // MCO (Alternate function)
GPIO_MODER_MODER9_1 | // USART1 TX (Alternate function)
GPIO_MODER_MODER10_1; // USART1 RX (Alternate function)
/* TIMER INITS */
TIM3->PSC = 7;
TIM3->ARR = 59999;
/* CCM1 */
TIM3->CCMR1 |= TIM_CCMR1_OC1M_0 |
TIM_CCMR1_OC1M_1;
TIM3->CCR1 |= 4499;
TIM3->CCER |= TIM_CCER_CC1E; // Enable Ch1
/* CCM2 */
TIM3->CCMR1 |= TIM_CCMR1_OC2M_0 |
TIM_CCMR1_OC2M_1;
TIM3->CCR2 |= 29999;
TIM3->CCER |= TIM_CCER_CC2E; // Enable Ch2
TIM3->CR1 |= TIM_CR1_CEN; // Enable TIM3
/* USART INITS */
RCC->CFGR3 |= RCC_CFGR3_USART1SW_0; // Clock USART1 from SYSCLK
}
除了设置引脚以使用备用功能外,还必须设置要使用的备用功能 您链接的文档第8.3.2节(pdf第128页)对此进行了描述 这些是端口上的AFRL(针0-7)和AFRH(针8-15)寄存器 例如,根据您的代码,如果TIM3使用备用函数2,并且位于引脚6和引脚7上(假设备用代码当前为0),您会这样做
GPIOA->AFRL |=(2)您是否试图避免使用中断?另外,您是否有一个等价的RCC->APB2ENR |=RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN;
来启用您各自的端口和备用功能块?是的,它在这个MCU上的AHBENR寄存器中,即使位仍然是IOPxEN,编译器也会使用GPIOxEN。它们是两个号码都是一样的。真不敢相信我错过了这个寄存器,非常感谢,而且时间安排得很好,我正要放弃,使用了一个混乱而不方便的中断方案。
GPIOA->AFRL |= (2 << (6 * 4)) | (2 << (7 * 4));
mode << (pin * 4)
mode << ((pin - 8) * 4)