打印

STM32学习初篇

[复制链接]
5008|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
brotherwen|  楼主 | 2007-10-24 16:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32, rc, tc, se, IO
#include <stm32f10x_map.h>
#include "main.h"

由于学习初没有找到中文资料,翻译了点,不管好坏,贴上来和大家分享吧!!!
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name  : RCC_DeInit
* Description    : Deinitializes the RCC peripheral registers to their default
*                  reset values.
*                   - The HSITRIM[4:0] bits in RCC_CR register are not modified
*                     by this function.
*                   - The RCC_BDCR and RCC_CSR registers are not reset by this
*                     function.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_DeInit(void)
{
  // Disable APB2 Peripheral Reset 
  RCC->APB2RSTR = 0x00000000;

  // Disable APB1 Peripheral Reset 
  RCC->APB1RSTR = 0x00000000;

  // FLITF and SRAM Clock ON 
  RCC->AHBENR = 0x00000014;

  //Disable APB2 Peripheral Clock 
  RCC->APB2ENR = 0x00000000;

  // Disable APB1 Peripheral Clock 
  RCC->APB1ENR = 0x00000000;

  // Set HSION bit 
  RCC->CR |= (u32)0x00000001;

  // Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0] bits
  RCC->CFGR &= 0xF8FF0000;
  
  // Reset HSEON, CSSON and PLLON bits 
  RCC->CR &= 0xFEF6FFFF;

  // Reset HSEBYP bit 
  RCC->CR &= 0xFFFBFFFF;

  // Reset PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE bits 
  RCC->CFGR &= 0xFF80FFFF;

  //Disable all interrupts 
  RCC->CIR = 0x00000000;
}      
void SetupClock(void)
{
  /* Reset HSEON and HSEBYP bits before configuring the HSE ------------------*/
  /* Reset HSEON bit */
  RCC->CR &= 0xfffeffff;  //HSEON清零
    /* Reset HSEBYP bit */
  RCC->CR &= 0xfffbffff;  //清除HSEBYP
   /* Set HSEON bit */
  RCC->CR |= 0x00010000; //置位HSEON
    /* Wait till HSE is ready                                                   */
  while ((RCC->CR&0x00020000)== 0);
  //清除HPRE AHB precxaler 
  RCC->CFGR&=0xffffff0f;
  //SYSCLK not divided HCLK   = SYSCLK   
  RCC->CFGR|=0;
   //清除PPRE2 APB  high speed precxaler 
  RCC->CFGR&=0xffffc7ff;
  //HCLK not divided PCLK2=HCLK
  RCC->CFGR|=0;
  //清除PPRE1 APB  low speed precxaler 
  RCC->CFGR&=0xfffff8ff;
   //HCLK  divided by 2 PCLK1=HCLK/2
  RCC->CFGR|=0x00000400;
  
 *(vu32 *)0x40022000 = 0x01;           /* Flash 2 wait state                 */
   /* PLLCLK = 8MHz * 9 = 72 MHz                                              */
  /* Clear PLLSRC, PLLXTPRE and PLLMUL[21:18] bits */
  RCC->CFGR&= 0xffc0ffff;
  //选择HSE作为PLL时钟输入 PLLMUL选择9倍频
  RCC->CFGR|=0x00010000|0x001c0000;
  RCC->CR|=0X01000000; //置位PLLON位
  while((RCC->CR&0x02000000)== 0); //wait till PLL is ready
  //清除 SW System clock Switch
  RCC->CFGR&=0xfffffffc;
  //选择 PLL作为系统时钟
  RCC->CFGR|=0x00000002;
  //等待 PLL作为系统时钟标志置位
  while((RCC->CFGR&0x0000000c)!=0x08);
  // SysTick event each 10 ms with input clock equal to 9MHz (HCLK/8)         
  //SysTick->LOAD=90000;
  //SysTick->CTRL |= 0x00000002;
   
}

void delay(void)
{
 uint i,j;
 for(i=0;i<10;i++)
 for(j=0;j<30000;j++);
 }
int main(void)
 {
  
    RCC_DeInit();
    SetupClock();
    RCC->APB2ENR|=0X08;
    GPIOB->CRH=0X33333333;
    GPIOB->BRR|=0XFFFF;
/**********MCO******************/
    RCC->APB2ENR|=0X04;
    GPIOA->CRH&=0xf0;
    GPIOA->CRH|=0x0b;
    RCC->CFGR|=0X07000000; 
   //RCC->APB2ENR|=0x01; 
    
   while(1)
   { 
      //GPIOB->BSRR=0X80000000;
      //GPIOB->BSRR=0X00008000;
     GPIOB->ODR|=0X8000;
     //delay();
     GPIOB->ODR&=0X7FFF;
    // delay();
    }
   //while(1);
 }

#ifndef MAIN_H
#define MAIN_H

//#define _RCC
/*#include <stm32f10x_lib.h>     */
#define uchar unsigned char
#define uint  unsigned int         
void RCC_DeInit(void);
void SetupClock(void);
#endif


相关链接:https://bbs.21ic.com/upfiles/img/200710/20071024165215319.pdf
沙发
brotherwen|  楼主 | 2007-10-24 17:08 | 只看该作者

补充

以上程序测试  HSE时钟为8M,PLL后,SYSCLK为72M
循环里不回delay();时:
能过BSRR方式, PB15为 3M方波
   ODR方式.PB15 2.18M

RCC部分翻译:
相关链接:https://bbs.21ic.com/upfiles/img/200710/2007102417656930.pdf

使用特权

评论回复
板凳
香水城| | 2007-10-24 18:41 | 只看该作者

谢谢分享!如能谈谈体会就更好了。

加油!

使用特权

评论回复
地板
brotherwen|  楼主 | 2007-10-25 14:47 | 只看该作者

体会??

觉得他还行,在摸索中,中断方面好像单片机.
目前的经验是:在配置IO,或哪个功能前,一定把他的时钟使能先

使用特权

评论回复
5
ijk| | 2007-10-25 17:57 | 只看该作者

外设和它的时钟

“在配置IO,或哪个功能前,一定把他的时钟使能先”
对了,这就是所谓时钟门控的体现,为了实现低功耗,现在的单片机通常都是这样实现的。

使用特权

评论回复
6
张进128| | 2007-10-30 08:42 | 只看该作者

顶一个

顶一个顶一个顶一个顶一个顶一个

使用特权

评论回复
7
brotherwen|  楼主 | 2007-10-31 14:20 | 只看该作者

补充 USART部分

该篇没有翻译完,但足以做USART实验
传了几次,好像这篇有点大
传不上来了,算了!

使用特权

评论回复
8
brotherwen|  楼主 | 2007-11-2 16:59 | 只看该作者

USART1小实验

void delay(void)
{
 uint i,j;
 for(i=0;i<10;i++)
 for(j=0;j<30000;j++);
 }
int main(void)
 {
      uchar dat=0;
    RCC_DeInit();
    SetupClock();
    RCC->APB2ENR|=1<<APB2_IOPBEN;
    GPIOB->CRH=0X33333333;
    GPIOB->BRR|=0XFFFF;
    usart_init();

    sendchar(0x55);
   while(1)
   { 
      //GPIOB->BSRR=0X80000000;
      //GPIOB->BSRR=0X00008000;
     GPIOB->ODR|=0X8000;
     delay();
     GPIOB->ODR&=0X7FFF;
     delay();
     sendchar(dat);
     dat=recchar();
     
    }    
   //while(1);
 }
#include <stm32f10x_map.h>
#include "main.h"
#define uart1_baud  115200

void usart_init(void)
{
    unsigned  long  mantissa,fraction,tmp;
    //使能GPIOA  clock
    RCC->APB2ENR|=1<<APB2_IOPAEN;
    //配置 PA9上拉输出,PA10 悬浮输入
    GPIOA->CRH&=~((0X0F<<8)|(0X0F<<4));  //清除相应配置位的内容
    GPIOA->CRH|=(0X0b<<4)|(0X04<<8);    //配置输出输入

    RCC->APB2ENR|=1<<USART1EN;
    
    //配置波特率   115200        USART1的外设时钟是    APB2        且等于72M
    tmp=25*72000000/(4*uart1_baud);  //100*72000000/(16*uart1_baud);   为//为了取小数位,放大了一百倍 
    mantissa=(tmp/100)&0x0fff;
    fraction=((tmp-mantissa*100)*16+50)/100;
    USART1->BRR=(mantissa<<4)|(fraction&0x0f);
    //数据长度         8位
    USART1->CR1&=~(1<<12);
    //停止位   1位
    USART1->CR2&=~(0x03<<12);
    //奇偶校验    无 
    USART1->CR1&=~(1<<10);
    //hardware flow control disable   
    USART1->CR3&=~(0X03<<8);
    //使能RX和TX  
    USART1->CR1|=(1<<3)|(1<<2);

    //禁止SCK  Clock
    USART1->CR2&=~(1<<11);
    //USART CPOL LOW
    USART1->CR2&=~(1<<10);
    //USART CPHA  2Edge
    USART1->CR2|=1<<9;
    
    //Last Bit Clock pluse  disable 
    USART1->CR2&=~(1<<8);
    //Enable USART1
    USART1->CR1|=1<<13;
}
void sendchar(uchar dat)
{
   USART1->DR=dat;
   while(!(USART1->SR&(1<<7)));     //TXE Bit
   
 }
unsigned  char recchar(void)
{ while(!(USART1->SR&(1<<5)));    //RXNE Bit
  return( uchar)(USART1->DR&0X1FF);
}
#ifndef MAIN_H
#define MAIN_H


#define uchar unsigned char
#define uint  unsigned int
//   外设时钟相应位
#define APB2_IOPBEN    3
#define APB2_IOPAEN    2
#define APB2_AFIOEN    0
#define USART1EN       14         
void RCC_DeInit(void);
void SetupClock(void);
void usart_init(void);
void  sendchar(uchar dat);
unsigned  char recchar(void);
#endif

使用特权

评论回复
9
brotherwen|  楼主 | 2007-11-6 15:41 | 只看该作者

时钟管脚问题

HSE 管脚PD0 PD1说明好像和数据手册里92页AFIO_MAPR位15 说明不符
HSI 管脚PC14 PC15 到底复位初是什么状态,是接晶振状态? 通用管脚状态??


望大侠们教导下

使用特权

评论回复
10
coyote800| | 2011-5-30 21:16 | 只看该作者
目前看不懂

使用特权

评论回复
11
xgdxff| | 2012-3-21 23:44 | 只看该作者
正在学习中 、

使用特权

评论回复
12
yanhaiyuyuyu| | 2012-4-24 22:33 | 只看该作者
学习中……

使用特权

评论回复
13
gxgclg| | 2012-4-24 22:46 | 只看该作者
既然是学习笔记,应该多一些文字之类的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

217

帖子

0

粉丝