一、实验题目
以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只_(或更多)红绿蓝LED 搭建电路,使用GPIOA/GPIOB/GPIOC端口控制LED灯,轮流闪烁,间隔时长1秒。
1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;
2)用C语言寄存器方式编程实现,代码须有详细注解。
3)STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。请查阅最小版电路原理图和相关资料,将这个灯也用在流水灯中,重编新程序。
二、建立工程文件
本实验要求我们使用STM32F103C8T6,所以在建立工程时选择相对应的芯片。
完成建立工程。
添加启动代码,因为我们的芯片选择的是STMC8T6,所以我能的Flash容量大小是128K对应中容量,所以我们选择startup_stm32f10x_md.s并将改文件下载保存到工程目录下。
修改全局宏定义,点击魔术棒图标,在C/C++(AC6)处修改Define。
在Output处勾选Create HEX File。
在Target中勾选Use MicroLIB。
在Debug Setting里勾选Reset and Run。
创建文件led.c。
工程建立完毕。
三、实现代码
led.c
#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int *)0x40021018)//时钟控制地址
#define GPIOB_CRL (*(unsigned int *)0x40010C00)//PB端口低位控制地址
#define GPIOC_CRH (*(unsigned int *)0x40011004)//PC端口高位控制地址
#define GPIOA_CRL (*(unsigned int *)0x40010800)//PA端口低位控制地址
#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 D_LED_LIGHT(void);
void E_LED_LIGHT(void);
void Delay_ms( volatile unsigned int t) //延时函数
{
unsigned int i;
for (i=0;i<t;i++)
{
}
}
void A_LED_LIGHT(){
GPIOA_ODR=0x1<<4; //PA4高电平
GPIOB_ODR=0x0<<0; //PB0低电平
GPIOC_ODR=0x1<<15; //PC15高电平
}
void B_LED_LIGHT(){
GPIOA_ODR=0x0<<4; //PA4低电平
GPIOB_ODR=0x1<<0; //PB0低电平
GPIOC_ODR=0x1<<15; //PC15高电平
}
void C_LED_LIGHT(){
GPIOA_ODR=0x1<<4; //PA4高电平
GPIOB_ODR=0x1<<0; //PB0高电平
GPIOC_ODR=0x0<<15; //PC15低电平
}
void D_LED_LIGHT(){
GPIOA_ODR=0x1<<4;
GPIOB_ODR=0x1<<0;
GPIOC_ODR=0x1<<15; //全为高电平
}
void E_LED_LIGHT()
{
GPIOA_ODR=0x0<<4;
GPIOB_ODR=0x0<<0;
GPIOC_ODR=0x0<<15;//全为低电平
}
int main(){
// 开启时钟
RCC_APB2ENR |= (1<<2); // 开启 GPIOA 时钟
RCC_APB2ENR |= (1<<3); // 开启 GPIOB 时钟
RCC_APB2ENR |= (1<<4); // 开启 GPIOC 时钟
// 设置 GPIO 为推挽输出
GPIOB_CRL&= 0xfffffff0; //设置位 清零
GPIOB_CRL|= 0x00000002; //PB0推挽输出
GPIOC_CRH &= 0x0fffffff; //设置位 清零
GPIOC_CRH|= 0x30000000; //PC15推挽输出
GPIOA_CRL &= 0xfff0ffff; //设置位 清零
GPIOA_CRL|= 0x00010000; //PA4推挽输出
//初始化
GPIOB_ODR |= (1<<0);
GPIOC_ODR |= (1<<15);
GPIOA_ODR |= (1<<4);
while(1){
A_LED_LIGHT();
Delay_ms(1000000);
B_LED_LIGHT();
Delay_ms(1000000);
C_LED_LIGHT();
Delay_ms(1000000);
D_LED_LIGHT();
Delay_ms(1000000);
E_LED_LIGHT();
Delay_ms(1000000);
}
}
void SystemInit(){
}
四、连接电路
BOOT0为1,BOOT1为0