基于寄存器实现LED流水灯
1、创建工程:
选择型号
创建main.c
2、编写代码:
#include "stm32f10x.h"
void SysTick_Handler(void) {
// 什么也不做,只是为了满足SysTick中断的要求
}
void delay_s(uint32_t s) {
// 配置SysTick定时器为1毫秒滴答
SysTick_Config(SystemCoreClock / 1000);
// 计算所需的滴答数
uint32_t ticks = s * 1000;
while (ticks) {
if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) {
// 如果SysTick倒计时到0
ticks--;
}
}
// 关闭SysTick定时器
SysTick->CTRL = 0;
}
int main(void) {
// 启用GPIOA、GPIOB和GPIOC时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN;
// 配置引脚为通用推挽输出
GPIOA->CRH |= GPIO_CRH_MODE10 ;
GPIOA->CRH &= ~GPIO_CRH_CNF10;
GPIOB->CRL |= GPIO_CRL_MODE5;
GPIOB->CRL &= ~GPIO_CRL_CNF5;
GPIOC->CRH |= GPIO_CRH_MODE13;
GPIOC->CRH &= ~GPIO_CRH_CNF13;
while (1) {
// 点亮A10引脚,同时熄灭 B5, PC13引脚
GPIOA->BSRR = GPIO_BSRR_BS10;
GPIOB->BSRR = GPIO_BSRR_BR5;
GPIOC->BSRR = GPIO_BSRR_BS13;
delay_s(1); // 延时一秒
// 点亮B5引脚,同时熄灭A10, PC13引脚
GPIOB->BSRR = GPIO_BSRR_BS5;
GPIOA->BSRR = GPIO_BSRR_BR10;
GPIOC->BSRR = GPIO_BSRR_BS13;
delay_s(1); // 延时一秒
// 点亮PC13引脚,同时熄灭A10, B5引脚
GPIOC->BSRR = GPIO_BSRR_BR13;
GPIOB->BSRR = GPIO_BSRR_BR5;
GPIOA->BSRR = GPIO_BSRR_BR10;
delay_s(1); // 延时一秒
}
return 0;
}
3、效果 :
基于标准库实现LED流水灯
1、创建项目:
先下载STM32F10的标准外设库
然后在工程目录下创建以下四个文件夹
复制以下文件到 Core文件
复制以下文件到Lib文件
复制以下文件到 User文件
在keil新建项目,目录选择User,并选择STM32F103C8,然后什么都不勾选直接OK
然后为每个Group添加文件
点击魔法棒中的C/C++
配置以下内容:
2、编写代码:
#include "stm32f10x.h"
// 定义LED连接的引脚
#define LED_A10 GPIO_Pin_10
#define LED_B5 GPIO_Pin_5
#define LED_C13 GPIO_Pin_13
void Delay(uint32_t nCount) {
for (uint32_t i = 0; i < nCount; i++) {
__NOP();
}
}
void GPIO_Init_LEDs(void) {
// 使能相应的GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
// 初始化A10引脚
GPIO_InitStruct.GPIO_Pin = LED_A10;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 初始化B5引脚
GPIO_InitStruct.GPIO_Pin = LED_B5;
GPIO_Init(GPIOB, &GPIO_InitStruct);
// 初始化C13引脚
GPIO_InitStruct.GPIO_Pin = LED_C13;
GPIO_Init(GPIOC, &GPIO_InitStruct);
}
int main(void) {
// 初始化系统时钟等设置
GPIO_Init_LEDs();
while (1) {
// 依次点亮LED灯
//亮A10
GPIO_SetBits(GPIOA, LED_A10);
GPIO_ResetBits(GPIOB,LED_B5);
GPIO_SetBits(GPIOC,LED_C13);
Delay(2000000);
//亮B5
GPIO_SetBits(GPIOB,LED_B5);
GPIO_ResetBits(GPIOA, LED_A10);
GPIO_SetBits(GPIOC,LED_C13);
Delay(2000000);
//亮C13
GPIO_ResetBits(GPIOB,LED_B5);
GPIO_ResetBits(GPIOA, LED_A10);
GPIO_ResetBits(GPIOC,LED_C13);
Delay(2000000);
}
}
编译也没报错
3、效果: