完整代码
几乎每行代码都给出了注释,方便快速理解。
/* Main.c file generated by liyufei
*
* Created: 周六 4月 9 2022
* Processor: STM32F103T6
* Compiler: Keil for ARM
*/
#include <stm32f103x6.h>
#include <stm32f1xx.h>
//IO口操作宏定义,位带操作,实现51类似的GPIO控制功能
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //PA输出
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //PB输出
#define LED0 PAout(8) // PA8
#define LED1 PBout(2) // PB2
//时钟设置
//RCC_CR_HSION,RCC_CR_HSEON,RCC_CR_HSERDY,RCC_CFGR_PLLSRC等在头文件stm32f103x6.h有定义
void Clock_Init(unsigned char PLL)
{
unsigned char temp_value = 0;
RCC->CR|=RCC_CR_HSION; //使能内部高速时钟HSION
while(!(RCC_CR_HSIRDY>>1)); //等待PLL锁定
RCC->CR|=RCC_CR_HSEON; //外部高速时钟使能HSEON
while(!(RCC_CR_HSERDY>>17)); //等待外部时钟就绪
RCC->CFGR=0x00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
RCC->CFGR|=(PLL-2)<<18; //设置 PLL值 2~16,本例为9倍频
RCC->CFGR|=RCC_CFGR_PLLSRC; //PLLSRC选择外部时钟HSE为PLL输入源
RCC->CR|=RCC_CR_PLLON; //使能PLL
while(!(RCC_CR_PLLRDY>>25)); //等待 PLL锁定
RCC->CFGR|=RCC_CFGR_SW_PLL; //PLL作为系统时钟
while(temp_value!=RCC_CFGR_SWS_PLL) //等待PLL作为系统时钟设置成功
{
temp_value=RCC->CFGR;
temp_value&=0x0C;
}
}
//毫秒延时
void delay_nms(unsigned int time)
{
unsigned int i=0;
while(time--)
{
i=12000; // 250x12000 = 36000000,每隔0.5秒LED灯反转
while(i--) ;
}
}
//为LED亮灭进行GPIO口初始化
void LED_Init(void)
{
RCC->APB2ENR|= RCC_APB2ENR_IOPAEN; //使能 PORTA时钟
RCC->APB2ENR|= RCC_APB2ENR_IOPBEN; //使能 PORTB时钟
GPIOA->CRH&=0XFFFFFFF0; //初始化PA8
GPIOA->CRH|=0X00000003; //PA8 推挽输出
GPIOA->ODR|=1<<8; //PA8 初始输出高
GPIOB->CRL&=0XFFFFF0FF; //初始化PB2
GPIOB->CRL|=0X00000300; //PB2 推挽输出
GPIOB->ODR|=1<<2; //PB2 初始输出高
}
//main函数
int main (void)
{
Clock_Init(9); //设PLL为系统时钟,频率为HSE外部时钟8MHz的9倍
LED_Init(); //GPIO初始化
while (1)
{
LED0 = 0; //PA8输出0
LED1 = 1; //PB2输出1
delay_nms(250); //延时0.5S
LED0 = 1; //PA8输出1
LED1 = 0; //PB2输出0
delay_nms(250); //延时0.5S
}
}
|