第6周实验&2—基于寄存器&标准外设库的LED流水灯
实验一用C语言寄存器方式实现
1.建立工程
选择实验所需的芯片:STM32F103C8
2.添加启动文件如图所示
3.创建main.c文件
4.编写main.c文件
代码实现:
#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
#define GPIOB_CRH (*(unsigned int *)0x40010C04)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)
#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
void SystemInit(void);
void Delay_ms(volatile unsigned int);
void A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
GPIOA_ODR=0x0<<4;
GPIOB_ODR=0x1<<9;
GPIOC_ODR=0x1<<15;
}
void B_LED_LIGHT(){
GPIOA_ODR=0x1<<4;
GPIOB_ODR=0x0<<9;
GPIOC_ODR=0x1<<15;
}
void C_LED_LIGHT(){
GPIOA_ODR=0x1<<4;
GPIOB_ODR=0x1<<9;
GPIOC_ODR=0x0<<15;
}
int main(){
int j=100;
RCC_APB2ENR |= (1<<3);
RCC_APB2ENR |= (1<<4);
RCC_APB2ENR |= (1<<2);
GPIOB_CRH&= 0xffffff0f;
GPIOB_CRH|=0x00000020;
GPIOC_CRH &= 0x0fffffff;
GPIOC_CRH|=0x30000000;
GPIOA_CRL &= 0xfff0ffff;
GPIOA_CRL|=0x00010000;
GPIOB_ODR |= (1<<9);
GPIOC_ODR |= (1<<15);
GPIOA_ODR |= (1<<4);
while(j){
B_LED_LIGHT();
Delay_ms(1000);
C_LED_LIGHT();
Delay_ms(1000);
A_LED_LIGHT();
Delay_ms(1000);
}
}
void SystemInit(){
}
5.点击魔法棒进行设置
生成.hex文件
6.编译且编译成功
7.连接接口和面包板
8.打开烧录软件
进行设置,选择生成的.hex文件.选择串口以及对电平进行设置
读取件信息,开始编程
9.烧录成功,点亮led
二,在实验一的基础上改用标准外设库点亮led
1.在STM32官网下载标准固件库
2.创建一个keil工程。选择STM32F103C8芯片
3.在文件夹中新建几个文件夹目录,用来存放文件
start中存放启动文件,核函数
library中存放库函数
user中存放主函数,用户使用的函数
4.在keil工程中添加三个组分别为start,library,user
5.点击三色盒子,将各文件夹中的文件都添加进来
6.创建main.c文件,进行代码实现
#include "stm32f10x.h"
void delay_s(void);
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef类型的结构体
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为通用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //选择要控制的GPIO引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚速率为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //调用库函数,初始化GPIO
while (1)
{
GPIO_Write(GPIOA, ~0x0001); //0000 0000 0000 0001
delay_s();
GPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010
delay_s();
GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100
delay_s();
}
}
void delay_s(void)
{
volatile int i=0,j=0,k=0;
for(i=1000;i>0;i--)
{
for(j=1000;j>0;j--)
{
for(k=6;k>0;k--);
}
}
}
7.点击魔法棒进行设置