[mw_shl_code=c,true]求助:问题出在哪里了?[/mw_shl_code]
[mw_shl_code=c,true]#include"stm32f10x.h"
void delay(int);
int main(void)
{
unsigned char temp1=0;
RCC->CR|=0x00010000; //外部高速时钟使能HSEON
while(!(RCC->CR>>17)); //等待外部时钟就绪
RCC->CFGR=0X00000400; //APB1=DIV2(PLL二分频作为APB1的时钟);APB2=DIV1;AHB=DIV1,
//此位设置保证APB1时钟小于等于36MHZ
RCC->CFGR=0x1C0400; //设置9倍频
RCC->CFGR|=1<<16; //PLLSRC ON
FLASH->ACR|=0x32; //FLASH 2个延时周期,
/*若不延时,程序直接跑飞,CPU速度快,这个延时,是为了等待FLASH,
FLASH的访问速度最大小于等于24MHZ
0个等待周期,当0<SYSCLK<24MHZ ,0x30
1个等待周期,当24MHZ<SYSCLK<=48MHZ ,0x31
2个等待周期,当48MHZ<SYSCLK<=72MHZ ,0x32 */
RCC->CR|=0x01000000; //PLLON
while(!(RCC->CR>>25)); //PLLRDY,PLL时钟就绪标志位,等待PLL锁定
RCC->CFGR|=0x00000002; //设置PLL作为系统时钟,SW【1:0】系统时钟切换
while(temp1!=0x02) //等待PLL作为系统时钟设置成功,SWS【1:0】系统时钟切换状态
{
temp1=RCC->CFGR>>2; //仅仅是移位,并没有改变CFGR寄存器的其他位的值
temp1&=0x03;
}
RCC->APB2ENR=0x04; //使能IOPA端口时钟,PA8
RCC->APB2ENR|=1<<5; //使能IOPD端口时钟,PD2,这样操作至改变目标位,不会影响其他位的值
GPIOD->CRL=0x44444344; //PD2设置为通用推挽输出,最大速度为50MHZ
GPIOA->CRH=0x44444443; //PA8设置为通用推挽输出,最大速度为50MHZ
GPIOD->ODR=0x04; //端口输出数据寄存器,设置PD2为高
GPIOA->ODR=0x100; //端口输出数据寄存器,设置PA8为高
while(1)
{
delay(1000);
GPIOD->ODR=~(GPIOD->ODR); //端口输出数据寄存器,设置PD2为低
GPIOA->ODR=~(GPIOD->ODR); //端口输出数据寄存器,设置PA8为低
delay(1000);
GPIOD->ODR=~(GPIOD->ODR); //端口输出数据寄存器,设置PD2为高
GPIOA->ODR=~(GPIOD->ODR); //端口输出数据寄存器,设置PA8为高
}
}
void delay(int x) //实现毫秒级的延时,延时为x毫秒;
{ unsigned int temp2=0;
SysTick->LOAD=0x01; //设置自动重载;
SysTick->VAL=0xFFFFFE;//设置计数初值,一次时间为1/9000000s;
SysTick->CTRL=0x01; //systick的时钟源为外部时钟,不产生中断,使能;开始计数
while((x*9000)!=temp2)
{
if((SysTick->CTRL&=1<16)==1) //是否倒计数到0;
{
temp2+=1;
}
}
SysTick->CTRL=0x00; //关闭计数器;
}
[/mw_shl_code]
|