5799|8

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32学习初篇 [复制链接]

#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.eeworld.com.cn/upfiles/img/200710/20071024165215319.pdf
此帖出自stm32/stm8论坛

最新回复

                                 HSE 管脚PD0 PD1说明好像和数据手册里92页AFIO_MAPR位15 说明不符HSI 管脚PC14 PC15 到底复位初是什么状态,是接晶振状态? 通用管脚状态??望大侠们教导下   详情 回复 发表于 2007-11-6 15:41
点赞 关注
 

回复
举报

57

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

补充

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

RCC部分翻译:
相关链接:https://bbs.eeworld.com.cn/upfiles/img/200710/2007102417656930.pdf
此帖出自stm32/stm8论坛
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

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

                                 加油!
此帖出自stm32/stm8论坛
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 

体会??

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

回复

81

帖子

0

TA的资源

一粒金砂(初级)

5
 

外设和它的时钟

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

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 

顶一个

                                 顶一个顶一个顶一个顶一个顶一个
此帖出自stm32/stm8论坛
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

7
 

补充 USART部分

该篇没有翻译完,但足以做USART实验
传了几次,好像这篇有点大
传不上来了,算了!
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 

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
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

9
 

时钟管脚问题

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


望大侠们教导下
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表