📄 main.c
字号:
/******************************************************************
本程序只供学习使用,未经作者许可,不得用于其它任何用途
欢迎访问我的USB专区:http://group.ednchina.com/93/
欢迎访问我的blog: http://www.ednchina.com/blog/computer00
http://computer00.21ic.org
main.c file
作者:Computer-lov
建立日期: 2008.07.12
修改日期: 2008.07.29
版本:V1.2
版权所有,盗版必究。
Copyright(C) Computer-lov 2008-2018
All rights reserved
*******************************************************************/
#include "GPIO.H"
#include "RCC.H"
#include "USART.H"
#include "LCD.h"
#define FLASH_ACR (*((unsigned int *)(0x40022000 + 0x00)))
void Delay(void) //延时函数
{
unsigned int i;
for(i=0;i<2150;i++);
}
void DelayXms(unsigned int x);
/***************** 延时x毫秒函数 ***********/
void DelayXms(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<5150;j++);
}
/********************************************/
//以下时钟配置为最高性能
void SystemClockInit(void)
{
//设置flash等待周期为2,否则设置为72M系统时钟时就会跑飞
FLASH_ACR=0x32;
pbRCC_CR->HSEON=1; //使能外部高速时钟
while(!(pbRCC_CR->HSERDY)); //等待外部高速时钟稳定
pbRCC_CFGR->MCO=0; //MCO无时钟输出
pbRCC_CFGR->USBPRE=1; //USB时钟1.5分频
pbRCC_CFGR->PLLMUL=9-2; //PLL倍频设置为9倍(外部时钟8M,PLL输出72M)
pbRCC_CFGR->PLLXTPRE=0; //HSE不分频
pbRCC_CFGR->PLLSRC=1; //HSE选作做为PLL时钟源输入
pbRCC_CFGR->ADCPRE=0; //ADC时钟2分频
pbRCC_CFGR->PPRE2=1+2; //APB2设置为1分频
pbRCC_CFGR->PPRE1=2+2; //APB1设置为2分频
pbRCC_CFGR->HPRE=0; //AHB无分频
pbRCC_CR->PLLON=1; //启动PLL
while(!(pbRCC_CR->PLLRDY)); //等待PLL稳定
pbRCC_CFGR->SW=2; //选择PLL输出为时钟源
//pbRCC_AHBENR->SRAMEN=1;
//pbRCC_AHBENR->FLITFEN=1;
//IO口第二功能时钟使能
pbRCC_APB2ENR->AFIOEN=1;
//各通用IO口时钟使能
pbRCC_APB2ENR->IOPAEN=1;
pbRCC_APB2ENR->IOPBEN=1;
pbRCC_APB2ENR->IOPCEN=1;
pbRCC_APB2ENR->IOPDEN=1;
pbRCC_APB2ENR->IOPEEN=1;
//ADC时钟使能
pbRCC_APB2ENR->ADC1EN=1;
pbRCC_APB2ENR->ADC2EN=1;
//定时器1时钟使能
pbRCC_APB2ENR->TIM1EN=1;
//SPI1时钟使能
pbRCC_APB2ENR->SPI1EN=1;
//串口1时钟使能
pbRCC_APB2ENR->USART1EN=1;
//定时器2、3、4时钟使能
pbRCC_APB1ENR->TIM2EN=1;
pbRCC_APB1ENR->TIM3EN=1;
pbRCC_APB1ENR->TIM4EN=1;
//窗口看门狗时钟不使能
pbRCC_APB1ENR->WWDGEN=0;
//SPI2时钟使能
pbRCC_APB1ENR->SPI2EN=1;
//串口2、3时钟使能
pbRCC_APB1ENR->USART2EN=1;
pbRCC_APB1ENR->USART3EN=1;
//I2C1、2时钟使能
pbRCC_APB1ENR->I2C1EN=1;
pbRCC_APB1ENR->I2C2EN=1;
//USB时钟使能
pbRCC_APB1ENR->USBEN=1;
//CAN时钟使能
pbRCC_APB1ENR->CANEN=1;
//备份接口时钟使能
pbRCC_APB1ENR->BKPEN=1;
//电源接口时钟使能
pbRCC_APB1ENR->PWREN=1;
//外部低速时钟启动
pbRCC_BDCR->LSEON=1;
pbRCC_BDCR->LSEBYP=0;
pbRCC_BDCR->RTCSEL=1; //选择外部时钟为RTC时钟
}
void main(void)
{
unsigned char Sec,Min; //保存时钟
unsigned int ms;
Sec=0;
Min=0;
ms=1000;
SystemClockInit(); //系统时钟模块初始化
Usart1Init();
Usart1PutString("System start...\r\n");
LcdInit();
while(1)
{
//扫描LCD,这里为了演示,使用软件延时调用。
//实际使用时,可以开一个2ms的定时器,在定时器
//中断中调用该函数刷新。
LcdScan();
DelayXms(2); //延时2ms
ms+=2; //每次增加2ms
if(ms>=1000) //秒到达
{
ms=0;
Sec++;
if(Sec>=60) //分到达
{
Sec=0;
Min++;
if(Min>=60) //小时到达
{
Min=0;
}
}
LcdSetChar((Min/10)+'0',0,0); //分的高位,注意输入参数为字符0,不是数字
LcdSetChar((Min%10)+'0',1,1); //分的低位(需要显示小数点,最后一个参数为1)
LcdSetChar((Sec/10)+'0',2,0); //秒的高位
LcdSetChar((Sec%10)+'0',3,0); //秒的低位
}
}
//后面的代码不用
/*
//4个LED连接在PORTC4~7上,将这4个IO设置为50MHz输出口
//GPIOC4
GPIOC_MODE4=3; //50MHz 输出模式
GPIOC_CNF4=0; //通用推挽模式
//GPIOC5
GPIOC_MODE5=3; //50MHz 输出模式
GPIOC_CNF5=0; //通用推挽模式
//GPIO6
GPIOC_MODE6=3; //50MHz 输出模式
GPIOC_CNF6=0; //通用推挽模式
//GPIO7
GPIOC_MODE7=3; //50MHz 输出模式
GPIOC_CNF7=0; //通用推挽模式
//4个LED,当IO口为高电平时LED亮
while(1)
{
GPIOC_CLR=(1<<4); //灭 LED5
GPIOC_SET=(1<<7); //亮 LED2
Delay();
GPIOC_CLR=(1<<7); //灭 LED2
GPIOC_SET=(1<<6); //亮 LED3
Delay();
GPIOC_CLR=(1<<6); //灭 LED3
GPIOC_SET=(1<<5); //亮 LED4
Delay();
GPIOC_CLR=(1<<5); //灭 LED4
GPIOC_SET=(1<<4); //亮 LED5
Delay();
}*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -