[mw_shl_code=c,true]#include"stm32f10x.h"
#include"string.h"
int main(void)
{
char a[]="hello world!";
unsigned char i=0;
unsigned char temp=0;
RCC->CR|=0x00010000; //外部高速时钟使能HSEON
while(!(RCC->CR>>17)); //等待外部时钟就绪
RCC->CFGR=0X00000400; //APB1=DIV2(PLL二分频作为APB1的时钟);APB2=DIV1(72MHZ);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(temp!=0x02) //等待PLL作为系统时钟设置成功,SWS【1:0】系统时钟切换状态
{
temp=RCC->CFGR>>2; //仅仅是移位,并没有改变CFGR寄存器的其他位的值
temp&=0x03;
}
RCC->APB2ENR|=1<<14; //USART1时钟使能;
RCC->APB2ENR|=1<<2; //GPIOA时钟使能;PA9为TXD,PA10为RXD
RCC->APB2RSTR|=1<<14; //串口1复位
RCC->APB2RSTR&=~(1<<14);//停止复位
GPIOA->CRH=0x444444B4; //PA9为TXD ,配置为复用功能推挽输出,速度为50MHZ ,1011,
GPIOA->CRH=0x444448B4; //PA10为RXD,配置为上拉下拉输入模式,1000
USART1->BRR=0x1D4C; //设置串口1波特率为9600;
/* Rx/Tx波特率=fck/(16*USARTDIV),其中USART分为小数部分和整数部分,fck为其时钟频率
在BRR寄存器中设置的就是USARTDIV的值,其中第四位为小数位,高12位为整数位
*/
USART1->CR1=0x200C; //串口口模块使能,使能接收,发送,1个起始位,8个数据位,1位停止位,禁止校验,
while(1)
{
//for(i=0;a!='\0';i++)
for(i=0;i<strlen(a);i++)
{
while((USART1->SR&0x40)==0);
USART1->DR=a;
}
while((USART1->SR&0x40)==0);
USART1->DR='\n';
}
}
[/mw_shl_code]
|