如题,在学习系统时钟,遇到了一个疑问 在系统时钟配置里有一句话是这么写的 RCC->CFGR &= (uint32_t)((uint32_t) ~(RCC_CFGR_PLLSRC |RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); 其中RCC_CFGR_PLLSRC =0x00010000 RCC_CFGR_PLLXTPRE =0x00020000 RCC_CFGR_PLLMULL =0x003C0000 RCC_CFGR_PLLSRC |RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL=0x003F0000 ~0x003F0000=0xFFC0FFFF 二进制的话是 1111 1111 1100 0000 1111 1111 1111 1111 看手册位 21:18 PLLMUL: PLL 倍频系数 (PLL multiplication factor) 由软件设置来确定 PLL 倍频系数。只有在 PLL 关闭的情况下才可被写入。 注意: PLL 输出最大频率不能超过 48 MHz. 0000: PLL 输入时钟的 2 倍频 0001: PLL 输入时钟的 3 倍频 0010: PLL 输入时钟的 4 倍频 0011: PLL 输入时钟的 5 倍频 0100: PLL 输入时钟的 6 倍频 0101: PLL 输入时钟的 7 倍频 0110: PLL 输入时钟的 8 倍频 0111: PLL 输入时钟的 9 倍频 1000: PLL 输入时钟的 10 倍频 1001: PLL 输入时钟的 11 倍频 1010: PLL 输入时钟的 12 倍频 1011: PLL 输入时钟的 13 倍频 1100: PLL 输入时钟的 14 倍频 1101: PLL 输入时钟的 15 倍频 1110: PLL 输入时钟的 16 倍频 1111: PLL 输入时钟的 16 倍频 位 17 PLLXTPRE: HSE 分频器作为 PLL 输入 (HSE divider for PLL input clock) 由软件置 1 或清 0 来分频 HSE 后作为 PLL 输入时钟。只能在关闭 PLL 时才能写入 此位。 注 : 该位与时钟配置寄存器 2(RCC_CFGR2) 中的 PREDIV 最低位是一样的 ( 为了兼 容其他 STM32 产品 ) 0: HSE 不分频 1: HSE 2 分频 位 16 PLLSRC: PLL 输入时钟源 (PLL entry clock source) 由软件置’ 1 ’或清’ 0 ’来选择 PLL 输入时钟源。只能在关闭 PLL 时才能写入此位。 0 : HIS/2 作为 PLL 输入时钟 1 : HSE/PREDIV 作为 PLL 输入时钟 ( 参考 7.4.12 章节的时钟配置寄存器 2) 现在这种情况的话第16位是0 那是不是就是用的内部时钟? 顺便说一下我用的是STM32F030的单片机 |
结题,是我配置的问题,没有配置好 STM32F030就没有定时器3哈哈
自己回答^_^
好吧,还是我自己回答吧,这句话的意思是把第16-21位清零 下一句话 RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE| RCC_CFGR_PLLMULL9); 把相应的位置1 这样就能配置了
现在厉害了,是这样的,程序是从网上找的一个keil4的,用现在keil5的编译成功,然后软件仿真,报错 *** error 65: access violation at 0x40021000 : no 'read' permission *** error 65: access violation at 0x40021000 : no 'write' permission 看了一下,卡到了 RCC->CFGR &= (uint32_t)0xF8FFB80C;
网上说改DEBUG里的东西,也按照那个改了,还是不行
有知道是什么情况的吗
我配置定时器3 输出比较 翻转模式 也没有脉冲输出
void TIM3_PWM_Init(uint16_t period, uint16_t prescaler) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; /* ¶¨ÒåǶÌ×ÏòÁ¿ÖжϿØÖÆÆ÷³õʼ»¯½á¹¹Ìå±äÁ¿ */ NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ʹÄܶ¨Ê±Æ÷3ʱÖÓ NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;//ÅäÖÃÖжÏÊÇÄĸö NVIC_InitStructure.NVIC_IRQChannelPriority=2;//ÅäÖÃÖжÏÓÅÏȼ¶ NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//ÖжÏʹÄÜ NVIC_Init(&NVIC_InitStructure); /* ³õʼ»¯ÅäÖÃǶÌ×ÏòÁ¿ÖжϿØÖÆÆ÷ */ TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //ÉèÖÃ×Ô¶¯ÖØ×°ÖÜÆÚÖµ TIM_TimeBaseStructure.TIM_Prescaler = 3; //ÉèÖÃÔ¤·ÖƵֵ TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//ÏòÉϼÆÊý TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //³õʼ»¯¶¨Ê±Æ÷3 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //±È½ÏÊä³ö·×ªÄ£Ê½ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//±È½ÏÊä³öʹÄÜ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Êä³ö¸ß TIM_OCInitStructure.TIM_Pulse=2000; //ÅäÖñȽÏÊä³öÂö³å¿í¶È£¬¼´¼ÆÊýÆ÷µÄÖµÓëÂö³å¿í¶ÈÏàµÈµÄʱºòµçƽ·¢Éú·×ª TIM_OC1Init(TIM3, &TIM_OCInitStructure); //³õʼ»¯TIM3µÄͨµÀ1 ͨµÀ1-4·Ö±ðÊÇTIM_OC1Init()~TIM_OC4Init() TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable); //ʹÄÜÔ¤×°ÔØ¼Ä´æÆ÷ TIM_ITConfig(TIM3,TIM_IT_CC1,ENABLE); //ʹÄܶ¨Ê±Æ÷ÖÐ¶Ï TIM_Cmd(TIM3, ENABLE); //ʹÄܶ¨Ê±Æ÷3 } uint32_t a=0; void TIM3_IRQHandler() { if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) { /* Clear TIM3 Capture Compare1 interrupt pending bit*/ TIM_ClearITPendingBit(TIM3, TIM_IT_CC1); TIM_SetCounter(TIM3,0); a=~a; TIM_ClearFlag(TIM3,TIM_FLAG_CC1); } } 复制代码
我想仿真看看a的电平变化,结果仿真就在那里卡住了