高级会员

- 积分
- 562
- 金钱
- 562
- 注册时间
- 2018-7-8
- 在线时间
- 118 小时
|
1金钱
板子是ministm32 v1.9,
程序代码如下,寄存器版本
[mw_shl_code=c,true]int main(void) //main是程序入口
{
/*************** 程序总共2部分之第1部分 时钟频率的配置 {开始 *********************************/
/***** 以下是关于RCC时钟 详细请见《STM32F10XXX参考手册》6.3节RCC寄存器描述 *******/
unsigned char sws = 0;
RCC->CR |= 0X00010000; //使能外部高速时钟HSEON
while(!(RCC->CR>>17)); //将RCC_CR寄存器的值右移17位,等待HSERDY就绪,即外部时钟就绪
/* 因为手册有要求APB1时钟频率不超过36MHZ,而在STM32中最大为72MHZ */
/* 为了保证最大速度,我们这里设置成2分频 */
/* 设置寄存器CFGR里的8-10位的值为100 */
RCC->CFGR = 0x00000400;
/* 做实验,设置寄存器CFGR里的11-13位的值为101 4分频*/
//RCC->CFGR |= 0x00002800;
//RCC->CFGR = 0x00002F00;
/* 寄存器CFGR的18-21四个bit位配置成以下值,则PLL就会设置成对应的值:
0000:PLL 2倍频输出 1000:PLL 10倍频输出
0001:PLL 3倍频输出 1001:PLL 11倍频输出
0010:PLL 4倍频输出 1010:PLL 12倍频输出
0011:PLL 5倍频输出 1011:PLL 13倍频输出
0100:PLL 6倍频输出 1100:PLL 14倍频输出
0101:PLL 7倍频输出 1101:PLL 15倍频输出
0110:PLL 8倍频输出 1110:PLL 16倍频输出
0111:PLL 9倍频输出 1111:PLL 16倍频输出
我们在这里,因为STM32神舟I号上的晶振是8MHZ的,配置成9倍输出就能达到STM32最大72MHZ工作频率*/
//RCC->CFGR |= 0x00040000; //本例程希望设置成24MHZ的工作频率,我们在这里尝试一下
//RCC->CFGR &= 0xFFC3FFFF; //本例程希望设置成16MHZ的工作频率,我们在这里尝试一下
//RCC->CFGR |= 0x001C0000; //本例程希望设置成72MHZ的工作频率,我们在这里尝试一下
RCC->CFGR |= 7<<18; //本例程希望设置成72MHZ的工作频率,我们在这里尝试一下
//7右移动18位,即0111使得PLL获得9倍频输出,外部晶振是8MHZ
//乘以9就是72MHZ了
RCC->CFGR |= 1<<16; //PLLSRC设置成1,使得HSE时钟作为PLL输入时钟
RCC->CR |= 1<<24; //将PLL使能
while(!(RCC->CR>>25)); //监控寄存器CR的PLLRDY位,等待PLL时钟就绪
RCC->CFGR |= 1<<1; //将时钟切换寄存器配置成用PLL输出作为系统时钟
while(sws != 0x2) //等待CFGR寄存器的2,3位为10,系统正式切换到了PLL输出作为时钟
{
sws = RCC->CFGR>>2; // 将CFGR寄存器右移2位,将2,3位SWS状态移出来,
// 详情请见《STM32F10XXX参考手册》54页
sws &= 0x3; //这里的0x3为二进制的11,这个whlie循环设计的一个算法,为了判断sws是不是为10
}
/*************** 程序总共2部分之第1部分 时钟频率的配置 结束} *********************************/
/*************** 程序总共2部分之第2部分 点灯的配置 {开始 *********************************/
/* 使能APB2总线的时钟,对GPIO的端口B时钟使能 */
//RCC->APB2ENR |= RCC_APB2Periph_GPIOB;
/* 使能APB2总线的时钟,对GPIO的端口A时钟使能 */
RCC->APB2ENR |= RCC_APB2Periph_GPIOA;
/*-- GPIO Mode Configuration速度,输入或输出 -----------------------*/
/*-- GPIO CRL Configuration 设置IO端口低8位的模式(输入还是输出)---*/
/*-- GPIO CRH Configuration 设置IO端口高8位的模式(输入还是输出)---*/
//GPIOB->CRH &= 0xFFFFFFF0;
//GPIOB->CRH |= 0x00000003;
/*-- GPIO CRL Configuration
设置IO端口低8位的模式(输入还是输出)---*/
/*-- GPIO CRH Configuration 设置IO端口高8位的模式(输入还是输出)---*/
GPIOA->CRH &= 0xFFFFFFF0;
GPIOA->CRH |= 0x00000003;
while (1)
{
//GPIOB->BRR = GPIO_Pin_8;
GPIOA->BRR = GPIO_Pin_8;
//Delay(0xFFFFFF);
Delay(0xfFFFF);
//GPIOB->BSRR = GPIO_Pin_8;
GPIOA->BSRR = GPIO_Pin_8;
//Delay(0xFFFFFF);
Delay(0xfFFFF);
}
/*************** 程序总共2部分之第2部分 点灯的配置 结束} *********************************/
}
[/mw_shl_code]
程序在设置下面的语句后,led就是不会闪烁,但是其他倍频都是可以的,不知为何,请教下论坛。
RCC->CFGR |= 7<<18; //本例程希望设置成9倍频,72MHZ的工作频率,我们在这里尝试一下
|
|