文档库 最新最全的文档下载
当前位置:文档库 › STM32对时钟芯片PCF8563的编程

STM32对时钟芯片PCF8563的编程

STM32对时钟芯片PCF8563的编程
STM32对时钟芯片PCF8563的编程

这是用STM32对PCF8563编程的程序、模拟IIC,经验证可用~

移植用到的文件:IIC.h IIC.c PCF8563.h PCF8563.c ,我把它们全都复制到了这个Word文档里。

使用要初始化的函数:void PCF8563_Init(void). 就唯一这个。

全局变量: u8 PCF8563_Time[7]; 程序初始的值是给PCF8563设置的时间,程序中读取返回的值是PCF8563当时的时间。

我这里使用的IIC的 SCL,SDA的引脚分别为PA.0 PA.1,具体看IIC.h 和 IIC.C。只要修改好两个引脚的初始化配套你手上的板子这,就能成功移植~ Delay_nus(20):这是一个延迟20us的函数。

IIC.h:

#ifndef _IIC_H_

#define _IIC_H_

#include "stm32f10x.h"

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/ /*

#define I2C_Speed 100000

#define I2C1_SLA VE_ADDRESS7 0xA0

#define I2C_PageSize 256 */ //SCL PA0 //SDA PA1

#define SCL_H() GPIO_SetBits(GPIOA, GPIO_Pin_0)

#define SCL_L() GPIO_ResetBits(GPIOA, GPIO_Pin_0)

#define SDA_H() GPIO_SetBits(GPIOA, GPIO_Pin_1)

#define SDA_L() GPIO_ResetBits(GPIOA, GPIO_Pin_1)

//返回0,和1

#define Read_SDA() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)

u8 IIC_ReadByte(void);

void IIC_WriteByte(u8 byte);

void IIC_WaitAck(void);

void IIC_Stop(void);

void IIC_Start(void);

void IIC_Init(void);

void I2C_Ack(void);

void I2C_NoAck(void);

//取回八个字节的数据:秒,分,时,天,星期,月份,年份。

#endif

IIC.c:

#include "IIC.h"

#include "delay.h" /**/

void IIC_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/* Configure I2C1 pins: SCL and SDA */

RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出,可以在不用改变成输入的情况下读取IO的电平

GPIO_Init(GPIOA, &GPIO_InitStructure);

SCL_H(); //拉高

SDA_H();

}

void IIC_Start(void)

{

/* SDA_H();

SCL_H();

delay_nus(20);

SDA_L();

delay_nus(20); */

SDA_H();

SCL_H();

delay_nus(20);

SDA_L();

delay_nus(20);

SDA_L();

delay_nus(20);

}

void IIC_Stop(void)

{

SCL_L(); //1

delay_nus(20);// 2

SDA_L();

delay_nus(20);

SCL_H();

delay_nus(20);

SDA_H();

delay_nus(20);

}

void IIC_WaitAck(void)

{

u16 k;

SCL_L();

SDA_H();

delay_nus(20);

SCL_H();

k = 0;

while((Read_SDA()!= 0) && (k < 60000))

k++;

delay_nus(20);

SCL_L();

delay_nus(20);

}

void IIC_WriteByte(u8 byte)

{

u8 i = 0;

for(i = 0; i < 8; i++)

{

SCL_L();

delay_nus(20);

if(byte & 0x80)

{

SDA_H();

}

else

{

SDA_L();

}

delay_nus(20);

SCL_H();

delay_nus(20);

byte<<=1;

}

SCL_L();

delay_nus(20);

}

u8 IIC_ReadByte(void)

{

u8 i,ReadByte;

SDA_H();

for(i = 0; i < 8; i++)

{

ReadByte <<= 1;

SCL_L();

delay_nus(20);

SCL_H();

delay_nus(20);

if(Read_SDA())

{

ReadByte |= 0x01;

}

else

{

ReadByte &= ~(0x01);

}

}

return ReadByte;

}

void I2C_Ack(void)

{

SCL_L();

delay_nus(20);

SDA_L();

delay_nus(20);

SCL_H();

delay_nus(20);

SCL_L();

delay_nus(20);

}

void I2C_NoAck(void)

{

SCL_L();

delay_nus(20);

SDA_H();

delay_nus(20);

SCL_H();

delay_nus(20);

SCL_L();

delay_nus(20);

}

PCF8563.h:

#ifndef _PCF8563_H_

#define _PCF8563_H_

#include "IIC.h"

#define ReadCode 0xa3

#define WriteCode 0xa2

void PCF8563_Init(void);

u8 PCF8563_ReaDAdress(u8 Adress);

void PCF8563_WriteAdress(u8 Adress, u8 DataTX);

//取回7个字节的数据:秒,分,时,天,星期,月份,年份。 //全局变量

extern u8 PCF8563_Time[7];

void PCF8563_ReadTimes(void);

//在CLKOUT上定时1S输出一个下降沿脉冲

void PCF8563_CLKOUT_1s(void);

#endif

PCF8563.c:

#include "PCF8563.h"

//全局变量,程序初始的值就是要初始化的时间, //用途:1:初始化时间。2:读取返回时间

// 秒,分,时,天,星期,月份,年份。

u8 PCF8563_Time[7] = {50, 59, 23, 31, 6, 12, 12};

void PCF8563_Init(void)

{

IIC_Init(); //十进制码转换成BCD码

PCF8563_Time[0] = ((PCF8563_Time[0]/10) << 4) | (PCF8563_Time[0]%10);

PCF8563_Time[1] = ((PCF8563_Time[1]/10) << 4) | (PCF8563_Time[1]%10);

PCF8563_Time[2] = ((PCF8563_Time[2]/10) << 4) | (PCF8563_Time[2]%10);

PCF8563_Time[3] = ((PCF8563_Time[3]/10) << 4) | (PCF8563_Time[3]%10);

// PCF8563_Time[4] = ((PCF8563_Time[4]/10 << 4)) | (PCF8563_Time[4]%10); //星

期不用转换

PCF8563_Time[5] = ((PCF8563_Time[5]/10 << 4)) | (PCF8563_Time[5]%10);

PCF8563_Time[6] = ((PCF8563_Time[6]/10 << 4)) | (PCF8563_Time[6]%10);

PCF8563_CLKOUT_1s(); PCF8563_WriteAdress(0x00, 0x20); //禁止RTC source clock //初始化PCF8563的时间

PCF8563_WriteAdress(0x02, PCF8563_Time[0]);

PCF8563_WriteAdress(0x03, PCF8563_Time[1]);

PCF8563_WriteAdress(0x04, PCF8563_Time[2]);

PCF8563_WriteAdress(0x05, PCF8563_Time[3]);

PCF8563_WriteAdress(0x06, PCF8563_Time[4]);

PCF8563_WriteAdress(0x07, PCF8563_Time[5]);

PCF8563_WriteAdress(0x08, PCF8563_Time[6]);

PCF8563_WriteAdress(0x00, 0x00); //Enable RTC sorce clock

}

u8 PCF8563_ReaDAdress(u8 Adress)

{

u8 ReadData;

IIC_Start();

IIC_WriteByte(0xa2);

IIC_WaitAck();

IIC_WriteByte(Adress);

IIC_WaitAck();

IIC_Start();

IIC_WriteByte(0xa3);

IIC_WaitAck();

ReadData = IIC_ReadByte();

IIC_Stop();

return ReadData;

}

void PCF8563_WriteAdress(u8 Adress,u8 DataTX)

{

IIC_Start();

IIC_WriteByte(0xa2);

IIC_WaitAck();

IIC_WriteByte(Adress);

IIC_WaitAck();

IIC_WriteByte(DataTX);

IIC_WaitAck();

IIC_Stop();

}

//取回八个字节的数据:秒,分,时,天,星期,月份,年份。

void PCF8563_ReadTimes(void)

{

IIC_Start();

IIC_WriteByte(0xa2);

IIC_WaitAck();

IIC_WriteByte(0x02);

IIC_WaitAck();

IIC_Start();

IIC_WriteByte(0xa3);

IIC_WaitAck();

PCF8563_Time[0] = IIC_ReadByte()&0x7f; I2C_Ack();

PCF8563_Time[1] = IIC_ReadByte()&0x7f; I2C_Ack();

PCF8563_Time[2] = IIC_ReadByte()&0x3f; I2C_Ack();

PCF8563_Time[3] = IIC_ReadByte()&0x3f; I2C_Ack();

PCF8563_Time[4] = IIC_ReadByte()&0x07; I2C_Ack();

PCF8563_Time[5] = IIC_ReadByte()&0x1f; I2C_Ack();

PCF8563_Time[6] = IIC_ReadByte(); I2C_NoAck();

IIC_Stop();

PCF8563_Time[0] = ((PCF8563_Time[0]&0xf0)>>4)*10 + (PCF8563_Time[0]&0x0f);

PCF8563_Time[1] = ((PCF8563_Time[1]&0xf0)>>4)*10 + (PCF8563_Time[1]&0x0f);

PCF8563_Time[2] = ((PCF8563_Time[2]&0xf0)>>4)*10 + (PCF8563_Time[2]&0x0f);

PCF8563_Time[3] = ((PCF8563_Time[3]&0xf0)>>4)*10 + (PCF8563_Time[3]&0x0f);

PCF8563_Time[4] = ((PCF8563_Time[4]&0xf0)>>4)*10 + (PCF8563_Time[4]&0x0f);

PCF8563_Time[5] = ((PCF8563_Time[5]&0xf0)>>4)*10 + (PCF8563_Time[5]&0x0f);

PCF8563_Time[6] = ((PCF8563_Time[6]&0xf0)>>4)*10 + (PCF8563_Time[6]&0x0f);

}

//在CLKOUT上定时1S输出一个下降沿脉冲,经过验证,可以设置STM32的GPIO上拉输入,设置成下降沿中断,单片机每过1S产生一次中断

void PCF8563_CLKOUT_1s(void)

{

PCF8563_WriteAdress(0x01, 0); //禁止定时器输出,闹铃输出

PCF8563_WriteAdress(0x0e, 0); //关闭定时器等等 //

PCF8563_WriteAdress(0x0e, 0); //写入1

PCF8563_WriteAdress(0x0d, 0x83); //打开输出脉冲

}

stm32:系统时钟

实验4 系统时钟实验 上一章,我们介绍了STM32 内部系统滴答定时器,该滴答定时器产生的延时非常精确。在本章中,我们将自定义RCC系统时钟,通过改变其倍频与分频实现延时时间变化,实现LED灯闪烁效果。通过本章的学习,你将了解 RCC系统时钟的使用。本章分为以下学习目标: 1、了解 STM32 的系统构架。 2、了解 STM32 的时钟构架。 3、了解 RCC 时钟的操作步骤。 1.1 STM32 的系统构架 STM32 的时钟比较复杂,它可以选择多种时钟源,也可以选择不一样的时钟频率,而且在系统总线上面,每条系统的时钟选择都是有差异的。所以想要清楚的了解 STM32 的时钟分配,我们先来了解一下 STM32 的系统构架是什么样的。 从上图我们知道,RCC 时钟输出时钟出来,然后经过 AHB 系统总线,分别

分配给其他外设时钟,而不一样的外设,是先挂在不一样的桥上的。比如: ADC1、ADC2、 SPI1、GPIO 等都是挂在 APB2 上面,而有些是挂在 APB1上面,所以,虽然它们都是从 RCC 获取的时钟,但是它们的频率有时候是不一样的。 1.2 STM32 的时钟树 STM32 单片机上电之后,系统默认是用的时钟是单片机内部的高速晶振时钟,而这个晶振容易受到温度的影响,所以晶振跳动的时候不是有一定的影响,所以一般开发使用的时候都是使用外部晶振,而且单片机刚启动的时候,它的时钟频率是 8MHZ,而 STM32 时钟的最高频率是 72MHZ,所以单片机一般开机之后运行的程序是切换时钟来源,并设置时钟频率。大家可能有点疑惑,在第一章到第三章之中,我们并没有看到单片机开机之后设置时钟来源和时钟频率的。其实在使用库函数的时候,其实在库函数启动文件里面,是帮助我们把时钟频率设置到 72MHZ 了。大家可以打开一个库函数工程,在 system_stm32f10x.c 的第 106行,它定义了一个 SYSCLK_FREQ_72MHz: #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) /* #define SYSCLK_FREQ_HSE HSE_VALUE */ #define SYSCLK_FREQ_24MHz 24000000 #else #define SYSCLK_FREQ_72MHz 72000000 然后在下面的程序中,根据这个 SYSCLK_FREQ_72MHz 定义,它默认设置成 72MHZ。接下来我们来看一下具体的 RCC 时钟树:

stm32时钟详细说明

在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。其实是四个时钟源,如下图所示(灰蓝色),PLL是由锁相环电路倍频得到PLL时钟。 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。RTC的时钟源通过RTCSEL[1:0]来选择。 STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。 另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。 系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI或者HSE。系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、 4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用: ①、送给AHB总线、内核、内存和DMA使用的HCLK时钟。 ②、通过8分频后送给Cortex的系统定时器时钟。 ③、直接送给Cortex的空闲运行时钟FCLK。 ④、送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。 ⑤、送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。

stm32系统时钟配置问题

stm32系统时钟配置问题 系统从上电复位到72mz 配置好之前,提供时钟的是内如高速rc 振荡器提 供8MZ 的频率,这个由下面void SystemInit (void)函数的前面的一部分代码来 完成的和保证的:RCC->CR |= (uint32_t)0x00000001; #ifndef STM32F10X_CLRCC->CFGR &= (uint32_t)0xF8FF0000;#elseRCC- >CFGR &= (uint32_t)0xF0FF0000;#endif RCC->CR &= (uint32_t)0xFEF6FFFF; RCC->CR &= (uint32_t)0xFFFBFFFF; RCC->CFGR &= (uint32_t)0xFF80FFFF; #ifdef STM32F10X_CLRCC->CR &= (uint32_t)0xEBFFFFFF; RCC->CIR = 0x00FF0000; RCC->CFGR2 = 0x00000000;#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)RCC->CIR = 0x009F0000; RCC->CFGR2 = 0x00000000;#elseRCC->CIR = 0x009F0000;#endif#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)#ifdef DATA_IN_ExtSRAMSystemInit_ExtMemCtl();#endif#endif 接着void SystemInit (void)调用SetSysClock();函数,将系统时钟配置到 72m,将AHB,APB1,APB2 等外设之前的时钟都配置好,然后切换到72mz 下 运行。所以在使用哪个外设的时候,只需要使能相应的外设时钟就可以了 tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

STM32时钟初始化函数SysInit详解

花了一天的时间,总算是了解了SystemInit()函数实现了哪些功能,初学STM32,,现记录如下(有理解错误的地方还请大侠指出):使用的是3.5的库,用的是STM32F107VC,开发环境RVMDK4.23 我已经定义了STM32F10X_CL,SYSCLK_FREQ_72MHz 函数调用顺序: startup_stm32f10x_cl.s(启动文件)→SystemInit() → SetSysClock () →SetSysClockTo72() 初始化时钟用到的RCC寄存器复位值: RCC_CR = 0x0000 xx83; RCC_CFGR = 0x0000 0000;RCC_CIR = 0x0000 0000; RCC_CFGR2 = 0x0000 0000; SystemInit() 在调用SetSysClock()之前RCC寄存器的值如下(都是一些与运算,或运算,在此就不赘述了): RCC->CR = 0x0000 0083; RCC->CIR = 0x00FF0000; RCC->CFGR2 = 0x00000000;至于这些寄存器都代表着什么意思,详见芯片资料RCC寄存器,该文重点不在此处;SetSysClock()函数如下: static void SetSysClock(void) { #ifdef SYSCLK_FREQ_HSE SetSysClockToHSE(); #elif defined SYSCLK_FREQ_24MHz SetSysClockTo24(); #elif defined SYSCLK_FREQ_36MHz SetSysClockTo36(); #elif defined SYSCLK_FREQ_48MHz SetSysClockTo48(); #elif defined SYSCLK_FREQ_56MHz SetSysClockTo56(); #elif defined SYSCLK_FREQ_72MHz//我的定义的是SYSCLK_FREQ_72MHz,所以调用SetSysClockTo72() SetSysClockTo72(); #endif } SetSysClockTo72()函数如下: static void SetSysClockTo72(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ /* Enable HSE */ RCC->CR |= ((uint32_t)RCC_CR_HSEON); /* Wait till HSE is ready and if Time out is reached exit */ do

设置stm32系统各部分时钟

设置stm32系统各部分时钟 函数如下: /******************************************************************** ****** * 函数名: RccInitialisation* 函数描述: 设置系统各部分时钟* 输入参数: 无* 输出结果: 无* 返回值: 无 ******************************************************************** ******/void RccInitialisation(void){/* 定义枚举类型变量HSEStartUpStatus */ErrorStatus HSEStartUpStatus;/* 复位系统时钟设置*/RCC_DeInit();/* 开启HSE*/RCC_HSEConfig(RCC_HSE_ON);/* 等待HSE 起振并稳定*/HSEStartUpStatus = RCC_WaitForHSEStartUp();/* 判断HSE 起是否振成功,是则进入if()内部*/if(HSEStartUpStatus == SUCCESS){/* 选择HCLK(AHB)时钟源为SYSCLK 1 分频*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/* 选择PCLK2 时钟源为HCLK(AHB) 1 分频 */RCC_PCLK2Config(RCC_HCLK_Div1);/* 选择PCLK1 时钟源为HCLK(AHB) 2 分频*/RCC_PCLK1Config(RCC_HCLK_Div2);/* 设置FLASH 延时周期数为2 */FLASH_SetLatency(FLASH_Latency_2);/* 使能FLASH 预取缓存*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 选择锁相环(PLL)时钟源为HSE 1 分频,倍频数为9,则PLL 输出频率为 8MHz * 9 = 72MHz*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/* 使能PLL */RCC_PLLCmd(ENABLE);/* 等待PLL 输出稳 定*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);/* 选择

STM32学习笔记(3):系统时钟和SysTick定时器

STM32学习笔记(3):系统时钟和SysTick定时器 1.STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL (1)HSI是高速内部时钟,RC振荡器,频率为8MHz; (2)HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围是4MHz – 16MHz; (3)LSI是低速内部时钟,RC振荡器,频率为40KHz; (4)LSE是低速外部时钟,接频率为32.768KHz的石英晶体; (5)PLL为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL 的输入可以接HSI/2、HSE或者HSE/2。倍频可选择为2 – 16倍,但 是其输出频率最大不得超过72MHz。 其中,40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。 STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为 48MHz的时钟源。该时钟源只能从PLL端获取,可以选择为1.5分频或者1分频,也就是,当需使用到USB模块时,PLL必须使能,并且时钟配置为48MHz 或72MHz。 另外STM32还可以选择一个时钟信号输出到MCO脚(PA.8)上,可以选择为PLL输出的2分频、HSI、HSE或者系统时钟。 系统时钟SYSCLK,它是提供STM32中绝大部分部件工作的时钟源。系统时钟可以选择为PLL输出、HSI、HSE。系系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各个模块使用,AHB分频器可以选择1、2、4、8、16、64、128、256、512分频,其分频器输出的时钟送给5大模块使用: (1)送给AHB总线、内核、内存和DMA使用的HCLK时钟; (2)通过8分频后送给Cortex的系统定时器时钟; (3)直接送给Cortex的空闲运行时钟FCLK; (4)送给APB1分频器。APB1分频器可以选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一

stm32如何配置时钟

学习STM32笔记2 如何配置时钟 学习STM32笔记2 如何配置时钟 /************************************************************* 该程序目的是用于测试核心板回来后是否能正常工作。包括 两个按键、两个LED现实。按键为PC4、PC5,LED为PA0\PA1。LED为 低电平时点亮。按键为低电平时触发。 ************************************************************/ #i nclude "stm32f10x_lib.h" void RCC_Configuration(void);//设置系统主时钟 void GPIO_Configuration(void);//设置邋邋IO参数 void NVIC_Configuration(void);//设置中断表地址 void delay(void);//延时函数 int main(void) { #ifdef DEBUG debug(); #endifRCC_Configuration(); NVIC_Configuration(); GPIO_Configuration(); while (1) { delay(); //设置指定的数据端口位 GPIO_SetBits(GPIOA,GPIO_Pin_0); //设置指定的数据端口位 delay(); GPIO_ResetBits(GPIOA,GPIO_Pin_0); //清除指定的数据端口位 GPIO_SetBits(GPIOA,GPIO_Pin_1); delay(); GPIO_ResetBits(GPIOA,GPIO_Pin_1); delay(); /********************************************* 使用setbits 与resetbits 是比较简单,其实还是可以使用 其它函数。例如可以使用GPIO_WriteBit GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET); GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);对于好像流水灯呀这些一个整段IO,可以使用GPIO_Write(GPIOA, 0x1101); *********************************************/

stm32f030时钟配置工具AN4055

May 2012Doc ID 022837 Rev 11/17 AN4055 Application note Clock configuration tool for STM32F0xx microcontrollers Introduction This application note presents the clock system configuration tool for the STM32F0xx microcontroller family. The purpose of this tool is to help the user configure the microcontroller clocks, taking into consideration product parameters such as power supply and Flash access mode. The configuration tool is implemented in the “STM32F0xx_Clock_Configuration_VX.Y .Z.xls” file which is supplied with the STM32F0xx Standard Peripherals Library and can be downloaded from https://www.wendangku.net/doc/7510485358.html, . This tool supports the following functionalities for the STM32F0xx: ● Configuration of the system clock, HCLK source and output frequency ● Configuration of the Flash latency (number of wait states depending on the HCLK frequency)● Setting of the PCLK1, PCLK2, TIMCLK (timer clocks) and I2SCLK frequencies ●Generation of a ready-to-use system_stm32f0xx.c file with all the above settings (STM32F0xx CMSIS Cortex-M0 Device Peripheral Access Layer System Source File)The STM32F0xx_Clock_Configuration_VX.Y .Z.xls is referred to as “clock tool” throughout this document. Before using the clock tool, it is essential to read the STM32F0xx microcontroller reference manual (RM0091). This application note is not a substitute for the reference manual.This tool supports only the STM32F0xx devices. For VX.Y .Z, please refer to the tool version, example V1.0.0 https://www.wendangku.net/doc/7510485358.html,

05_STM32F4通用定时器详细讲解

STM32F4系列共有14个定时器,功能很强大。14个定时器分别为: 2个高级定时器:Timer1和Timer8 10个通用定时器:Timer2~timer5 和 timer9~timer14 2个基本定时器: timer6和timer7 本篇欲以通用定时器timer3为例,详细介绍定时器的各个方面,并对其PWM 功能做彻底的探讨。 Timer3是一个16位的定时器,有四个独立通道,分别对应着PA6 PA7 PB0 PB1 主要功能是:1输入捕获——测量脉冲长度。 2 输出波形——PWM 输出和单脉冲输出。 Timer3有4个时钟源: 1:内部时钟(CK_INT ),来自RCC 的TIMxCLK 2:外部时钟模式1:外部输入TI1FP1与TI2FP2 3:外部时钟模式2:外部触发输入TIMx_ETR ,仅适用于TIM2、TIM3、TIM4,TIM3,对应 着PD2引脚 4:内部触发输入:一个定时器触发另一个定时器。 时钟源可以通过TIMx_SMCR 相关位进行设置。这里我们使用内部时钟。 定时器挂在高速外设时钟APB1或低速外设时钟APB2上,时钟不超过内部高速时钟HCLK ,故当APBx_Prescaler 不为1时,定时器时钟为其2倍,当为1时,为了不超过HCLK ,定时器时钟等于HCLK 。 例如:我们一般配置系统时钟SYSCLK 为168MHz ,内部高速时钟 AHB=168Mhz ,APB1欲分频为4,(因为APB1最高时钟为42Mhz ),那么挂在APB1总线上的timer3时钟为84Mhz 。 《STM32F4xx 中文参考手册》的424~443页列出与通用定时器相关的寄存器一共20个, 以下列出与Timer3相关的寄存器及重要寄存器的简单介绍。 1 TIM3 控制寄存器 1 (TIM3_CR1) 作用:1使能自动重载TIM3_ARR 2定时器的计数器递增或递减计数。 3 事件更新。 4 计数器使能 2 TIM 3 控制寄存器 2 (TIM3_CR2) 3 TIM3 从模式控制寄存器 (TIM3_SMCR) 4 TIM3 DMA/中断使能寄存器 (TIM3_DIER) SYSCLK(最高 AHB_Prescaler APBx_Prescaler

stm32时钟树分析

void RCC_Configuration(void) { /* RCC system reset(for debug purpose) */ RCC_DeInit(); /* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON);

/* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08) { } } }

STM32时钟系统与软件配置

STM32时钟系统与软件配置 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法 如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法: 2.1)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。 2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。此方法可以减小功耗并(相对上面2.1)节省2个外部电阻。 使用HSE时钟,程序设置时钟参数流程: 1、将RCC寄存器重新设置为默认值RCC_DeInit; 2、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON); 3、等待外部高速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp(); 4、设置AHB时钟RCC_HCLKConfig; 5、设置高速AHB时钟RCC_PCLK2Config; 6、设置低速速AHB时钟RCC_PCLK1Config;

STM32定时时间的计算

STM32 定时器定时时间的计算 假设系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由 PCLK1 得到关键是设定时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。RCC_Configuration()的SystemInit()的 RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。因此,每次进入中断服务程序间隔时间为: ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒。定时器的基本设置如下: 1、TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数例如:时钟频率=72/(时钟预分频+1)。 2、TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器周期的值(定时时间)累计 0xFFFF个频率后产生个更新或者中断(也是说定时时间到)。 3、TIM_TimeBaseStructure.TIM_CounterMode=TIM1_CounterMode_Up; //定时器模式向上计数。 4、 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值。 5、 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定时器2。 6、 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断溢出中断。 7、 TIM_Cmd(TIM2, ENABLE);//打开定时器或者: TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频35999,72M/ (35999+1)/2=1Hz 1秒中断溢出一次。 8、 TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1秒。 9、注意使用不同定时器时,要注意对应的时钟频率。例如TIM2对应的是APB1,而TIM1对应的是APB2 通用定时器实现简单定时功能 以TIME3为例作为说明,简单定时器的配置如下: void TIM3_Config(void) { TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; TIM_DeInit(TIM3); //复位TIM2定时器 /* TIM2 clock enable [TIM2定时器允许]*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* TIM2 configuration */ TIM_TimeBaseStructure.TIM_Period = 49; // 0.05s定时 TIM_TimeBaseStructure.TIM_Prescaler = 35999; // 分频36000 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分割TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方向向上计数 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* Clear TIM2 update pending flag[清除TIM2溢出中断标志] */

基于STM32的TFT指针式时钟

基于STM32的TFT指针式时钟 摘要 自时钟发明的那天起,它就注定了与人们有着密不可分的关系,但科学技术在不断发展,人们随着时间的推移对时间计量的精度要求越来越高,机械式时钟也越来越满足不了人们日益增高的要求了。取而代之的事具有高度准确性和直观性且无机械装置,使用寿命更长更长等优点的电子时钟。电子时钟更具人性化,更能提高人们的生活质量,更受人们欢迎,机械时代已经远去,电子时代已经到来。因此本设计是基于意法半导体公司(ST)的STM32开发平台实现一种高精度,智能化的指针式时钟系统,采用STM32内部RTC设计电子时钟时,通常是数字显示,这是由于选用数码管和1602等器件的显示能力有限。而12864是基于点阵式的液晶屏,其像素点为128×64,但12864自身像素较低,使其显示指针式时钟效果远低于2.2寸TFT-LCD液晶,但两者所基于的原理相同。因此本设计采用STM32为控制核心,2.2寸TFT-LCD液晶作为显示芯片,构成了一个指针式电子时钟。 关键词:STM32;RTC;TFT-LCD

第1章绪论 1.1 引言 随着科学技术的发展和电子技术产业结构调整,单片机开始迅速发展,由于家用电器逐渐普及,市场对于智能时钟控制系统的需求也越来越大。单片机以其芯片集成度高、处理功能强、可靠性高等优点,成功应用于工业自动化、智能仪器仪表、家电产品等领域。 近些年,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。而目前,对于指针式时钟来说,所用的指针大多是靠机械装置驱动达到显示时间的目的,例如手表,挂钟,钟楼等等,单片机在指针式时钟中的应用也已经非常普遍的,人们对指针时钟的功能及工作顺序都非常熟悉。但是却很少知道它的内部结构以及工作原理。由单片机作为指针时钟的核心控制器,可以通过它的时钟信号进行计时实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。输出设备显示器可以用液晶显示技术。 1.2 本设计的目的和意义 1.2.1 设计目的 (1)巩固,加深和扩大STM32应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力; (2)培养针对课题需要,选择和查阅有关手册,图表及文献资料的自学能力,提高组成系统,编程,调试的动手能力; (3)对课题设计方案的分析、选择、比较,熟悉用STM32做系统开发,研制的过程,软硬件设计的方法,内容及步骤; (4)进一步掌握C语言在硬件编程中的应用,熟悉怎样用C语言实现TFT-LCD上的绘图功能; (5)掌握STM32内部RTC的原理和应用。 1.2.2设计意义 数字指针式时钟是采用数字电路实现对时,分,秒,星期,年,月,日等数字以及指针表盘显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,

STM32滴答时钟

关于STM32 滴答时钟 相信不论是初学者还是高手,都会被STM32的滴答时钟所吸引。STM32有很多计数器,也有很多计数器中断。当别人还在用计数器做定时扫描的时候,我们就默默的开始了滴答时钟做扫描了。让他们去任意的浪费资源吧,我们节约资源,把计数器发挥更大的作用。 Systick定时器属于cortex内核部件,在芯片介绍的datasheet中没有提到过,可以参考 《CortexM3权威指南》或《STM32xxx-Cortex编程手册》。 首先来看Systick的时钟来源,如图一。可以看出在STM32中Systick以HCLK(AHB 时钟)或HCLK/8作为运行时钟。 图1 另外要注意Systick是一个24位的定时器,即一次最多可以计数224个时钟脉冲,这个脉冲计数值被保存到当前计数值寄存器STK_VAL中,这个计数器只能向下计数,每接收到一个时钟脉冲STK_VAL的值就向下减1,直至0,当STK_VAL的值被减至0时,由硬件自动把重载寄存器STK_LOAD中保存的数据加载到STK_VAL,意思就是它会自动重装。当STK_VAL 的值被倒计至0时,触发中断,就可以在中断服务函数中处理定时事件了。 要让Systick正常工作,必须要对Systick进行配置。它的配置很简单,只有三个控制位和一个标志位,都位于寄存器STK_CRL中,见图二。

图二 ENABLE: 为Systick timer的使能位,此位为1的时候开始计数,为0则关闭Systick timer。 TICKINT: 为中断触发使能位,此位为1的时候并且STK_VAL倒计至0的时候会触发Systick 中断,此位为0的时候不触发中断。 CLKSOURCE: 为Systick的时钟选择位,此位为1的时候Systick的时钟为AHB时钟,此位为0 的时候Systick的时钟为AHB/8(AHB的8分频)。 COUNTFLAG: 为Systick的标志位,当STK_VAL倒计至0,此标志位会被置1。 现在我们不会再为滴答时钟而感到迷惑了吧! 下面将详细描述如何去设置计数器,我们在很多地方看到这样一个函数: SysTick_Config(SystemCoreClock / 1000) 配置为1ms中断一次 SysTick_Config(SystemCoreClock / 100000) 配置为10us中断一次 SysTick_Config(SystemCoreClock / 1000000) 配置为10us中断一次 我们将细说一下,SystemCoreClock/100000 为什么是10us 我们从图1时钟数可以看出Systick的时钟和AHB有关,从图2中了解到滴答时钟可设置,结合两处就能看明白。若不去设置,系统默认为AHB时钟,即72MHz。 系统文件中可查找出以下描述: /************************************************************************** ***** * Clock Definitions *************************************************************************** ****/ #ifdef SYSCLK_FREQ_HSE uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /*!< System Clock Frequency (Core Clock) */ #elif defined SYSCLK_FREQ_24MHz uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz; /*!< System Clock Frequency (Core Clock) */ #elif defined SYSCLK_FREQ_36MHz uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz; /*!< System

stm32学习之系统时钟

stm32学习之系统时钟 STM32入门学习心得 — 系统时钟 STM32的时钟与单片机相比要复杂的多,它能够对每一个外设以及IO口进行时钟的设置,这是单片机是无法和它比拟的,所以正确的理解和灵活的运用stm32的时 钟是很重要的。 STM32有3个不同的时钟源可以用于驱动系统时钟(SYSCLK),分别为: HSI振荡器时钟(内部高速时钟)。 HSE振荡器时钟(外部高速时钟)。 PLL时钟。 STM32还有两个二级时钟用来驱动独立的看门狗和选择性的驱动RTC。分别为:32KHZ低速内部RC振荡器(LSI RC)用来驱动独立的开门狗和选择性的驱动用于从停止/ 待机模式自动唤醒的RTC。 32.768kHz低速外部晶体振荡器(LSE 晶体振荡器)用来选择性的驱动实时时钟。 注:每个时钟源在使用时都可以独立的打开/关掉,以节省功耗。 在这里我们可以通过框图来直观的理解STM32的系统时钟。系统时钟框图如图1所示。 图一系统框图

通过图一不妨来详细分析下系统各个部分的时钟。 HSI时钟 HSI时钟通过一个8MHz的内部RC振荡器产生,并且可以被直接用作系统时钟,或者经过2倍频后作为PLL的输出作为SYSCLKS时钟。在系统复位时,HSI振荡器被选择默认的系统SYSCLKS时钟。内部时钟的缺点是频率的精确度没有外部晶体振荡器的高。 程序实现(所有程序都是基于固件库): 直接作为SYSCLKS时钟:RCC_DeInit();系统默认 经过PLL输出作为SYSCLKS时钟: RCC_DeInit(); SystemInit (); 可以在固件库中的stm32f10x_rcc.c文件中通过开放宏定义来选择系统时 钟经过倍频后的频率,固件库默认为72MHZ。如图2所示: 如图2所示 HSE时钟 高速外部时钟信号可以通过2个可能的时钟源产生。分别为: HSE 外部晶体/陶瓷共振器。 HSE 外部时钟。 外部时钟源 在该种模式下,必须提高外部时钟源,外部时钟源可以达到25MHz,用户可以通过设置时钟控制寄存器(RCC_CR)中的HSEBYP和HSEON 位选择该模式。占空必50%的外部时钟信号(方波,正弦波,三角波)必须用来驱动OSC_IN引脚,同时OSC_OUT引脚置于高 阻态。 外部晶体振荡器/陶瓷共振器(HSE晶体) 4~16MHz的外部振荡器具有能够在主时钟上产生一个非常精确地速率的优 点。 时钟控制寄存器(RCC_CR)中的HSERDY标志指示了高速外部振荡器是否是稳定的,在启动时,时钟直到硬件设置了该标志位才释放,如果在时钟中断寄存器(RCC_CR)中打开了, 就会产生一个中断。 HSE晶体振荡器可以通过时钟控制寄存器(RCC_CR)中的HSEON位来打开或 禁止。 程序实现(所有程序都是基于固件库): 1.直接作为SYSCLKS时钟: RCC_DeInit(); /*************************外部时钟设置 *****************************/

STM32F103RC系统时钟配置

地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司 STM32F103RC 系统时钟配置 1、打开D:\program\KEL_MDT_ARM\STM32_Template\USER 目录,找到STM32-DEMO 文件,双击打开,KEIL-uVision4就开始运行了,得到下图: 2、双击“STARTCODE ”下面的“start_stm32f10x_hd.s ”打开STM32F103RC 的启动文件,找“SystemInit ”,得到下图:

地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司3、点击当前的行,右击鼠标,将光标移动到“Go To Definition Of SystemInit”,见下图: 4、点击“Go To Definition Of SystemInit ”,会跳转到system_stm32f10x.c 文件,见下图:

地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司5、在“system_stm32f10x.c ”文件中,在“void SystemInit (void)”函数体内找到“SetSysClock();”,见下图: 6、点击“SetSysClock()”,右击鼠标,将光标移动到“Go To Definition Of SystemClock”,见下图:

地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司 7、点击“Go To Definition Of SystemClock”,会跳转到system_stm32f10x.c 文件,见下图: 8、点击“defined SYSCLK_FREQ_72MHz ”,右击鼠标,将光标移到到“Go To Definition Of SYSCLK_FREQ_72MHz ”,见下图:

相关文档
相关文档 最新文档