stm32f103 rcc时钟寄存器设置和usart寄存器

这几天把rcc时钟搞明白了。其实主要是流程 看错了计算器1到31位,结果是错位了,一直找不到原因。

原来mac 自带编程计算器也是从0到31

stm32中文手册讲得比较明白

自己摸索下设置了串口发送数据

自己用的是蓝色药丸 (blue pill )淘宝10块不到一小块 stm32f103c8t6

led灯是portc 13脚

本程序全部是用寄存器方式设置

stm32f103 rcc时钟寄存器设置和usart寄存器_第1张图片

#include "stm32f10x_lib.h"
#include 
#include "sys.h"
//测试c++ 
class LED
{
public:
  LED();
  ~LED();
  
};

void delay(void) 
{ 
    volatile unsigned int i; 
    for( i = 0; i < 0x3fffff; ++i);
} 
void delay_ms(void) 
{ 
    volatile unsigned int i; 
    for( i = 0; i < 0x55; ++i);
} 
void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset)	 
{ 	   	 
	SCB->VTOR = NVIC_VectTab|(Offset & (u32)0x1FFFFF80);//设置NVIC的向量表偏移寄存器
	//用于标识向量表是在CODE区还是在RAM区
}
void MYRCC_DeInit(void)
{	
 	RCC->APB1RSTR = 0x00000000;//复位结束			 
	RCC->APB2RSTR = 0x00000000; 

  	RCC->AHBENR = 0x00000014;  //睡眠模式闪存和SRAM时钟使能.其他关闭.	  
  	//RCC->APB2ENR = 0x00000000; //外设时钟关闭.			   
  	RCC->APB1ENR = 0x00000000;   
	RCC->CIR = 0x00000000;     //关闭所有中断		

//RCC->APB2RSTR|=1<<4; //ADC1复位
//RCC->APB2RSTR&=~(1<<4);

	//配置向量表				  
     MY_NVIC_SetVectorTable(0x08000000,0x0);
}
void ClockInit(u8 PLL)
{
    unsigned char temp=0;
    MYRCC_DeInit();		  //复位并配置向量表
    RCC->CR|=(1<<16);  //外部高速时钟使能HSEON
    while(!(RCC->CR>>17));//等待外部时钟就绪
    RCC->CFGR=0x00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
   
  // RCC->CFGR &= (uint32_t)((uint32_t)~(0x00010000 | 0x00020000 |0x003C0000));
 //  RCC->CFGR |= (uint32_t)(0x00010000 | 0x001C0000);
  RCC->CFGR=0x1D0402;//0x1D2402;上面 用16位pllsrc是使用HSE时钟  17位是0 不分频 pllmul 111是0x1c 9倍频
    FLASH->ACR|=0x32;	  //FLASH 2个延时周期
 
    RCC->CR|=0x01000000;  //PLLON
    while(!(RCC->CR>>25));//等待PLL锁定
    RCC->CFGR|=0x00000002;//PLL作为系统时钟
    while(temp!=0x02)     //等待PLL作为系统时钟设置成功
    {
    temp=RCC->CFGR>>2;
    temp&=0x03;
    }
}

void uart_init(u32 pclk2,u32 bound)
{    
  RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
  RCC->APB2ENR|=1<<14;  //使能串口时钟 
  GPIOA->CRH&=0XFFFFF00F;//IO状态设置
  GPIOA->CRH|=0X000008B0;//IO状态设置 
  RCC->APB2RSTR|=1<<14;   //复位串口1
  RCC->APB2RSTR&=~(1<<14);//停止复位         
  //波特率设置
  USART1->BRR=0x271; // 波特率设置  直接固化 如果总线是36 那波特率是57600 
  USART1->CR1|=0x200C;  //1位停止,无校验位.

}
int main(void)
{

//Stm32_Clock_Init(9);
  ClockInit(9);
///////////////////////////////////
  
   RCC->APB2ENR |=(1<<14);//使能usart1
   RCC->APB2ENR |=(1<<2);//使能PORTA口时钟  
  /* Infinite loop */
   RCC->APB2ENR |=(1<<4);  // 使能PORTC口的时钟 
    GPIOC->CRH|=0x100000;//pc13要用CRH 小8用CRL
    uart_init(72,115200);
    while(1)
    {  
        delay(); 
        GPIOC->ODR ^= (1<<13);
        for(char i=47;i<58;i++){
        	  USART1->DR=i;
        	while(((USART1->SR & 0x40)==0));   	
        }
         USART1->DR=0x00;
        	while(((USART1->SR & 0x40)==0));
         //E6B189 汉 utf8编码
         USART1->DR=0xE6;
        	while(((USART1->SR & 0x40)==0));
         USART1->DR=0xB1;
        	while(((USART1->SR & 0x40)==0));
         USART1->DR=0x89;
        	while(((USART1->SR & 0x40)==0));

			//输出回车和换行
        USART1->DR=0x20;
        while(((USART1->SR & 0x40)==0));
        USART1->DR=0x0a;
        while(((USART1->SR & 0x40)==0));
        USART1->DR=0x0d;

    } 
}

你可能感兴趣的:(c++)