×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-01 发布时间:
|

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


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


stm32中文手册讲得比较明白


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


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


led灯是portc 13脚


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



#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;

 

    } 

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机中断源的扩展方法